------- Comment #4 from hutchinsonandy at gcc dot gnu dot org 2009-11-01 17:24 ------- The problem is still present on 4.3.5 head I cannot reproduce on 4.5
It looks like reload issue with SUBREG. Instruction 18 gets reloaded. The output reload is HImode. I will post dump files but here is extract that appears to highlight problem. >From lreg dump file: ;; Pred edge 3 [50.0%] (fallthru) (note 16 15 17 4 [bb 4] NOTE_INSN_BASIC_BLOCK) (note 17 16 18 4 NOTE_INSN_DELETED) (insn 18 17 54 4 pr41894.c:29 (set (subreg:QI (reg/v:HI 43 [ tmp ]) 0) (plus:QI (reg:QI 42 [ D.1188 ]) (const_int -1 [0xffffffff]))) 15 {addqi3} (expr_list:REG_DEAD (reg:QI 42 [ D.1188 ]) (nil))) (jump_insn 54 18 55 4 (set (pc) (label_ref 26)) 101 {jump} (nil)) ;; End of basic block 4 -> ( 6) ;; lr out 28 [r28] 32 [__SP_L__] 34 [argL] 43 ;; live out 28 [r28] 32 [__SP_L__] 34 [argL] 43 from greg dump file: Spilling for insn 18. Using reg 18 for reload 0 Spilling for insn 18. Using reg 18 for reload 0 Reloads for insn # 18 Reload 0: reload_in (QI) = (reg:QI 24 r24 [orig:42 D.1188 ] [42]) reload_out (HI) = (reg/v:HI 28 r28 [orig:43 tmp ] [43]) LD_REGS, RELOAD_OTHER (opnum = 0) reload_in_reg: (reg:QI 24 r24 [orig:42 D.1188 ] [42]) reload_out_reg: (reg/v:HI 28 r28 [orig:43 tmp ] [43]) reload_reg_rtx: (reg:HI 18 r18) deleting insn with uid = 2. ;; Register dispositions: 42 in 24 43 in 28 44 in 24 ;; Hard regs used: 18 19 24 25 28 29 32 Giving (insn 57 17 18 4 pr41894.c:29 (set (reg:QI 18 r18) (reg:QI 24 r24 [orig:42 D.1188 ] [42])) 4 {*movqi} (nil)) (insn 18 57 58 4 pr41894.c:29 (set (reg:QI 18 r18) (plus:QI (reg:QI 18 r18) (const_int -1 [0xffffffff]))) 15 {addqi3} (nil)) (insn 58 18 54 4 pr41894.c:29 (set (reg/v:HI 28 r28 [orig:43 tmp ] [43]) (reg:HI 18 r18)) 8 {*movhi} (nil)) (jump_insn 54 58 55 4 (set (pc) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41894