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