Question on scan_one_insn in IRA about load parameters from stack slot.

Vladimir Makarov vmakarov@redhat.com
Mon May 7 14:22:00 GMT 2012


On 04/26/2012 04:49 AM, Bin.Cheng wrote:
> On Wed, Apr 25, 2012 at 10:46 PM, Vladimir Makarov<vmakarov@redhat.com>  wrote:
>> On 04/24/2012 11:56 PM, Bin.Cheng wrote:
>>> Hi,
>>> In scan_one_insn, gcc checks whether an insn loads a parameter from
>>> its stack slot, and then
>>> record the fact by decrease the memory cost.
>>>
>>> What I do not understand is the check condition like below checks the
>>> REG_EQUIV note, rather than
>>> checking memory access using stack pointer directly.
>>>
>>>    if (set != 0&&    REG_P (SET_DEST (set))&&    MEM_P (SET_SRC (set))
>>>
>>>        &&    (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != NULL_RTX
>>>        &&    ((MEM_P (XEXP (note, 0)))
>>>           || (CONSTANT_P (XEXP (note, 0))
>>>         &&    targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
>>>                                                 XEXP (note, 0))
>>>         &&    REG_N_SETS (REGNO (SET_DEST (set))) == 1)))
>>>
>>> So what's the connection between REG_EQUIV and stack slot for
>>> parameters? I noticed from
>>> below dumps of IRA pass, seems the annotated insn is not load
>>> parameter from stack, but it is
>>> treated as the check condition. Why?
>>>
>>> Dump of IRA:
>>>
>>> (insn 121 118 122 6 (set (reg/f:SI 252 [ l_curve ])
>>>          (mem/f/c:SI (reg/f:SI 230) [7 l_curve+0 S4 A32]))
>>> bezier01/bmark_lite.c:246 186 {*thumb1_movsi_insn}
>>>       (expr_list:REG_EQUIV (mem/f/c:SI (reg/f:SI 230) [7 l_curve+0 S4 A32])
>>>          (expr_list:REG_EQUAL (mem/f/c:SI (symbol_ref:SI ("l_curve")
>>> [flags 0x80]<var_decl 0xb768d0c0 l_curve>) [7 l_curve+0 S4 A32])
>>>              (nil))))
>>>
>>>
>>> I am not sure if I missed something important, please help. Thanks very
>>> much.
>>>
>> Reload uses equivalent memory (not an allocated stack slot) if the pseudo
>> did not get a hard registers.  Therefore the equivalent insns for the pseudo
>> (they can be more than one) are not necessary and removed and that decreases
>> memory cost.  Many cases contain loading parameters from the stack.  But
>> there are a lot of other cases too.
>>
> Thanks for explaining.
Sorry for the answer delay.  I was on vacation last week.
> If I understood well, This part of code decreases mem_cost of allocno,
> making them prefer memory, rather than register if possible.
> This behavior achieves same effect as register re-materialization, right?
In some way.  Reusage of stack slots and re-materialization is actually 
done in reload, IRA only takes that into account.

> I do observe a case in which 11 pseudo allocnos are put in memory
> due to this check condition. That hurts reload pass and generates bad
> codes. So is it possible to introduce more accurate condition or even
> some heuristic information here?
>
>

It is possible but it is hard.  People (analogous code was present in 
old register allocator, in IRA Jeff Law, Bernd Schmidt and me tried to 
modify it several times) paid a lot of attention to this code and tried 
to improve this. Changes usually improved one test on specific target 
and worsened other tests on other targets.

First of all, I think you should try to provide more details for your 
case and a solution for the problem (but just removing the code 
modifying memory cost of equiv memory will not work because it really 
helps in many cases).  May be it is not a problem of IRA at all.  I'll 
try to look at the problem and evaluate your solution.



More information about the Gcc mailing list