Record equivalences for spill registers
Jim Wilson
jim.wilson@linaro.org
Mon May 8 05:25:00 GMT 2017
On 05/05/2017 12:23 AM, Richard Sandiford wrote:
> 2017-05-05 Richard Sandiford <richard.sandiford@linaro.org>
>
> gcc/
> * lra-constraints.c (lra_copy_reg_equiv): New function.
> (split_reg): Use it to copy equivalence information from the
> original register to the spill register.
This patch breaks aarch64 bootstrap. I get a link error for lto1 and f951
godump.o: In function `go_define(unsigned int, char const*)':
godump.c:(.text+0x36c): relocation truncated to fit:
R_AARCH64_ADR_PREL_LO21 against `.rodata'
godump.c:(.text+0x4b4): relocation truncated to fit:
R_AARCH64_ADR_PREL_LO21 against `.rodata'
The godump.c.271r.ira file looks OK, I see
(insn 237 223 225 10 (set (reg/f:DI 489)
(high:DI (label_ref 240))) "../../gcc-svn/gcc/godump.c":174 49
{*movdi_aarch64}
(expr_list:REG_EQUIV (high:DI (label_ref 240))
(insn_list:REG_LABEL_OPERAND 240 (nil))))
...
(insn 238 115 1157 10 (set (reg/f:DI 490)
(lo_sum:DI (reg/f:DI 489)
(label_ref 240))) "../../gcc-svn/gcc/godump.c":174 929
{add_losym_di}
(expr_list:REG_DEAD (reg/f:DI 489)
(expr_list:REG_EQUIV (label_ref 240)
(insn_list:REG_LABEL_OPERAND 240 (nil)))))
But in the godump.c.272r.reload file I see in a different basic block
(insn 1244 76 1161 22 (set (reg/f:DI 7 x7 [490])
(label_ref 240)) "../../gcc-svn/gcc/godump.c":221 49
{*movdi_aarch64}
(nil))
which is not OK. This label ref is the address of a jumptable in the
rodata section, and can't be loaded with a single instruction. It looks
like there needs to be some extra work when rematerializing, to handle
equiv values that can't just be copied to a register.
I haven't had a chance to step through this in a debugger to see what is
going on yet.
Jim
More information about the Gcc-patches
mailing list