re PR rtl-optimization/56124 (Redundant reload for loading from memory)
authorBin Cheng <bin.cheng@arm.com>
Thu, 11 Apr 2013 03:55:14 +0000 (03:55 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Thu, 11 Apr 2013 03:55:14 +0000 (03:55 +0000)
PR target/56124
* ira-costs.c (scan_one_insn): Check whether the source rtx of
loading has side effect.

From-SVN: r197691

gcc/ChangeLog
gcc/ira-costs.c

index 927a9c0f318403752ef018375c6b39499c626e08..7e1cc32176c659479d9ea59fea86f15753ca2f50 100644 (file)
@@ -1,3 +1,9 @@
+2013-04-11  Bin Cheng  <bin.cheng@arm.com>
+
+       PR target/56124
+       * ira-costs.c (scan_one_insn): Check whether the source rtx of
+       loading has side effect.
+
 2013-04-10  Steven Bosscher  <steven@gcc.gnu.org>
 
        * config/sparc/sparc.c: Include tree-pass.h.
index d2806bdffbdfa499a7b451eb0652e3ad01e87443..508394e296242c1879bd392ac508bf5e5ad48275 100644 (file)
@@ -1292,10 +1292,13 @@ scan_one_insn (rtx insn)
      a memory requiring special instructions to load it, decreasing
      mem_cost might result in it being loaded using the specialized
      instruction into a register, then stored into stack and loaded
-     again from the stack.  See PR52208.  */
+     again from the stack.  See PR52208.
+     
+     Don't do this if SET_SRC (set) has side effect.  See PR56124.  */
   if (set != 0 && REG_P (SET_DEST (set)) && MEM_P (SET_SRC (set))
       && (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
-      && ((MEM_P (XEXP (note, 0)))
+      && ((MEM_P (XEXP (note, 0))
+          && !side_effects_p (SET_SRC (set)))
          || (CONSTANT_P (XEXP (note, 0))
              && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
                                                XEXP (note, 0))