[Bug middle-end/40525] if conversion (in dead_or_predicable) fails for targets with limited conditional execution support

steven at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Thu Jun 25 08:18:00 GMT 2009



------- Comment #5 from steven at gcc dot gnu dot org  2009-06-25 08:17 -------
Tentative patch:

Index: ifcvt.c
===================================================================
--- ifcvt.c     (revision 148927)
+++ ifcvt.c     (working copy)
@@ -3780,6 +3780,8 @@
                    basic_block other_bb, basic_block new_dest, int reversep)
 {
   rtx head, end, jump, earliest = NULL_RTX, old_dest, new_label = NULL_RTX;
+  /* Number of pending changes.  */
+  int n_validated_changes = 0;

   jump = BB_END (test_bb);

@@ -3849,13 +3851,15 @@
        }

       if (! cond_exec_process_insns ((ce_if_block_t *)0, head, end, cond,
-                                    prob_val, 0))
-       goto cancel;
-
+                                    prob_val, 0)
+         || ! verify_changes (0))
+       cancel_changes (0);
+      n_validated_changes = num_validated_changes ();
       earliest = jump;
     }
-  else
 #endif
+  /* Try the NCE path if the CE path did not result in any changes.  */
+  if (n_validated_changes > 0)
     {
       /* In the non-conditional execution case, we have to verify that there
         are no trapping operations, no calls, no references to memory, and
@@ -3995,8 +3999,10 @@
        goto cancel;
     }

-  if (! apply_change_group ())
-    return FALSE;
+  if (verify_changes (n_validated_changes))
+    confirm_change_group ();
+  else
+    goto cancel;

   if (other_bb != new_dest)
     {


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40525



More information about the Gcc-bugs mailing list