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

--- Comment #11 from Uroš Bizjak <ubizjak at gmail dot com> ---
OK, confirmed using "-Os -m32" with

gcc version 4.9.0 20140207 (experimental) [trunk revision 207597] (GCC) 

on CentOS 5.10.

It looks like a fault in the combine pass.

Before combine, we have:

...
(insn 14 11 15 2 (set (reg:SI 101 [ D.1782 ])
        (mem/c:SI (symbol_ref:SI ("d") [flags 0x2]  <var_decl 0x2b47ff9e1ed8d>)
[2 d+0 S4 A32])) t.c:18 90 {*movsi_internal}
     (nil))
...

(insn 33 32 34 5 (set (reg:SI 113 [ D.1782 ])
        (sign_extend:SI (reg:QI 91 [ D.1785 ]))) t.c:17 148 {extendqisi2}
     (nil))
(insn 34 33 35 5 (set (reg:SI 114 [ D.1782 ])
        (not:SI (reg:SI 113 [ D.1782 ]))) t.c:17 510 {*one_cmplsi2_1}
     (expr_list:REG_DEAD (reg:SI 113 [ D.1782 ])
        (nil)))
(insn 35 34 37 5 (parallel [
            (set (reg:DI 115 [ D.1786 ])
                (sign_extend:DI (reg:SI 114 [ D.1782 ])))
            (clobber (reg:CC 17 flags))
            (clobber (scratch:SI))
        ]) t.c:17 143 {extendsidi2_1}
     (expr_list:REG_DEAD (reg:SI 114 [ D.1782 ])
        (expr_list:REG_UNUSED (reg:CC 17 flags)
            (nil))))
(insn 37 35 38 5 (parallel [
            (set (reg:SI 117)
                (ior:SI (subreg:SI (reg:DI 115 [ D.1786 ]) 0)
                    (subreg:SI (reg:DI 115 [ D.1786 ]) 4)))
            (clobber (reg:CC 17 flags))
        ]) t.c:17 420 {*iorsi_1}
     (expr_list:REG_DEAD (reg:DI 115 [ D.1786 ])
        (expr_list:REG_UNUSED (reg:CC 17 flags)
            (nil))))
(insn 38 37 39 5 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 117)
            (const_int 0 [0]))) t.c:17 3 {*cmpsi_ccno_1}
     (expr_list:REG_DEAD (reg:SI 117)
        (nil)))
(insn 39 38 41 5 (set (reg:QI 119)
        (ne:QI (reg:CCZ 17 flags)
            (const_int 0 [0]))) t.c:17 624 {*setcc_qi}
     (expr_list:REG_DEAD (reg:CCZ 17 flags)
        (nil)))
(insn 41 39 83 5 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 101 [ D.1782 ])
            (const_int 0 [0]))) t.c:18 3 {*cmpsi_ccno_1}
     (nil))
(insn 83 41 42 5 (set (reg:SI 122 [ D.1787 ])
        (zero_extend:SI (reg:QI 119))) 138 {*zero_extendqisi2}
     (expr_list:REG_DEAD (reg:QI 119)
        (nil)))
(jump_insn 42 83 43 5 (set (pc)
        (if_then_else (eq (reg:CCZ 17 flags)
                (const_int 0 [0]))
            (label_ref 47)
            (pc))) t.c:18 628 {*jcc_1}
     (expr_list:REG_DEAD (reg:CCZ 17 flags)
        (int_list:REG_BR_PROB 5000 (nil)))
 -> 47)

Please note (insn 41) that sets flags for (jump_insn 42), comparing (reg:SI
101) a.k.a "d" with zero.

Later, combine mass-deletes everything from (insn 33) to (insn 83) to
substitute (insn 83) with constant load:

...
(insn 14 11 15 2 (set (reg:SI 101 [ D.1782 ])
        (mem/c:SI (symbol_ref:SI ("d") [flags 0x2]  <var_decl 0x2b47ff9e1ed8d>)
[2 d+0 S4 A32])) t.c:18 90 {*movsi_internal}
     (nil))
...
(note 33 32 34 5 NOTE_INSN_DELETED)
(note 34 33 35 5 NOTE_INSN_DELETED)
(note 35 34 37 5 NOTE_INSN_DELETED)
(note 37 35 39 5 NOTE_INSN_DELETED)
(note 39 37 41 5 NOTE_INSN_DELETED)
(note 41 39 83 5 NOTE_INSN_DELETED)
(insn 83 41 42 5 (set (reg:SI 122 [ D.1787 ])
        (const_int 1 [0x1])) 90 {*movsi_internal}
     (nil))
(jump_insn 42 83 43 5 (set (pc)
        (if_then_else (eq (reg:CCZ 17 flags)
                (const_int 0 [0]))
            (label_ref 47)
            (pc))) t.c:18 628 {*jcc_1}
     (expr_list:REG_DEAD (reg:CCZ 17 flags)
        (int_list:REG_BR_PROB 5000 (nil)))
 -> 47)

Unfortunately unrelated (insn 41) is also killed, so flags are taken from
unrelated operation (that happens to be insn 32, just above insn 33).

Things go downhill from there.

Reply via email to