https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67383
Vladimir Makarov <vmakarov at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |vmakarov at gcc dot gnu.org
--- Comment #4 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
I've tried to reproduce it on gcc-4.9 branch as of today but failed. The
problem with constraints and overlapped hard regs was probably fixed by
backported patches.
Still I have another problem:
../lib/mm/mm.c: In function ‘chunk_node’:
../lib/mm/mm.c:430:1: internal compiler error: in assign_by_spills, at
lra-assigns.c:1357
0x853dd5 assign_by_spills
/home/cygnus/vmakarov/build1/gcc-4.9-branch/gcc/gcc/lra-assigns.c:1357
0x854617 lra_assign()
/home/cygnus/vmakarov/build1/gcc-4.9-branch/gcc/gcc/lra-assigns.c:1503
0x84de9c lra(_IO_FILE*)
/home/cygnus/vmakarov/build1/gcc-4.9-branch/gcc/gcc/lra.c:2388
0x80ca16 do_reload
/home/cygnus/vmakarov/build1/gcc-4.9-branch/gcc/gcc/ira.c:5474
0x80ca16 rest_of_handle_reload
/home/cygnus/vmakarov/build1/gcc-4.9-branch/gcc/gcc/ira.c:5615
0x80ca16 execute
/home/cygnus/vmakarov/build1/gcc-4.9-branch/gcc/gcc/ira.c:5644
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
The problem is in assigning a hard reg to reload pseudo 442 for insns
Choosing alt 0 in insn 153: (0) =&r (1) %0 (2) r {*arm_adddi3}
Creating newreg=441, assigning class GENERAL_REGS to r441
Creating newreg=442 from oldreg=268, assigning class GENERAL_REGS to r442
153: {r441:DI=r441:DI+r442:DI;clobber cc:CC;}
REG_DEAD r268:DI
REG_UNUSED cc:CC
REG_EQUIV [sp:SI+0x10]
Inserting insn reload before:
642: r441:DI=[sp:SI+0x8]
644: r442:DI=r268:DI
Inserting insn reload after:
643: [sp:SI+0x10]=r441:DI
We canot use hard reg 0, 1, 2 as they live through insn 153:
...
153: {r272:DI=r268:DI+r159:DI;clobber cc:CC;}
REG_DEAD r268:DI
REG_UNUSED cc:CC
REG_EQUIV [sp:SI+0x10]
...
159: call [`debug_printf'] argc:0x20
REG_DEAD r1:SI
REG_DEAD r0:SI
REG_DEAD r2:DI
Hard reg 7 (FP), 9 (thread), 10 (pic), 13 (sp), 15 (pc) are fixed. So
we have only one hole for DI value containing 2 regs (4, 5) and pair
(4,5) is assigned to 441 and there are no regs for 442.
By the way, reload pass also gives up for this case:
../lib/mm/mm.c:430:1: error: unable to find a register to spill in class
‘GENERAL_REGS’
../lib/mm/mm.c:430:1: error: this is the insn:
(insn 153 136 139 10 (parallel [
(set (reg:DI 272 [ D.9125 ])
(plus:DI (reg:DI 268 [ D.9125 ])
(reg:DI 159 [ D.9125 ])))
(clobber (reg:CC 100 cc))
]) ../lib/mm/mm.c:349 2 {*arm_adddi3}
(expr_list:REG_DEAD (reg:DI 268 [ D.9125 ])
(expr_list:REG_UNUSED (reg:CC 100 cc)
(expr_list:REG_EQUIV (mem:DI (plus:SI (reg/f:SI 13 sp)
(const_int 16 [0x10])) [0 S8 A64])
(nil)))))
Interesting enough that LRA on the trunk has no such problem but I had no time
to figure why.