Commit 3a106211 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/86539 (OpenMP wrong-code with taskloop and references)

	PR middle-end/86539
	* gimplify.c (gimplify_omp_for): Ensure taskloop firstprivatized init
	and cond temporaries don't have reference type if iterator has
	pointer type.  For init use &for_pre_body instead of pre_p if
	for_pre_body is non-empty.

	* testsuite/libgomp.c++/pr86539.C: New test.

From-SVN: r262776
parent 980f94b7
2018-07-17 Jakub Jelinek <jakub@redhat.com>
PR middle-end/86539
* gimplify.c (gimplify_omp_for): Ensure taskloop firstprivatized init
and cond temporaries don't have reference type if iterator has
pointer type. For init use &for_pre_body instead of pre_p if
for_pre_body is non-empty.
2018-07-16 Segher Boessenkool <segher@kernel.crashing.org> 2018-07-16 Segher Boessenkool <segher@kernel.crashing.org>
* config/rs6000/rs6000.md (trunc<mode>sf2): Expand truncates of * config/rs6000/rs6000.md (trunc<mode>sf2): Expand truncates of
......
...@@ -9811,9 +9811,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) ...@@ -9811,9 +9811,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i); t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
if (!is_gimple_constant (TREE_OPERAND (t, 1))) if (!is_gimple_constant (TREE_OPERAND (t, 1)))
{ {
tree type = TREE_TYPE (TREE_OPERAND (t, 0));
TREE_OPERAND (t, 1) TREE_OPERAND (t, 1)
= get_initialized_tmp_var (TREE_OPERAND (t, 1), = get_initialized_tmp_var (TREE_OPERAND (t, 1),
pre_p, NULL, false); gimple_seq_empty_p (for_pre_body)
? pre_p : &for_pre_body, NULL,
false);
/* Reference to pointer conversion is considered useless,
but is significant for firstprivate clause. Force it
here. */
if (TREE_CODE (type) == POINTER_TYPE
&& (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 1)))
== REFERENCE_TYPE))
{
tree v = create_tmp_var (TYPE_MAIN_VARIANT (type));
tree m = build2 (INIT_EXPR, TREE_TYPE (v), v,
TREE_OPERAND (t, 1));
gimplify_and_add (m, gimple_seq_empty_p (for_pre_body)
? pre_p : &for_pre_body);
TREE_OPERAND (t, 1) = v;
}
tree c = build_omp_clause (input_location, tree c = build_omp_clause (input_location,
OMP_CLAUSE_FIRSTPRIVATE); OMP_CLAUSE_FIRSTPRIVATE);
OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1); OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1);
...@@ -9825,11 +9842,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) ...@@ -9825,11 +9842,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i); t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
if (!is_gimple_constant (TREE_OPERAND (t, 1))) if (!is_gimple_constant (TREE_OPERAND (t, 1)))
{ {
tree type = TREE_TYPE (TREE_OPERAND (t, 0));
TREE_OPERAND (t, 1) TREE_OPERAND (t, 1)
= get_initialized_tmp_var (TREE_OPERAND (t, 1), = get_initialized_tmp_var (TREE_OPERAND (t, 1),
gimple_seq_empty_p (for_pre_body) gimple_seq_empty_p (for_pre_body)
? pre_p : &for_pre_body, NULL, ? pre_p : &for_pre_body, NULL,
false); false);
/* Reference to pointer conversion is considered useless,
but is significant for firstprivate clause. Force it
here. */
if (TREE_CODE (type) == POINTER_TYPE
&& (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 1)))
== REFERENCE_TYPE))
{
tree v = create_tmp_var (TYPE_MAIN_VARIANT (type));
tree m = build2 (INIT_EXPR, TREE_TYPE (v), v,
TREE_OPERAND (t, 1));
gimplify_and_add (m, gimple_seq_empty_p (for_pre_body)
? pre_p : &for_pre_body);
TREE_OPERAND (t, 1) = v;
}
tree c = build_omp_clause (input_location, tree c = build_omp_clause (input_location,
OMP_CLAUSE_FIRSTPRIVATE); OMP_CLAUSE_FIRSTPRIVATE);
OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1); OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1);
......
2018-07-17 Jakub Jelinek <jakub@redhat.com>
PR middle-end/86539
* testsuite/libgomp.c++/pr86539.C: New test.
2018-07-11 Jakub Jelinek <jakub@redhat.com> 2018-07-11 Jakub Jelinek <jakub@redhat.com>
PR c++/86443 PR c++/86443
......
// PR middle-end/86539
int a[384];
__attribute__((noipa)) void
foo (int &b, int &c)
{
#pragma omp taskloop shared (a) collapse(3)
for (int i = 0; i < 1; i++)
for (int *p = &b; p < &c; p++)
for (int j = 0; j < 1; j++)
if (p < &a[128] || p >= &a[256])
__builtin_abort ();
else
p[0]++;
}
int
main ()
{
#pragma omp parallel
#pragma omp single
foo (a[128], a[256]);
for (int i = 0; i < 384; i++)
if (a[i] != (i >= 128 && i < 256))
__builtin_abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment