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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2013-05-10
          Component|tree-optimization           |middle-end
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
   Target Milestone|---                         |4.9.0
            Summary|ICE verify_ssa failied      |[4.9 Regression] ICE
                   |                            |verify_ssa failied
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  This is because GIMPLE_RESX does not have virtual operands and thus
there doesn't need to be a PHI node to merge the virtual operand chain into
the successor we move the clobber to.

GIMPLE_RETURNs now always have a virtual use to ease updating SSA form.

Possible fix that disables the transform in these cases:

Index: gcc/tree-eh.c
===================================================================
--- gcc/tree-eh.c       (revision 198768)
+++ gcc/tree-eh.c       (working copy)
@@ -3360,6 +3360,11 @@ sink_clobbers (basic_block bb)
        }
     }

+  /* ???  If we have multiple predecessors but no virtual PHI we cannot
+     easily update virtual SSA form.  */
+  if (!vphi && !single_pred_p (succbb))
+    return 0;
+
   dgsi = gsi_after_labels (succbb);
   gsi = gsi_last_bb (bb);
   for (gsi_prev (&gsi); !gsi_end_p (gsi); gsi_prev (&gsi))

thus not sink the clobber.

Another possibility is to remove such clobbers instead (if the block is
reachable from elsewhere we may increase the objects lifetime by the
sinking).

Reply via email to