Hi,

I am trying to fix 49801 from GCC 4.6.1.
One of the first things I noticed it that one of the BB at asmconst looks like:
;; Start of basic block ( 2) -> 3
;; bb 3 artificial_defs: { }
;; bb 3 artificial_uses: { u7(4){ }u8(5){ }u9(6){ }}
;; lr  in        4 [AP] 5 [Y] 6 [Y] 26 27
;; lr  use       4 [AP] 5 [Y] 6 [Y] 26 27
;; lr  def       0 [AH] 1 [AL] 13 [CC] 14 15 16 32
;; live  in      4 [AP] 5 [Y] 6 [Y] 26 27
;; live  gen     1 [AL] 32
;; live  kill    0 [AH] 13 [CC] 14 15 16

;; Pred edge  2 [39.0%]  (fallthru)
(note 8 7 9 3 [bb 3] NOTE_INSN_BASIC_BLOCK)

(insn 9 8 10 3 (set:QI (reg:QI 1 AL)
        (reg/v:QI 26 [ a ])) shift.c:4 4 {*movqi}
     (expr_list:REG_DEAD (reg/v:QI 26 [ a ])
        (nil)))

(insn 10 9 11 3 (parallel [
            (set:QI (reg:QI 1 AL)
                (ashift:QI (reg:QI 1 AL)
                    (reg/v:QI 27 [ b ])))
            (clobber:QI (reg:QI 0 AH))
            (clobber (reg:CC 13 CC))
        ]) shift.c:4 51 {*ashlqi3}
     (expr_list:REG_DEAD (reg/v:QI 27 [ b ])
        (expr_list:REG_DEAD (reg/f:QI 16 virtual-stack-dynamic)
            (expr_list:REG_DEAD (reg/f:QI 15 virtual-stack-vars)
                (expr_list:REG_DEAD (reg/f:QI 14 virtual-incoming-args)
                    (expr_list:REG_UNUSED (reg:QI 0 AH)
                        (expr_list:REG_UNUSED (reg:CC 13 CC)
(expr_list:REG_EQUAL (ashift:QI (reg/v:QI 26 [ a ])
                                    (reg/v:QI 27 [ b ]))
                                (nil)))))))))

(insn 11 10 45 3 (set:QI (reg:QI 32 [ D.1925+1 ])
        (reg:QI 1 AL)) shift.c:4 4 {*movqi}
     (expr_list:REG_DEAD (reg:QI 1 AL)
        (expr_list:REG_EQUAL (ashift:QI (reg/v:QI 26 [ a ])
                (reg/v:QI 27 [ b ]))
            (nil))))

(jump_insn 45 11 46 3 (set (pc)
        (label_ref 21)) shift.c:4 16 {jump}
     (nil)
 -> 21)
;; End of basic block 3 -> ( 5)
;; lr  out       4 [AP] 5 [Y] 6 [Y] 32
;; live  out     4 [AP] 5 [Y] 6 [Y] 32



Then, after IRA, all the REG_DEAD notes are removed from insn 10.
;; Start of basic block ( 2) -> 3
;; bb 3 artificial_defs: { }
;; bb 3 artificial_uses: { u-1(5){ }u-1(6){ }}
;; lr  in        1 [AL] 5 [Y] 6 [Y] 7 [@H'fff8]
;; lr  use       1 [AL] 5 [Y] 6 [Y] 7 [@H'fff8]
;; lr  def       0 [AH] 1 [AL] 13 [CC] 14 15 16
;; live  in      1 [AL] 5 [Y] 6 [Y] 7 [@H'fff8]
;; live  gen     1 [AL]
;; live  kill    0 [AH] 13 [CC] 14 15 16

;; Pred edge  2 [39.0%]  (fallthru)
(note 8 7 10 3 [bb 3] NOTE_INSN_BASIC_BLOCK)

(insn 10 8 45 3 (parallel [
            (set:QI (reg:QI 1 AL)
                (ashift:QI (reg:QI 1 AL)
                    (reg/v:QI 7 @H'fff8 [orig:27 b ] [27])))
            (clobber:QI (reg:QI 0 AH))
            (clobber (reg:CC 13 CC))
        ]) shift.c:4 51 {*ashlqi3}
     (expr_list:REG_EQUAL (ashift:QI (reg/v:QI 1 AL [orig:26 a ] [26])
            (reg/v:QI 7 @H'fff8 [orig:27 b ] [27]))
        (nil)))

(jump_insn 45 10 46 3 (set (pc)
        (label_ref 21)) shift.c:4 16 {jump}
     (nil)
 -> 21)
;; End of basic block 3 -> ( 5)
;; lr  out       1 [AL] 5 [Y] 6 [Y]
;; live  out     1 [AL] 5 [Y] 6 [Y]

If though all REG_DEAD were removed from insn 10, lr def and live kill keeps referencing to the, now, nonexistent pseudo registers 14, 15 and 16.

I haven't pinpointed yet in IRA where this is happening but I wanted to confirm that regs 14, 15 and 16 shouldn't appear here anymore and if you have any hint as to where the problem might be.

Cheers,

--
PMatos

Reply via email to