[RS6000] Correct save_reg_p

Iain Sandoe idsandoe@googlemail.com
Fri Feb 8 16:18:00 GMT 2019


> On 8 Feb 2019, at 16:16, Segher Boessenkool <segher@kernel.crashing.org> wrote:
> 
> On Fri, Feb 08, 2019 at 10:19:40PM +1030, Alan Modra wrote:
>> That one regressed gcc.dg/20020312-2.c, due to my "cleverness" in
>> simplifying the ABI_V4 case.  This one passes regression testing.
>> OK to apply?
> 
> I think this is correct.  Thanks!  Okay for trunk.  Does it need backports?

Yes, we reverted the original fix on 7 and 8.

Iain

> 
> 
> Segher
> 
> 
>> 	PR target/88343
>> 	* config/rs6000/rs6000.c (save_reg_p): Correct calls_eh_return
>> 	case.  Match logic in rs6000_emit_prologue emitting pic_offset_table
>> 	setup.
>> 
>> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
>> index cced90bb518..b4908c4f795 100644
>> --- a/gcc/config/rs6000/rs6000.c
>> +++ b/gcc/config/rs6000/rs6000.c
>> @@ -24008,21 +24008,30 @@ rs6000_split_multireg_move (rtx dst, rtx src)
>> static bool
>> save_reg_p (int reg)
>> {
>> -  /* We need to mark the PIC offset register live for the same conditions
>> -     as it is set up, or otherwise it won't be saved before we clobber it.  */
>> -
>>   if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE)
>>     {
>>       /* When calling eh_return, we must return true for all the cases
>> 	 where conditional_register_usage marks the PIC offset reg
>> -	 call used.  */
>> +	 call used or fixed.  */
>> +      if (crtl->calls_eh_return
>> +	  && ((DEFAULT_ABI == ABI_V4 && flag_pic)
>> +	      || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
>> +	      || (TARGET_TOC && TARGET_MINIMAL_TOC)))
>> +	return true;
>> +
>> +      /* We need to mark the PIC offset register live for the same
>> +	 conditions as it is set up in rs6000_emit_prologue, or
>> +	 otherwise it won't be saved before we clobber it.  */
>>       if (TARGET_TOC && TARGET_MINIMAL_TOC
>> -	  && (crtl->calls_eh_return
>> -	      || df_regs_ever_live_p (reg)
>> -	      || !constant_pool_empty_p ()))
>> +	  && !constant_pool_empty_p ())
>> +	return true;
>> +
>> +      if (DEFAULT_ABI == ABI_V4
>> +	  && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
>> +	  && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM))
>> 	return true;
>> 
>> -      if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
>> +      if (DEFAULT_ABI == ABI_DARWIN
>> 	  && flag_pic && crtl->uses_pic_offset_table)
>> 	return true;
>>     }



More information about the Gcc-patches mailing list