--- 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