RFA: patch to solve IRA PR48336, PR48342, PR48345

Vladimir Makarov vmakarov@redhat.com
Wed Mar 30 17:05:00 GMT 2011


On 03/30/2011 06:19 AM, Richard Sandiford wrote:
> Hi Vlad,
>
> First, I want to echo H-P's thanks for tackling this area.  I just wondered:
>
> Vladimir Makarov<vmakarov@redhat.com>  writes:
>> The following patch is to solve PR48336, PR48342, PR48345.  The
>> profitable hard regs exclude hard regs which are prohibited for the
>> corresponding allocno mode. It is true for primary allocation and it is
>> important for better colorability criteria.  Function assign_hard_reg is
>> also based on this assumption.  Unfortunately, it is not true for
>> secondary allocation (after IRA IR flattening or during reload).  The
>> following patch solves this problem.
>>
>> The patch should be very safe but I am still testing it on x86/x86-64
>> bootstrap.
> [...]
>> Index: ira-color.c
>> ===================================================================
>> --- ira-color.c	(revision 171699)
>> +++ ira-color.c	(working copy)
>> @@ -1447,7 +1447,9 @@ update_conflict_hard_regno_costs (int *c
>>   }
>>
>>   /* Set up conflicting and profitable regs (through CONFLICT_REGS and
>> -   PROFITABLE_REGS) for each object of allocno A.  */
>> +   PROFITABLE_REGS) for each object of allocno A.  Remember that the
>> +   profitable regs exclude hard regs which can not hold value of mode
>> +   of allocno A.  */
>>   static inline void
>>   setup_conflict_profitable_regs (ira_allocno_t a, bool retry_p,
>>   				HARD_REG_SET *conflict_regs,
>> @@ -1463,8 +1465,13 @@ setup_conflict_profitable_regs (ira_allo
>>         COPY_HARD_REG_SET (conflict_regs[i],
>>   			 OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
>>         if (retry_p)
>> -	COPY_HARD_REG_SET (profitable_regs[i],
>> -			   reg_class_contents[ALLOCNO_CLASS (a)]);
>> +	{
>> +	  COPY_HARD_REG_SET (profitable_regs[i],
>> +			     reg_class_contents[ALLOCNO_CLASS (a)]);
>> +	  AND_COMPL_HARD_REG_SET (profitable_regs[i],
>> +				  ira_prohibited_class_mode_regs
>> +				  [ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]);
>> +	}
>>         else
>>   	COPY_HARD_REG_SET (profitable_regs[i],
>>   			   OBJECT_COLOR_DATA (obj)->profitable_hard_regs);
> ira_prohibited_class_mode_regs is partly based on HARD_REGNO_MODE_OK,
> which is really a property of the first register in a multi-register
> group (rather than of every register in that group).  So is
> ira_prohibited_class_mode_regs defined in the same way?
> At the moment, check_hard_reg_p and setup_allocno_available_regs_num
> test profitability for every register in the group:
>
> 	/* Checking only profitable hard regs.  */
> 	if (TEST_HARD_REG_BIT (conflict_regs[k], hard_regno + j)
> 	    || ! TEST_HARD_REG_BIT (profitable_regs[k], hard_regno + j))
> 	  break;
> [...]
>        for (j = 0; j<  nregs; j++)
> 	{
> 	[...]
> 	      /* Checking only profitable hard regs.  */
> 	      if (TEST_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
> 				     hard_regno + j)
> 		  || ! TEST_HARD_REG_BIT (obj_data->profitable_hard_regs,
> 					  hard_regno + j))
> 		break;
>
> So if you have a target in which double-word values have to start in
> even registers, I think every odd-numbered bit of profitable_hard_regs
> will be clear, and no register will seem profitable.  (I'm seeing this
> on ARM with some VFP tests.)
>
> Restricting the test to the first register fixes things for me,
> but do we need to check something else for the j != 0 case?
>
>
Richard, thanks very much for pointing this out.  I am agree with you.  
I think your patch is ok.  Although I need some time to check it.  Right 
now I am overwhelmed by # of other bug reports.

Another thing bothering me is a new colorability test for pseudos which 
should start on even or odd hard register.  I have suspicion that it is 
not ok for now.  I need some time to check and think about it.

I hope that I finish my urgent work on bug reports this week and start 
to work on your patch and the another issue on next week.

> gcc/
> 	* ira-color.c (check_hard_reg_p): Restrict the profitability check
> 	to the first register.
> 	(setup_allocno_available_regs_num): Likewise.
>
> Index: gcc/ira-color.c
> ===================================================================
> --- gcc/ira-color.c	(revision 171653)
> +++ gcc/ira-color.c	(working copy)
> @@ -1497,7 +1504,8 @@ check_hard_reg_p (ira_allocno_t a, int h
>         for (k = set_to_test_start; k<  set_to_test_end; k++)
>   	/* Checking only profitable hard regs.  */
>   	if (TEST_HARD_REG_BIT (conflict_regs[k], hard_regno + j)
> -	    || ! TEST_HARD_REG_BIT (profitable_regs[k], hard_regno + j))
> +	    || (j == 0
> +		&&  ! TEST_HARD_REG_BIT (profitable_regs[k], hard_regno)))
>   	  break;
>         if (k != set_to_test_end)
>   	break;
> @@ -2226,8 +2234,9 @@ setup_allocno_available_regs_num (ira_al
>   	      /* Checking only profitable hard regs.  */
>   	      if (TEST_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
>   				     hard_regno + j)
> -		  || ! TEST_HARD_REG_BIT (obj_data->profitable_hard_regs,
> -					  hard_regno + j))
> +		  || (j == 0
> +		&&  ! TEST_HARD_REG_BIT (obj_data->profitable_hard_regs,
> +					      hard_regno)))
>   		break;
>   	    }
>   	  if (k != set_to_test_end)



More information about the Gcc-patches mailing list