aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-low.c
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2015-07-31 06:26:44 +0000
committerTom de Vries <vries@gcc.gnu.org>2015-07-31 06:26:44 +0000
commite67d7a1ea15cb266edf4a9ae2315eae6b1e8003a (patch)
treed4527665684a78ac3e0d04736f8b19c537ed23a7 /gcc/omp-low.c
parent048e62c34ae4af6d84c2a95649caf6ca584ab71d (diff)
downloadgcc-e67d7a1ea15cb266edf4a9ae2315eae6b1e8003a.zip
gcc-e67d7a1ea15cb266edf4a9ae2315eae6b1e8003a.tar.gz
gcc-e67d7a1ea15cb266edf4a9ae2315eae6b1e8003a.tar.bz2
Don't cancel loop tree in parloops
2015-07-31 Tom de Vries <tom@codesourcery.com> PR tree-optimization/66846 * omp-low.c (expand_omp_taskreg) [ENABLE_CHECKING]: Call verify_loop_structure for child_cfun if !LOOPS_NEED_FIXUP. (expand_omp_target) [ENABLE_CHECKING]: Same. (execute_expand_omp) [ENABLE_CHECKING]: Call verify_loop_structure for cfun if !LOOPS_NEED_FIXUP. (expand_omp_for_static_nochunk): Handle simple latch bb. Handle case that omp_for already has its own loop struct. * tree-parloops.c (create_phi_for_local_result) (create_call_for_reduction): Handle simple latch bb. (create_parallel_loop): Add simple latch bb to preserve LOOPS_HAVE_SIMPLE_LATCHES. Record new exit. Handle simple latch bb. (gen_parallel_loop): Remove call to cancel_loop_tree. (parallelize_loops): Skip loops that are inner loops of parallelized loops. (pass_parallelize_loops::execute) [ENABLE_CHECKING]: Call verify_loop_structure. From-SVN: r226427
Diffstat (limited to 'gcc/omp-low.c')
-rw-r--r--gcc/omp-low.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 3135606..0f5c0f1 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -5604,6 +5604,10 @@ expand_omp_taskreg (struct omp_region *region)
}
if (gimple_in_ssa_p (cfun))
update_ssa (TODO_update_ssa);
+#ifdef ENABLE_CHECKING
+ if (!loops_state_satisfies_p (LOOPS_NEED_FIXUP))
+ verify_loop_structure ();
+#endif
pop_cfun ();
}
@@ -6535,7 +6539,8 @@ expand_omp_for_static_nochunk (struct omp_region *region,
body_bb = single_succ (seq_start_bb);
if (!broken_loop)
{
- gcc_assert (BRANCH_EDGE (cont_bb)->dest == body_bb);
+ gcc_assert (BRANCH_EDGE (cont_bb)->dest == body_bb
+ || single_succ (BRANCH_EDGE (cont_bb)->dest) == body_bb);
gcc_assert (EDGE_COUNT (cont_bb->succs) == 2);
}
exit_bb = region->exit;
@@ -6818,6 +6823,11 @@ expand_omp_for_static_nochunk (struct omp_region *region,
if (!broken_loop)
{
ep = find_edge (cont_bb, body_bb);
+ if (ep == NULL)
+ {
+ ep = BRANCH_EDGE (cont_bb);
+ gcc_assert (single_succ (ep->dest) == body_bb);
+ }
if (gimple_omp_for_combined_p (fd->for_stmt))
{
remove_edge (ep);
@@ -6843,9 +6853,19 @@ expand_omp_for_static_nochunk (struct omp_region *region,
set_immediate_dominator (CDI_DOMINATORS, fin_bb,
recompute_dominator (CDI_DOMINATORS, fin_bb));
+ struct loop *loop = body_bb->loop_father;
+ if (loop != entry_bb->loop_father)
+ {
+ gcc_assert (loop->header == body_bb);
+ gcc_assert (broken_loop
+ || loop->latch == region->cont
+ || single_pred (loop->latch) == region->cont);
+ return;
+ }
+
if (!broken_loop && !gimple_omp_for_combined_p (fd->for_stmt))
{
- struct loop *loop = alloc_loop ();
+ loop = alloc_loop ();
loop->header = body_bb;
if (collapse_bb == NULL)
loop->latch = cont_bb;
@@ -8984,6 +9004,10 @@ expand_omp_target (struct omp_region *region)
if (changed)
cleanup_tree_cfg ();
}
+#ifdef ENABLE_CHECKING
+ if (!loops_state_satisfies_p (LOOPS_NEED_FIXUP))
+ verify_loop_structure ();
+#endif
pop_cfun ();
}
@@ -9492,6 +9516,10 @@ execute_expand_omp (void)
expand_omp (root_omp_region);
+#ifdef ENABLE_CHECKING
+ if (!loops_state_satisfies_p (LOOPS_NEED_FIXUP))
+ verify_loop_structure ();
+#endif
cleanup_tree_cfg ();
free_omp_regions ();