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.