On 09/21/16 16:38, Richard Earnshaw (lists) wrote:
> On 20/09/16 16:30, Bernd Schmidt wrote:
>> On 09/20/2016 05:18 PM, Jeff Law wrote:
>>>> I assume HARD_FRAME_POINTER_REGNUM is never zero.
>>> It could be zero.  It's just a hard register number.  No target has the
>>> property that its hard frame pointer register is 0 though :-)
>>
>> git blame to the rescue. The current state comes from one of tbsaunde's
>> cleanup patches:
>>
>>> diff --git a/gcc/regrename.c b/gcc/regrename.c
>> index 174d3b5..e5248a5 100644
>> --- a/gcc/regrename.c
>> +++ b/gcc/regrename.c
>> @@ -442,12 +442,10 @@ rename_chains (void)
>>          continue;
>>
>>         if (fixed_regs[reg] || global_regs[reg]
>> -#if !HARD_FRAME_POINTER_IS_FRAME_POINTER
>> -         || (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM)
>> -#else
>> -         || (frame_pointer_needed && reg == FRAME_POINTER_REGNUM)
>> -#endif
>> -         )
>> +         || (!HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
>> +             && reg == HARD_FRAME_POINTER_REGNUM)
>> +         || (HARD_FRAME_POINTER_REGNUM && frame_pointer_needed
>
> Surely, based on the logic of the previous ifdefs, this line should read
>   +         || (HARD_FRAME_POINTER_IS_FRAME_POINTER && frame_pointer_needed
>

I think the block above does not match this logic, it was also modified
recently.  Why is it handling FP and HFP, but then only HFP ?

   /* Don't clobber traceback for noreturn functions.  */
   if (frame_pointer_needed)
     {
       add_to_hard_reg_set (&unavailable, Pmode, FRAME_POINTER_REGNUM);
       if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
         add_to_hard_reg_set (&unavailable, Pmode, 
HARD_FRAME_POINTER_REGNUM);
     }


Bernd.

Reply via email to