Segher Boessenkool <seg...@kernel.crashing.org> writes:
> On Thu, Feb 12, 2015 at 03:54:21PM +0000, Richard Sandiford wrote:
>> "Hale Wang" <hale.w...@arm.com> writes:
>> > Ping?
>
> It's not a regression (or is it?), so it is not appropriate for stage4.
>
>
>> >> diff --git a/gcc/combine.c b/gcc/combine.c index 5c763b4..6901ac2 100644
>> >> --- a/gcc/combine.c
>> >> +++ b/gcc/combine.c
>> >> @@ -1904,6 +1904,12 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3,
>> >> rtx_insn *pred ATTRIBUTE_UNUSED,
>> >>    set = expand_field_assignment (set);
>> >>    src = SET_SRC (set), dest = SET_DEST (set);
>> >> 
>> >> +  /* Don't combine if dest contains a user specified register, because
>> > the
>> >> +     user specified register (same with dest) in i3 would be replaced by
>> > the
>> >> +     src of insn which might be different with the user's expectation.
>> >> + */  if (REG_P (dest) && REG_USERVAR_P (dest) && HARD_REGISTER_P
>> >> (dest))
>> >> +    return 0;
>> 
>> I suppose this is similar to Andrew's comment, but I think the rule
>> is that it's invalid to replace a REG_USERVAR_P operand in an inline asm.
>
> Why not?  You probably mean register asm, not all user variables?

Yeah, meant hard REG_USERVAR_P, sorry, as for the patch.

>> Outside of an inline asm we make no guarantee about whether something is
>> stored in a particular register or not.
>> 
>> So IMO we should be checking whether either INSN or I3 is an asm as well
>> as the above.
>
> [ INSN can never be an asm, that is already refused by can_combine_p. ]
>
> We do not guarantee things will end up in the specified reg (except for asm),
> but will it hurt to leave things in the reg the user said it should be in, 
> even
> if we do not guarantee this behaviour?

Whether it does not, making the test unnecessarily wide is at best only
going to paper over problems elsewhere.  I really think we should test
for i3 being an asm.

Thanks,
Richard

Reply via email to