------- 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

Reply via email to