re PR rtl-optimization/57003 (gcc breaks -O2 optimization with Wine(64) - links/info...
authorUros Bizjak <ubizjak@gmail.com>
Thu, 9 Oct 2014 06:36:08 +0000 (08:36 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 9 Oct 2014 06:36:08 +0000 (08:36 +0200)
PR rtl-optimization/57003
* regcprop.c (copyprop_hardreg_forward_1): If ksvd.ignore_set_reg,
also check CALL_INSN_FUNCTION_USAGE for clobbers again after
killing regs_invalidated_by_call.

From-SVN: r216026

gcc/ChangeLog
gcc/regcprop.c

index 7884a8a4c54c858f78561ddd9594eb58af87035b..85bc3619af5b2bd773f64be4ee019b40b0c640bf 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-09  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR rtl-optimization/57003
+       * regcprop.c (copyprop_hardreg_forward_1): If ksvd.ignore_set_reg,
+       also check CALL_INSN_FUNCTION_USAGE for clobbers again after
+       killing regs_invalidated_by_call.
+
 2014-10-08  Teresa Johnson  <tejohnson@google.com>
 
        PR bootstrap/63432.
index 3297721df3919842986f51c44be3e910eede3996..01135dea1791e3b3c2120a8e70db03bba4ade93e 100644 (file)
@@ -1029,7 +1029,17 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
             but instead among CLOBBERs on the CALL_INSN, we could wrongly
             assume the value in it is still live.  */
          if (ksvd.ignore_set_reg)
-           note_stores (PATTERN (insn), kill_clobbered_value, vd);
+           {
+             note_stores (PATTERN (insn), kill_clobbered_value, vd);
+             for (exp = CALL_INSN_FUNCTION_USAGE (insn);
+                  exp;
+                  exp = XEXP (exp, 1))
+               {
+                 rtx x = XEXP (exp, 0);
+                 if (GET_CODE (x) == CLOBBER)
+                   kill_value (SET_DEST (x), vd);
+               }
+           }
        }
 
       /* Notice stores.  */