[PATCH][IRA] Analysis of register usage of functions for usage by IRA.

Tom de Vries Tom_deVries@mentor.com
Wed Sep 3 16:58:00 GMT 2014


On 01-09-14 18:41, Ulrich Weigand wrote:
> Tom de Vries wrote:
>
>> 	* ira-costs.c (ira_tune_allocno_costs): Use
>> 	ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS to adjust costs.
>
> In debugging PR 53864 on s390x-linux, I ran into a weird change in behavior
> that occurs when the following part of this patch was checked in:
>
>> -	      if (ira_hard_reg_set_intersection_p (regno, mode, call_used_reg_set)
>> -		  || HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
>> -		cost += (ALLOCNO_CALL_FREQ (a)
>> -			 * (ira_memory_move_cost[mode][rclass][0]
>> -			    + ira_memory_move_cost[mode][rclass][1]));
>> +	      crossed_calls_clobber_regs
>> +		= &(ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a));
>> +	      if (ira_hard_reg_set_intersection_p (regno, mode,
>> +						   *crossed_calls_clobber_regs))
>> +		{
>> +		  if (ira_hard_reg_set_intersection_p (regno, mode,
>> +						       call_used_reg_set)
>> +		      || HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
>> +		    cost += (ALLOCNO_CALL_FREQ (a)
>> +			     * (ira_memory_move_cost[mode][rclass][0]
>> +				+ ira_memory_move_cost[mode][rclass][1]));
>>   #ifdef IRA_HARD_REGNO_ADD_COST_MULTIPLIER
>> -	      cost += ((ira_memory_move_cost[mode][rclass][0]
>> -			+ ira_memory_move_cost[mode][rclass][1])
>> -		       * ALLOCNO_FREQ (a)
>> -		       * IRA_HARD_REGNO_ADD_COST_MULTIPLIER (regno) / 2);
>> +		  cost += ((ira_memory_move_cost[mode][rclass][0]
>> +			    + ira_memory_move_cost[mode][rclass][1])
>> +			   * ALLOCNO_FREQ (a)
>> +			   * IRA_HARD_REGNO_ADD_COST_MULTIPLIER (regno) / 2);
>>   #endif
>> +		}
>
> Before that patch, this code would penalize all call-clobbered registers
> (if the alloca is used across a call), and it would penalize *all* registers
> in a target-dependent way if IRA_HARD_REGNO_ADD_COST_MULTIPLIER is defined;
> the latter is completely independent of the presence of any calls.
>
> However, after that patch, the IRA_HARD_REGNO_ADD_COST_MULTIPLIER penalty
> is only applied for registers clobbered by calls in this function.  This
> seems a completely unrelated change, and looks just wrong to me ...
>
> Was this done intentionally or is this just an oversight?
>

Ulrich,

thanks for noticing this. I agree, this looks wrong, and is probably an 
oversight. [ It seems that s390 is the only target defining 
IRA_HARD_REGNO_ADD_COST_MULTIPLIER, so this problem didn't show up on any other 
target. ]

I think attached patch fixes it.

I've build the patch and ran the fuse-caller-save tests, and I'm currently 
bootstrapping and reg-testing it on x86_64.

Can you check whether this patches fixes the issue for s390 ?

Thanks,
- Tom

> Bye,
> Ulrich
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Fix-IRA_HARD_REGNO_ADD_COST_MULTIPLIER-in-ira_tune_a.patch
Type: text/x-patch
Size: 1456 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20140903/9f72b87e/attachment.bin>


More information about the Gcc-patches mailing list