diff options
author | Richard Henderson <rth@cygnus.com> | 2000-05-31 17:03:36 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-05-31 17:03:36 -0700 |
commit | 18153f6ceb9010d8db0caca298ac6b5722561aa9 (patch) | |
tree | 857b75cf5f3db288fe081b33b66a74bd6672fee7 /gcc | |
parent | e0fa93b3ca30abe9423a3f70cc172c21f2d2fdf0 (diff) | |
download | gcc-18153f6ceb9010d8db0caca298ac6b5722561aa9.zip gcc-18153f6ceb9010d8db0caca298ac6b5722561aa9.tar.gz gcc-18153f6ceb9010d8db0caca298ac6b5722561aa9.tar.bz2 |
ifcvt.c (merge_if_block): Be prepared for JOIN to have no remaining edges.
* ifcvt.c (merge_if_block): Be prepared for JOIN to have no
remaining edges.
(find_if_block): Allow THEN with no outgoing edges.
* flow.c (merge_blocks_nomove): Remove a barrier not following
a jump as well.
From-SVN: r34317
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/ifcvt.c | 30 |
2 files changed, 26 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8723fce..52f1938 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -4,6 +4,9 @@ 2000-05-31 Richard Henderson <rth@cygnus.com> + * ifcvt.c (merge_if_block): Be prepared for JOIN to have no + remaining edges. + (find_if_block): Allow THEN with no outgoing edges. * flow.c (merge_blocks_nomove): Remove a barrier not following a jump as well. diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 5b89bc4..eee7209 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -1356,8 +1356,10 @@ merge_if_block (test_bb, then_bb, else_bb, join_bb) /* The JOIN block may have had quite a number of other predecessors too. Since we've already merged the TEST, THEN and ELSE blocks, we should have only one remaining edge from our if-then-else diamond. If there - is more than one remaining edge, it must come from elsewhere. */ - else if (join_bb->pred->pred_next == NULL) + is more than one remaining edge, it must come from elsewhere. There + may be zero incoming edges if the THEN block didn't actually join + back up (as with a call to abort). */ + else if (join_bb->pred == NULL || join_bb->pred->pred_next == NULL) { /* We can merge the JOIN. */ if (combo_bb->global_live_at_end) @@ -1459,15 +1461,29 @@ find_if_block (test_bb, then_edge, else_edge) if (then_bb->pred->pred_next != NULL_EDGE) return FALSE; - /* The THEN block of an IF-THEN combo must have exactly one successor. */ - if (then_succ == NULL_EDGE - || then_succ->succ_next != NULL_EDGE - || (then_succ->flags & EDGE_COMPLEX)) + /* The THEN block of an IF-THEN combo must have zero or one successors. */ + if (then_succ != NULL_EDGE + && (then_succ->succ_next != NULL_EDGE + || (then_succ->flags & EDGE_COMPLEX))) return FALSE; + /* If the THEN block has no successors, conditional execution can still + make a conditional call. Don't do this unless the ELSE block has + only one incoming edge -- the CFG manipulation is too ugly otherwise. */ + if (then_succ == NULL) + { + if (else_bb->pred->pred_next == NULL_EDGE) + { + join_bb = else_bb; + else_bb = NULL_BLOCK; + } + else + return FALSE; + } + /* If the THEN block's successor is the other edge out of the TEST block, then we have an IF-THEN combo without an ELSE. */ - if (then_succ->dest == else_bb) + else if (then_succ->dest == else_bb) { join_bb = else_bb; else_bb = NULL_BLOCK; |