aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-expand.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/omp-expand.cc')
-rw-r--r--gcc/omp-expand.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc
index 940454b..1ccee29 100644
--- a/gcc/omp-expand.cc
+++ b/gcc/omp-expand.cc
@@ -3674,7 +3674,7 @@ expand_omp_ordered_source_sink (struct omp_region *region,
static basic_block
expand_omp_for_ordered_loops (struct omp_for_data *fd, tree *counts,
basic_block cont_bb, basic_block body_bb,
- bool ordered_lastprivate)
+ basic_block l0_bb, bool ordered_lastprivate)
{
if (fd->ordered == fd->collapse)
return cont_bb;
@@ -3783,7 +3783,7 @@ expand_omp_for_ordered_loops (struct omp_for_data *fd, tree *counts,
class loop *loop = alloc_loop ();
loop->header = new_header;
loop->latch = e2->src;
- add_loop (loop, body_bb->loop_father);
+ add_loop (loop, l0_bb->loop_father);
}
}
@@ -4481,9 +4481,15 @@ expand_omp_for_generic (struct omp_region *region,
}
if (i < fd->ordered)
{
+ if (entry_bb->loop_father != l0_bb->loop_father)
+ {
+ remove_bb_from_loops (l0_bb);
+ add_bb_to_loop (l0_bb, entry_bb->loop_father);
+ gcc_assert (single_succ (l0_bb) == l1_bb);
+ }
cont_bb
= create_empty_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
- add_bb_to_loop (cont_bb, l1_bb->loop_father);
+ add_bb_to_loop (cont_bb, l0_bb->loop_father);
gimple_stmt_iterator gsi = gsi_after_labels (cont_bb);
gimple *g = gimple_build_omp_continue (fd->loop.v, fd->loop.v);
gsi_insert_before (&gsi, g, GSI_SAME_STMT);
@@ -4495,7 +4501,7 @@ expand_omp_for_generic (struct omp_region *region,
}
expand_omp_ordered_source_sink (region, fd, counts, cont_bb);
cont_bb = expand_omp_for_ordered_loops (fd, counts, cont_bb, l1_bb,
- ordered_lastprivate);
+ l0_bb, ordered_lastprivate);
if (counts[fd->collapse - 1])
{
gcc_assert (fd->collapse == 1);