This seems fairly straightforward:

(insn 213 455 216 6 (set (reg:SI 266)
(mem/u/c:SI (post_inc:SI (reg/f:SI 267)) [4 S4 A32])) 748 {*thumb1_movsi_insn}
     (expr_list:REG_EQUAL (const_int -1044200508 [0xffffffffc1c2c3c4])
        (expr_list:REG_INC (reg/f:SI 267)
            (nil))))

We don't notice that the SET_SRC has a side effect, record the insn as an equivalencing one, and later remove it because we replaced the reg with the constant everywhere. Thus, the increment doesn't take place.

Fixed as follows. Bootstrapped and tested on x86_64-linux. Also compared before/after dumps for the testcase with arm-elf. Ok?


Bernd
	PR rtl-optimization/69752
	* ira.c (update_equiv_regs): When looking for more than a single SET,
	also take other side effects into account.

Index: gcc/ira.c
===================================================================
--- gcc/ira.c	(revision 233364)
+++ gcc/ira.c	(working copy)
@@ -3392,7 +3392,8 @@ update_equiv_regs (void)
 
 	  /* If this insn contains more (or less) than a single SET,
 	     only mark all destinations as having no known equivalence.  */
-	  if (set == NULL_RTX)
+	  if (set == NULL_RTX
+	      || side_effects_p (SET_SRC (set)))
 	    {
 	      note_stores (PATTERN (insn), no_equiv, NULL);
 	      continue;

Reply via email to