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.