aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-threadedge.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2013-10-23 07:54:48 -0600
committerJeff Law <law@gcc.gnu.org>2013-10-23 07:54:48 -0600
commitb1149e84d407a2ce4622a113b5d408475fc9e7a7 (patch)
treef3147baa998ae0dfcc8896df58168d9473d4f4c6 /gcc/tree-ssa-threadedge.c
parentc9edbc5fa1c3812f834a625afae0b09c652dc1fa (diff)
downloadgcc-b1149e84d407a2ce4622a113b5d408475fc9e7a7.zip
gcc-b1149e84d407a2ce4622a113b5d408475fc9e7a7.tar.gz
gcc-b1149e84d407a2ce4622a113b5d408475fc9e7a7.tar.bz2
tree-ssa-threadedge.c (thread_across_edge): Do not allow threading through joiner blocks with abnormal outgoing edges.
* tree-ssa-threadedge.c (thread_across_edge): Do not allow threading through joiner blocks with abnormal outgoing edges. * tree-ssa-threadupdate.c (thread_block_1): Renamed from thread_block. Add parameter JOINERS, to allow/disallow threading through joiner blocks. (thread_block): New. Call thread_block_1. (mark_threaded_blocks): Remove code to filter out certain cases of threading through joiner blocks. (thread_through_all_blocks): Document how we can have a dangling edge AUX field and clear it. From-SVN: r203975
Diffstat (limited to 'gcc/tree-ssa-threadedge.c')
-rw-r--r--gcc/tree-ssa-threadedge.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index bbc4f9b..810908b 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -1040,6 +1040,16 @@ thread_across_edge (gimple dummy_cond,
edge_iterator ei;
bool found;
+ /* If E->dest has abnormal outgoing edges, then there's no guarantee
+ we can safely redirect any of the edges. Just punt those cases. */
+ FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
+ if (taken_edge->flags & EDGE_ABNORMAL)
+ {
+ remove_temporary_equivalences (stack);
+ BITMAP_FREE (visited);
+ return;
+ }
+
/* Look at each successor of E->dest to see if we can thread through it. */
FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
{