openmp: Fix ICE with broken doacross loop [PR98205]

If the loop body doesn't ever continue, we don't have a bb to insert the
updates.  Fixed by not adding them at all in that case.

2020-12-10  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/98205
	* omp-expand.c (expand_omp_for_generic): Fix up broken_loop handling.

	* c-c++-common/gomp/doacross-4.c: New test.
This commit is contained in:
Jakub Jelinek 2020-12-10 11:07:07 +01:00
parent 154e9b831b
commit a2a17ae7d8
2 changed files with 42 additions and 7 deletions

View File

@ -4304,13 +4304,18 @@ expand_omp_for_generic (struct omp_region *region,
gsi = gsi_last_bb (l0_bb);
expand_omp_build_assign (&gsi, counts[fd->collapse - 1],
istart0, true);
gsi = gsi_last_bb (cont_bb);
t = fold_build2 (PLUS_EXPR, fd->iter_type, counts[fd->collapse - 1],
build_int_cst (fd->iter_type, 1));
expand_omp_build_assign (&gsi, counts[fd->collapse - 1], t);
tree aref = build4 (ARRAY_REF, fd->iter_type, counts[fd->ordered],
size_zero_node, NULL_TREE, NULL_TREE);
expand_omp_build_assign (&gsi, aref, counts[fd->collapse - 1]);
if (cont_bb)
{
gsi = gsi_last_bb (cont_bb);
t = fold_build2 (PLUS_EXPR, fd->iter_type,
counts[fd->collapse - 1],
build_int_cst (fd->iter_type, 1));
expand_omp_build_assign (&gsi, counts[fd->collapse - 1], t);
tree aref = build4 (ARRAY_REF, fd->iter_type,
counts[fd->ordered], size_zero_node,
NULL_TREE, NULL_TREE);
expand_omp_build_assign (&gsi, aref, counts[fd->collapse - 1]);
}
t = counts[fd->collapse - 1];
}
else if (fd->collapse > 1)

View File

@ -0,0 +1,30 @@
/* PR middle-end/98205 */
void baz (int) __attribute__((noreturn));
void
foo (int n)
{
int i;
#pragma omp for ordered(1)
for (i = 0; i < 8; i += n)
{
#pragma omp ordered depend(source)
#pragma omp ordered depend(sink: i - 2)
baz (i);
}
}
void
bar (int n)
{
int i, j;
#pragma omp for collapse(2) ordered(2)
for (i = 0; i < 8; i += n)
for (j = 0; j < 8; j += n)
{
#pragma omp ordered depend(source)
#pragma omp ordered depend(sink: i - 2, j + 2)
baz (i);
}
}