aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-05-31 17:03:36 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-05-31 17:03:36 -0700
commit18153f6ceb9010d8db0caca298ac6b5722561aa9 (patch)
tree857b75cf5f3db288fe081b33b66a74bd6672fee7 /gcc
parente0fa93b3ca30abe9423a3f70cc172c21f2d2fdf0 (diff)
downloadgcc-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/ChangeLog3
-rw-r--r--gcc/ifcvt.c30
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;