summaryrefslogtreecommitdiff
path: root/gcc/graphite-scop-detection.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r--gcc/graphite-scop-detection.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index ddd1121a58d..36a521578cb 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -1,5 +1,5 @@
/* Detection of Static Control Parts (SCoP) for Graphite.
- Copyright (C) 2009 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
Contributed by Sebastian Pop <sebastian.pop@amd.com> and
Tobias Grosser <grosser@fim.uni-passau.de>.
@@ -225,6 +225,7 @@ graphite_can_represent_scev (tree scev, int outermost_loop)
&& !CONVERT_EXPR_CODE_P (TREE_CODE (TREE_OPERAND (scev, 1)))
&& !(chrec_contains_symbols (TREE_OPERAND (scev, 0))
&& chrec_contains_symbols (TREE_OPERAND (scev, 1)))
+ && graphite_can_represent_init (scev)
&& graphite_can_represent_scev (TREE_OPERAND (scev, 0), outermost_loop)
&& graphite_can_represent_scev (TREE_OPERAND (scev, 1), outermost_loop);
@@ -934,9 +935,6 @@ create_single_exit_edge (sd_region *region)
edge forwarder = NULL;
basic_block exit;
- if (find_single_exit_edge (region))
- return;
-
/* We create a forwarder bb (5) for all edges leaving this region
(3->5, 4->5). All other edges leading to the same bb, are moved
to a new bb (6). If these edges where part of another region (2->5)
@@ -1030,7 +1028,10 @@ create_sese_edges (VEC (sd_region, heap) *regions)
mark_exit_edges (regions);
for (i = 0; VEC_iterate (sd_region, regions, i, s); i++)
- create_single_exit_edge (s);
+ /* Don't handle multiple edges exiting the function. */
+ if (!find_single_exit_edge (s)
+ && s->exit != EXIT_BLOCK_PTR)
+ create_single_exit_edge (s);
unmark_exit_edges (regions);
@@ -1056,7 +1057,12 @@ build_graphite_scops (VEC (sd_region, heap) *regions,
{
edge entry = find_single_entry_edge (s);
edge exit = find_single_exit_edge (s);
- scop_p scop = new_scop (new_sese (entry, exit));
+ scop_p scop;
+
+ if (!exit)
+ continue;
+
+ scop = new_scop (new_sese (entry, exit));
VEC_safe_push (scop_p, heap, *scops, scop);
/* Are there overlapping SCoPs? */
@@ -1297,7 +1303,7 @@ canonicalize_loop_closed_ssa_form (void)
loop_p loop;
#ifdef ENABLE_CHECKING
- verify_loop_closed_ssa ();
+ verify_loop_closed_ssa (true);
#endif
FOR_EACH_LOOP (li, loop, 0)
@@ -1307,7 +1313,7 @@ canonicalize_loop_closed_ssa_form (void)
update_ssa (TODO_update_ssa);
#ifdef ENABLE_CHECKING
- verify_loop_closed_ssa ();
+ verify_loop_closed_ssa (true);
#endif
}
@@ -1322,7 +1328,7 @@ build_scops (VEC (scop_p, heap) **scops)
canonicalize_loop_closed_ssa_form ();
build_scops_1 (single_succ (ENTRY_BLOCK_PTR), ENTRY_BLOCK_PTR->loop_father,
- &regions, loop);
+ &regions, loop);
create_sese_edges (regions);
build_graphite_scops (regions, scops);