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
This commit is contained in:
parent
980f94b75b
commit
3a10621137
@ -1,3 +1,11 @@
|
||||
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>
|
||||
|
||||
* config/rs6000/rs6000.md (trunc<mode>sf2): Expand truncates of
|
||||
|
@ -9811,9 +9811,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
|
||||
t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i);
|
||||
if (!is_gimple_constant (TREE_OPERAND (t, 1)))
|
||||
{
|
||||
tree type = TREE_TYPE (TREE_OPERAND (t, 0));
|
||||
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,
|
||||
OMP_CLAUSE_FIRSTPRIVATE);
|
||||
OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1);
|
||||
@ -9825,11 +9842,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
|
||||
t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i);
|
||||
if (!is_gimple_constant (TREE_OPERAND (t, 1)))
|
||||
{
|
||||
tree type = TREE_TYPE (TREE_OPERAND (t, 0));
|
||||
TREE_OPERAND (t, 1)
|
||||
= get_initialized_tmp_var (TREE_OPERAND (t, 1),
|
||||
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,
|
||||
OMP_CLAUSE_FIRSTPRIVATE);
|
||||
OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1);
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR c++/86443
|
||||
|
28
libgomp/testsuite/libgomp.c++/pr86539.C
Normal file
28
libgomp/testsuite/libgomp.c++/pr86539.C
Normal file
@ -0,0 +1,28 @@
|
||||
// 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user