Do not convert a conditional jump into conditional execution (and remove 
the jump as a consequence) if the jump has side effects.

        gcc/
        * ifcvt.c (dead_or_predicable) [!IFCVT_MODIFY_TESTS]: Bail out 
        if `!onlyjump_p'.
---
 gcc/ifcvt.c |    6 ++++++
 1 file changed, 6 insertions(+)

gcc-ifcvt-dead-or-predicable-ce-only-jump.diff
Index: gcc/gcc/ifcvt.c
===================================================================
--- gcc.orig/gcc/ifcvt.c
+++ gcc/gcc/ifcvt.c
@@ -5127,6 +5127,11 @@ dead_or_predicable (basic_block test_bb,
 
       rtx cond;
 
+      /* If the conditional jump is more than just a conditional jump,
+        then we cannot do conditional execution conversion on this block.  */
+      if (!onlyjump_p (jump))
+       goto nce;
+
       cond = cond_exec_get_condition (jump);
       if (! cond)
        return FALSE;
@@ -5154,6 +5159,7 @@ dead_or_predicable (basic_block test_bb,
 
       earliest = jump;
     }
+ nce:
 #endif
 
   /* If we allocated new pseudos (e.g. in the conditional move

Reply via email to