aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgrtl.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-12-04 15:21:58 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2002-12-04 14:21:58 +0000
commita3716585f62b7a661635d13c451a778b6bae9c7f (patch)
tree27eb37067662ddfbcb09ebb5d889660914bb553c /gcc/cfgrtl.c
parent8c048a52a4276abc22570de56d52de74033b7ecc (diff)
downloadgcc-a3716585f62b7a661635d13c451a778b6bae9c7f.zip
gcc-a3716585f62b7a661635d13c451a778b6bae9c7f.tar.gz
gcc-a3716585f62b7a661635d13c451a778b6bae9c7f.tar.bz2
cfgrtl.c (force_nonfallthru_and_redirect): Allow abnormal edge to be forced into nonfallthru.
* cfgrtl.c (force_nonfallthru_and_redirect): Allow abnormal edge to be forced into nonfallthru. From-SVN: r59816
Diffstat (limited to 'gcc/cfgrtl.c')
-rw-r--r--gcc/cfgrtl.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index a721239..84e62c6 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -933,12 +933,23 @@ force_nonfallthru_and_redirect (e, target)
edge e;
basic_block target;
{
- basic_block jump_block, new_bb = NULL;
+ basic_block jump_block, new_bb = NULL, src = e->src;
rtx note;
edge new_edge;
+ int abnormal_edge_flags = 0;
if (e->flags & EDGE_ABNORMAL)
- abort ();
+ {
+ /* Irritating special case - fallthru edge to the same block as abnormal
+ edge.
+ We can't redirect abnormal edge, but we still can split the fallthru
+ one and create separate abnormal edge to original destination.
+ This allows bb-reorder to make such edge non-fallthru. */
+ if (e->dest != target)
+ abort ();
+ abnormal_edge_flags = e->flags & ~(EDGE_FALLTHRU | EDGE_CAN_FALLTHRU);
+ e->flags &= EDGE_FALLTHRU | EDGE_CAN_FALLTHRU;
+ }
else if (!(e->flags & EDGE_FALLTHRU))
abort ();
else if (e->src == ENTRY_BLOCK_PTR)
@@ -962,7 +973,7 @@ force_nonfallthru_and_redirect (e, target)
make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
}
- if (e->src->succ->succ_next)
+ if (e->src->succ->succ_next || abnormal_edge_flags)
{
/* Create the new structures. */
@@ -1029,6 +1040,9 @@ force_nonfallthru_and_redirect (e, target)
emit_barrier_after (jump_block->end);
redirect_edge_succ_nodup (e, target);
+ if (abnormal_edge_flags)
+ make_edge (src, target, abnormal_edge_flags);
+
return new_bb;
}