From: Jan Hubicka Date: Wed, 4 Dec 2002 14:21:58 +0000 (+0100) Subject: cfgrtl.c (force_nonfallthru_and_redirect): Allow abnormal edge to be forced into... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a3716585f62b7a661635d13c451a778b6bae9c7f;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88cf1472eab..4667a64cd67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Dec 4 15:20:54 CET 2002 Jan Hubicka + + * cfgrtl.c (force_nonfallthru_and_redirect): Allow abnormal edge + to be forced into nonfallthru. + 2002-12-03 Jason Thorpe * config/t-netbsd (USER_H): Set to $(EXTRA_HEADERS). diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index a72123911f9..84e62c6850e 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; }