LRA reloads of subregs
Vladimir Makarov
vmakarov@redhat.com
Sun Sep 6 06:46:00 GMT 2015
On 09/04/2015 09:02 PM, David Miller wrote:
> From: David Miller <davem@davemloft.net>
> Date: Fri, 04 Sep 2015 11:27:31 -0700 (PDT)
>
>> From: Vladimir Makarov <vmakarov@redhat.com>
>> Date: Fri, 4 Sep 2015 10:00:54 -0400
>>
>>> I don't think we should add a new LRA code calling process_address
>>> before adding insns for further processing. LRA just needs to get
>>> operands from insns to make them valid. So again I'd try to make insn
>>> recognizable for LRA first and only if it does not work then think
>>> about other solutions in case when such change creates other problems
>>> (it is hard for me to predict LRA behaviour definitely just reading
>>> source files and not knowing sparc port well).
> I've taken some time to see exactly what is going on here, perhaps
> you can give me some guidance, I'm quite happy to implement anything
> :-)
Ok, if modifying constraint/insn definitions does not work, then you
could try to split the 1st loop in
lra-constraints.c::curr_insn_transform onto 2 loops: one with processing
subregs and another one with the rest of the original loop code. Then
you need to put the new loop processing subregs after the loop
processing addresses. I think it will work. Of course the change will
need a lot of testing on other platforms (at least on x86/x86-64).
> We start with:
>
> (insn 1100 1099 1101 14 (set (reg:SI 3376)
> (ior:SI (subreg:SI (reg:QI 287) 0)
> (subreg:SI (reg:QI 289) 0))) x.c:104 234 {iorsi3}
> (expr_list:REG_DEAD (reg:QI 289)
> (expr_list:REG_DEAD (reg:QI 287)
> (nil))))
>
> LRA emits, in curr_insn_transform():
>
> (set (reg:SI 13423) (subreg:SI (reg:QI 287) 0))
>
> LRA then spills the subreg onto the stack, which gives us:
>
> (insn 18631 1099 1100 14 (set (reg:SI 13423)
> (subreg:SI (mem/c:QI (plus:SI (reg/f:SI 101 %sfp)
> (const_int -14269 [0xffffffffffffc843])) [0 %sfp+-14269 S1 A8]) 0)) x.c:104 63 {*movsi_insn}
> (expr_list:REG_DEAD (reg:QI 287)
> (nil)))
>
> And this is where we run into trouble in simplify_operand_subreg(),
> which seems to force reloads for all SUBREGs of MEM.
>
> Normally, if there were no SUBREG here, LRA would run
> process_address() over the MEMs in this instruction and all would be
> well.
>
> It is also the case that I cannot do anything special in the SPARC
> move emitter to handle this, as address validization is disabled when
> lra_in_progress is true.
More information about the Gcc
mailing list