diff options
Diffstat (limited to 'gcc/omp-expand.cc')
-rw-r--r-- | gcc/omp-expand.cc | 14 |
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); |