http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59477

--- Comment #2 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
 Reload pass gives

b.i: In function ‘void test1(_Bit_iterator)’:
b.i:90:1: error: unable to find a register to spill in class ‘CREG’
 }
 ^
b.i:90:1: error: this is the insn:
(insn 29 43 30 2 (parallel [
            (set (reg:DI 37 r8)
                (ashift:DI (reg:DI 37 r8 [92])
                    (subreg:QI (reg:SI 90 [ _M_offset ]) 0)))
            (clobber (reg:CC 17 flags))
        ]) b.i:54 528 {*ashldi3_1}
     (expr_list:REG_DEAD (reg:DI 37 r8 [92])
        (expr_list:REG_DEAD (reg:SI 90 [ _M_offset ])
            (expr_list:REG_UNUSED (reg:CC 17 flags)
                (nil)))))
b.i:90:1: internal compiler error: in spill_failure, at reload1.c:2106
0xaf796a _fatal_insn(char const*, rtx_def const*, char const*, int, char
const*)
        /home/cygnus/vmakarov/build1/trunk2/gcc/gcc/rtl-error.c:109
0xaf63d3 spill_failure
        /home/cygnus/vmakarov/build1/trunk2/gcc/gcc/reload1.c:2106
0xaf63d3 find_reload_regs
        /home/cygnus/vmakarov/build1/trunk2/gcc/gcc/reload1.c:2032
0xaf63d3 select_reload_regs
...

Before combiner we have:

   28: cx:DI=0
   29: r8:SI=r97:DI#0
      REG_DEAD r97:DI
   30: dx:DI=r103:DI
      REG_DEAD r103:DI
      REG_EQUAL frame:DI-0x2
   31: si:DI=r104:DI
      REG_DEAD r104:DI
      REG_EQUAL frame:DI-0x1
   32: di:DI=r98:DI
      REG_DEAD r98:DI
      REG_EQUAL frame:DI-0x20
   33: call
[`_Z9__find_ifI16reverse_iteratorI13_Bit_iteratorE17_Iter_equals_iterIS2_EET_S5_S5_T0_']
argc:0
      REG_DEAD r8:SI
      REG_DEAD di:DI
      REG_DEAD si:DI
      REG_DEAD cx:DI
      REG_DEAD dx:DI

After combiner we have:

   28: cx:DI=0
   29: {r8:DI=r92:DI<<r90:SI#0;clobber flags:CC;}
      REG_UNUSED flags:CC
      REG_DEAD r90:SI
      REG_DEAD r92:DI
   30: dx:DI=r103:DI
      REG_DEAD r103:DI
      REG_EQUAL frame:DI-0x2
   31: si:DI=r104:DI
      REG_DEAD r104:DI
      REG_EQUAL frame:DI-0x1
   32: di:DI=r98:DI
      REG_DEAD r98:DI
      REG_EQUAL frame:DI-0x20
   33: call
[`_Z9__find_ifI16reverse_iteratorI13_Bit_iteratorE17_Iter_equals_iterIS2_EET_S5_S5_T0_']
argc:0
      REG_DEAD r8:SI
      REG_DEAD di:DI
      REG_DEAD si:DI
      REG_DEAD cx:DI
      REG_DEAD dx:DI

As r90 in inns 29 needs to be in cx and cx is already alive, neither reload nor
LRA can do anything.

I'll still investigate what can be done in LRA to fix it but I am not sure I'll
succeed.

Reply via email to