RELOAD_OTHER bug?

Joern RENNECKE joern.rennecke@st.com
Tue Dec 13 21:26:00 GMT 2005


DJ Delorie wrote:

>>>Does this mean that RELOAD_FOR_OTHER_ADDRESS reloads can never be
>>>merged with RELOAD_OTHER reloads?
>>> 
>>>      
>>>
>>Yes.  But if they load the same value as a RELOAD_OTHER input, they can 
>>share the same reload register.
>>    
>>
>
>So why does reload specifically check for RELOAD_FOR_OTHER_ADDRESS
>when deciding if a merge to RELOAD_OTHER is permitted?  Is this a bug
>in the current logic?
>
>	  for (j = 0; j < n_reloads; j++)
>	    if (i != j && rld[j].reg_rtx != 0
>		&& rtx_equal_p (rld[i].reg_rtx, rld[j].reg_rtx)
>		&& (! conflicting_input
>		    || rld[j].when_needed == RELOAD_FOR_INPUT_ADDRESS
>		    || rld[j].when_needed == RELOAD_FOR_OTHER_ADDRESS))
>	      {
>		rld[i].when_needed = RELOAD_OTHER;
>		rld[j].in = 0;
>		reload_spill_index[j] = -1;
>		transfer_replacements (i, j);
>  
>
That test checks that the value can actually live in the reload register 
not only during, but also
in-between (if there is such a time) the two reloads.  If there is a 
reload type available that is
suitable for the merged reload is another matter.
I see now that this code is in merge_assigned_reloads, so it might even 
be safe there to set the
reload type to RELOAD_FOR_OTHER_ADDRESS.  You'll have to check if the 
reload type from
that point onward is only needed to determine the time of the reload 
insn (rather than also the lifetime
of the reload register).



More information about the Gcc mailing list