summaryrefslogtreecommitdiff
path: root/gcc/graphite-scop-detection.c
diff options
context:
space:
mode:
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>2010-02-23 12:59:48 +0000
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>2010-02-23 12:59:48 +0000
commitbbf92068625787d3004679dbec60fb59666490d1 (patch)
tree64759a9b3771aac776fa4cce16b1cffeb41dc9a1 /gcc/graphite-scop-detection.c
parent66bb96d4fa0526a800aea5cbb4fd830ea06668fd (diff)
downloadgcc-bbf92068625787d3004679dbec60fb59666490d1.tar.gz
Fix PR43083: Do not handle regions ending with multiple edges on the exit BB.
2010-02-22 Sebastian Pop <sebastian.pop@amd.com> PR middle-end/43083 * graphite-scop-detection.c (create_single_exit_edge): Move the call to find_single_exit_edge to.... (create_sese_edges): ...here. Don't handle multiple edges exiting the function. (build_graphite_scops): Don't handle multiple edges exiting the function. * gcc.dg/graphite/pr43083.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156997 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/graphite-scop-detection.c')
-rw-r--r--gcc/graphite-scop-detection.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index d89f0f81537..5c1dbbd2981 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -935,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)
@@ -1031,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);
@@ -1057,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? */
@@ -1323,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);