Handle copy cycles in pass_cprop_hardreg
authorTom de Vries <tom@codesourcery.com>
Fri, 17 Oct 2014 06:36:35 +0000 (06:36 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Fri, 17 Oct 2014 06:36:35 +0000 (06:36 +0000)
2014-10-17  Tom de Vries  <tom@codesourcery.com>

PR rtl-optimization/61605
* regcprop.c (copyprop_hardreg_forward_1): Add copy_p and noop_p.  Don't
notice stores for noops.  Don't regard noops as copies.

From-SVN: r216364

gcc/ChangeLog
gcc/regcprop.c

index 6b6f696e6872edf028fc94150f1657abb5e1cebc..af302053b98699d09b1d6b40cb52a85573e86a4b 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-17  Tom de Vries  <tom@codesourcery.com>
+
+       PR rtl-optimization/61605
+       * regcprop.c (copyprop_hardreg_forward_1): Add copy_p and noop_p.  Don't
+       notice stores for noops.  Don't regard noops as copies.
+
 2014-10-17  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/cpuid.h (__cpuid): Remove definitions that handle %ebx
index 7035a84a6496eca95d5a01e803b85845cb77b875..015366b34d55e4cbacb0554d8fc9ceb7626b49d7 100644 (file)
@@ -1047,12 +1047,21 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
            }
        }
 
-      /* Notice stores.  */
-      note_stores (PATTERN (insn), kill_set_value, &ksvd);
+      bool copy_p = (set
+                    && REG_P (SET_DEST (set))
+                    && REG_P (SET_SRC (set)));
+      bool noop_p = (copy_p
+                    && rtx_equal_p (SET_DEST (set), SET_SRC (set)));
 
-      /* Notice copies.  */
-      if (set && REG_P (SET_DEST (set)) && REG_P (SET_SRC (set)))
-       copy_value (SET_DEST (set), SET_SRC (set), vd);
+      if (!noop_p)
+       {
+         /* Notice stores.  */
+         note_stores (PATTERN (insn), kill_set_value, &ksvd);
+
+         /* Notice copies.  */
+         if (copy_p)
+           copy_value (SET_DEST (set), SET_SRC (set), vd);
+       }
 
       if (insn == BB_END (bb))
        break;