On Sun, 21 Aug 2005, Leehod Baruch wrote:
> *** 329,334 ****
> --- 328,341 ----
>                                      GET_MODE (SUBREG_REG (x)),
>                                      SUBREG_BYTE (x));
>           return op0 ? op0 : x;
> +       }
> +       if (code == SET)
> +       {
> +         op0 = simplify_replace_rtx (XEXP (x, 0), old_rtx, new_rtx);
> +         op1 = simplify_replace_rtx (XEXP (x, 1), old_rtx, new_rtx);
> +         if ((op0 == XEXP (x, 0)) && (op1 == XEXP (x, 1)))
> +           return x;
> +         return gen_rtx_SET (VOIDmode, op0, op1);
>         }
>         break;
>
> This way, when the replacement succeeds and the result instruction
> is recognizable, I can eliminate the extension.
>
> Does it seem like a good change?
> Does anyone have a better solution?

This approach seems reasonable.  The current structure of the code
in simplify_replace_rtx is intended to handle RTL expressions rather
than patterns, so normally it would be passed just SET_SRC (pat),
instead of the whole set.

The reason why no-one has wanted/required simplify_replace_rtx to
work on SETs is that all current passes tend to be cautious about
changes to the LHS of an assignment.  Performing substitution and
simplifications in the RHS/SET_SRC always produces a semantically
equivalent instruction, but blindly replacing subexpressions in
the LHS/SET_DEST can significantly change its meaning.

Hence, when combine/GCSE/CSE/reload and other RTL optimization
passes modify the target/destination of an assignment, they only
perform the transformations they expect or can guarantee are safe
(building the SET themselves), but are happy to let simplify_replace_rtx
do it's thing on the source expression.


To summarise, the change above is not unreasonable and I'd be
happy to allow this change to simplify-rtx.c, but I'd be more
cautious about where and why it was used.  For example, if you're
sure nothing bad can happen in the LHS, it might be reasonable
to instead place this code in a simplify_replace_set() function.
As the SET (and perhaps support for PARALLEL) should only ever
occur at the top-level, which can then call the recursive
simplify_replace_rtx.

I hope this helps.

Roger
--

Reply via email to