------- Additional Comments From jakub at gcc dot gnu dot org  2005-03-04 18:30 
-------
>From initial skimming, this sounds like combiner bug.
(insn 78 41 79 0 (set (reg:CC 17 flags)
        (compare:CC (reg:DI 58 [ e$b.9 ])
            (reg:DI 59 [ e$b.8 ]))) 2 {cmpdi_1_insn_rex64}
(insn_list:REG_DEP_TRUE 41 (nil))
    (expr_list:REG_DEAD (reg:DI 59 [ e$b.8 ])
        (nil)))

(insn 79 78 52 0 (parallel [
            (set (reg:DI 64 [ e$a ])
                (plus:DI (plus:DI (ltu:DI (reg:CC 17 flags)
                            (const_int 0 [0x0]))
                        (reg:DI 64 [ e$a ]))
                    (const_int 0 [0x0])))
            (clobber (reg:CC 17 flags))
        ]) 174 {adddi3_carry_rex64} (insn_list:REG_DEP_TRUE 77
(insn_list:REG_DEP_TRUE 78 (nil)))
    (expr_list:REG_DEAD (reg:CC 17 flags)
        (expr_list:REG_UNUSED (reg:CC 17 flags)
            (nil))))

(insn 52 79 53 0 (parallel [
            (set (reg:DI 76)
                (lshiftrt:DI (reg:DI 61 [ f$0 ])
                    (const_int 32 [0x20])))
            (clobber (reg:CC 17 flags))
        ]) 435 {*lshrdi3_1_rex64} (nil)
    (expr_list:REG_DEAD (reg:DI 61 [ f$0 ])
        (expr_list:REG_UNUSED (reg:CC 17 flags)
            (nil))))

(insn 53 52 55 0 (parallel [
            (set (reg:DI 60 [ e$a.6 ])
                (plus:DI (reg:DI 64 [ e$a ])
                    (reg:DI 76)))
            (clobber (reg:CC 17 flags))
        ]) 192 {*adddi_1_rex64} (insn_list:REG_DEP_TRUE 79
(insn_list:REG_DEP_TRUE 52 (nil)))
    (expr_list:REG_DEAD (reg:DI 64 [ e$a ])
        (expr_list:REG_DEAD (reg:DI 76)
            (expr_list:REG_UNUSED (reg:CC 17 flags)
                (nil)))))

before combine is turned into:
(insn 78 41 79 0 (set (reg:CC 17 flags)
        (compare:CC (reg:DI 58 [ e$b.9 ])
            (reg:DI 59 [ e$b.8 ]))) 2 {cmpdi_1_insn_rex64}
(insn_list:REG_DEP_TRUE 41 (nil))
    (expr_list:REG_DEAD (reg:DI 59 [ e$b.8 ])
        (nil)))

(note 79 78 52 0 NOTE_INSN_DELETED)

(insn 52 79 53 0 (parallel [
            (set (reg:DI 76)
                (lshiftrt:DI (reg:DI 61 [ f$0 ])
                    (const_int 32 [0x20])))
            (clobber (reg:CC 17 flags))
        ]) 435 {*lshrdi3_1_rex64} (nil)
    (expr_list:REG_UNUSED (reg:CC 17 flags)
        (expr_list:REG_DEAD (reg:DI 61 [ f$0 ])
            (nil))))

(insn 53 52 55 0 (parallel [
            (set (reg:DI 60 [ e$a.6 ])
                (plus:DI (plus:DI (ltu:DI (reg:CC 17 flags)
                            (const_int 0 [0x0]))
                        (reg:DI 64 [ e$a ]))
                    (reg:DI 76)))
            (clobber (reg:CC 17 flags))
        ]) 174 {adddi3_carry_rex64} (insn_list:REG_DEP_TRUE 77
(insn_list:REG_DEP_TRUE 52 (nil)))
    (expr_list:REG_UNUSED (reg:CC 17 flags)
        (expr_list:REG_DEAD (reg:DI 76)
            (expr_list:REG_DEAD (reg:DI 64 [ e$a ])
                (nil)))))

which shouldn't be done, because the middle instruction is kept and clobbers
(reg:CC 17 flags), so combiner can't move use of %eflags from the first to the
last insn accross the clobber.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20322

Reply via email to