[patch] fix regrename pass to ensure renamings produce valid insns

Jeff Law law@redhat.com
Fri Nov 6 19:51:00 GMT 2015


On 11/06/2015 03:48 AM, Bernd Schmidt wrote:
> On 06/17/2015 07:11 PM, Sandra Loosemore wrote:
>
>> Index: gcc/regrename.c
>> ===================================================================
>> --- gcc/regrename.c    (revision 224532)
>> +++ gcc/regrename.c    (working copy)
>> @@ -942,19 +942,22 @@ regrename_do_replace (struct du_head *he
>>         int reg_ptr = REG_POINTER (*chain->loc);
>>
>>         if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) !=
>> base_regno)
>> -    INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
>> +    validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC
>> (chain->insn)),
>> +             gen_rtx_UNKNOWN_VAR_LOC (), true);
>>         else
>>       {
>> -      *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
>> +      validate_change (chain->insn, chain->loc,
>> +               gen_raw_REG (GET_MODE (*chain->loc), reg), true);
>>         if (regno >= FIRST_PSEUDO_REGISTER)
>>           ORIGINAL_REGNO (*chain->loc) = regno;
>>         REG_ATTRS (*chain->loc) = attr;
>
> With a patch I'm working on that uses the renamer more often, I found
> that this is causing compare-debug failures. Validating changes to
> debug_insns (the INSN_VAR_LOCATION_LOC in particular) can apparently fail.
>
> The following fix was bootstrapped and tested with -frename-registers
> enabled at -O1 on x86_64-linux. Ok?
Essentially we're keeping the validate_change that Sandra & Chung added 
on the real insns to address the problem on the nios2 port.  The patch 
just drops the DEBUG_INSN changes from the change group.

For the DEBUG_INSNS in the chain, we update those independently after we 
apply the change group.

I think the change is fine for the trunk, though I'm still curious about 
how the code as-is resulted in a comparison failure.

jeff




More information about the Gcc-patches mailing list