------- Comment #5 from bergner at gcc dot gnu dot org 2007-01-19 22:30 ------- The src we seem to be having problems with is:
temp[0] |= bit; After local-alloc, we have the following RTL: (insn 143 28 29 6 pr29558.c:7 (set (reg:QI 142) (const_int -128 [0xffffffffffffff80])) 327 {*movqi_internal} (nil) (expr_list:REG_EQUIV (const_int -128 [0xffffffffffffff80]) (nil))) (insn 29 143 30 6 pr29558.c:7 (set (reg:SI 144) (ior:SI (subreg:SI (reg:QI 143 [ temp ]) 0) (subreg:SI (reg:QI 142) 0))) 137 {*boolsi3_internal1} (insn_list:REG_DEP_TRUE 27 (insn_list:REG_DEP_TRUE 28 (nil))) (expr_list:REG_DEAD (reg:QI 143 [ temp ]) (expr_list:REG_DEAD (reg:QI 142) (nil)))) (insn 30 29 138 6 pr29558.c:7 (set (mem/s/j:QI (plus:DI (reg/f:DI 113 sfp) (const_int 48 [0x30])) [0 temp+0 S1 A128]) (subreg:QI (reg:SI 144) 3)) 327 {*movqi_internal} (insn_list:REG_DEP_TRUE 29 (nil)) (expr_list:REG_DEAD (reg:SI 144) (nil))) Which looks ok, but then after global-alloc/reload, we end up with: (insn 143 28 29 6 pr29558.c:7 (set (reg:QI 9 9 [142]) (const_int -128 [0xffffffffffffff80])) 327 {*movqi_internal} (nil) (expr_list:REG_EQUIV (const_int -128 [0xffffffffffffff80]) (nil))) (insn 29 143 30 6 pr29558.c:7 (set (reg:SI 0 0 [144]) (ior:SI (reg:SI 0 0 [orig:143 temp+-3 ] [143]) (reg:SI 9 9 [orig:142+-3 ] [142]))) 137 {*boolsi3_internal1} (insn_list:REG_DEP_TRUE 27 (insn_list:REG_DEP_TRUE 28 (nil))) (nil)) (insn 30 29 138 6 pr29558.c:7 (set (mem/s/j:QI (plus:DI (reg/f:DI 1 1) (const_int -16 [0xfffffffffffffff0])) [0 temp+0 S1 A128]) (reg:QI 0 0 [orig:144+3 ] [144])) 327 {*movqi_internal} (insn_list:REG_DEP_TRUE 29 (nil)) (nil)) I'm not sure why yet, but it seems the -3 offset in reg:SI 0 0 [orig:143 temp+-3 ] [143]) is causing problems in the var tracking code, such that find_variable_location_part() always returns -1 (ie, failure) which puts us into the code we ICE in. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29558