Ping : [PATCH] [gcc, combine] PR46164: Don't combine the insns if a volatile register is contained.
Richard Sandiford
richard.sandiford@arm.com
Thu Feb 12 15:54:00 GMT 2015
"Hale Wang" <hale.wang@arm.com> writes:
> Ping?
>
>> -----Original Message-----
>> From: Hale Wang [mailto:hale.wang@arm.com]
>> Sent: Thursday, January 29, 2015 9:58 AM
>> To: Hale Wang; 'Segher Boessenkool'
>> Cc: GCC Patches
>> Subject: RE: [PATCH] [gcc, combine] PR46164: Don't combine the insns if a
>> volatile register is contained.
>>
>> Hi Segher,
>>
>> I have updated the patch as you suggested. Both the patch and the
>> changelog are attached.
>>
>> By the way, the test case provided by Tim Pambor in PR46164 was a
> different
>> bug with PR46164. So I resubmitted the bug in
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64818.
>> And this patch is just used to fix this bug. Is it OK for you?
>>
>> Thanks,
>> Hale
>>
>> gcc/ChangeLog:
>> 2015-01-27 Segher Boessenkool <segher@kernel.crashing.org>
>> Hale Wang <hale.wang@arm.com>
>>
>> PR rtl-optimization/64818
>> * combine.c (can_combine_p): Don't combine the insn if
>> the dest of insn is a user specified register.
>>
>> gcc/testsuit/ChangeLog:
>> 2015-01-27 Segher Boessenkool <segher@kernel.crashing.org>
>> Hale Wang <hale.wang@arm.com>
>>
>> PR rtl-optimization/64818
>> * gcc.target/arm/pr64818.c: New test.
>>
>>
>> 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.
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.
Thanks,
Richard
More information about the Gcc-patches
mailing list