Paolo Bonzini wrote:
> On 11/04/2011 09:50 AM, Eric Botcazou wrote:
>> + /* If above failed and this is a single set, try to simplify the
>> source of
>> + the set given our substitution. We could perhaps try this for
>> multiple
>> + SETs, but it probably won't buy us anything. */
>> + rtx addr = simplify_replace_rtx (SET_DEST (set), from, to);
>>
>> What does "If above failed" refer to? Again "source" instead of
>> "destination".
>
> What about
>
> /* Registers can also appear as uses in SET_DEST if it is a MEM. We
> could perhaps try this for multiple SETs, but it probably won't
> buy us anything. */
>
> ?
>
> Georg, can you put it all together into a v2?
>
> Paolo
Like so?
PR rtl-optimization/50448
* cprop.c (try_replace_reg): Also try to replace uses of FROM that
appear in SET_DEST.
IMO the head comment is still misleading because it might give rise to the
assumption that SET_DESTs are replaced, too, which is not the case.
Johann
Index: cprop.c
===================================================================
--- cprop.c (revision 180962)
+++ cprop.c (working copy)
@@ -712,8 +712,8 @@ find_used_regs (rtx *xptr, void *data AT
}
}
-/* Try to replace all non-SET_DEST occurrences of FROM in INSN with TO.
- Returns nonzero is successful. */
+/* Try to replace all uses of FROM in INSN with TO.
+ Return nonzero if successful. */
static int
try_replace_reg (rtx from, rtx to, rtx insn)
@@ -764,6 +764,18 @@ try_replace_reg (rtx from, rtx to, rtx i
note = set_unique_reg_note (insn, REG_EQUAL, copy_rtx (src));
}
+ if (set && MEM_P (SET_DEST (set)) && reg_mentioned_p (from, SET_DEST (set)))
+ {
+ /* Registers can also appear as uses in SET_DEST if it is a MEM.
+ We could perhaps try this for multiple SETs, but it probably
+ won't buy us anything. */
+ rtx addr = simplify_replace_rtx (SET_DEST (set), from, to);
+
+ if (!rtx_equal_p (addr, SET_DEST (set))
+ && validate_change (insn, &SET_DEST (set), addr, 0))
+ success = 1;
+ }
+
/* REG_EQUAL may get simplified into register.
We don't allow that. Remove that note. This code ought
not to happen, because previous code ought to synthesize