[Bug rtl-optimization/68624] [6 Regression] wrong code at -O2 and -O3 on x86_64-linux-gnu (in 64-bit mode)

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Dec 1 10:52:00 GMT 2015


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68624

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
We have:
(code_label 37 36 38 8 8 "" [0 uses])
(note 38 37 39 8 [bb 8] NOTE_INSN_BASIC_BLOCK)
(insn 39 38 40 8 (set (reg:SI 94 [ d.8_13 ])
        (mem/c:SI (symbol_ref:DI ("d") [flags 0x2] <var_decl 0x7ffff7ff9e10 d>)
[1 d+0 S4 A32])) pr68624.c:12 86 {*movsi_internal}
     (nil))
(insn 40 39 102 8 (set (mem/c:SI (symbol_ref:DI ("e") [flags 0x2] <var_decl
0x7ffff7ff9ea0 e>) [1 e+0 S4 A32])
        (reg:SI 94 [ d.8_13 ])) pr68624.c:12 86 {*movsi_internal}
     (nil))
(insn 102 40 41 8 (set (reg:SI 105 [ a ])
        (const_int -4 [0xfffffffffffffffc])) -1
     (nil))
(insn 41 102 42 8 (set (mem/c:SI (symbol_ref:DI ("c") [flags 0x2] <var_decl
0x7ffff7ff9d80 c>) [1 c+0 S4 A32])
        (reg:SI 105 [ a ])) -1
     (expr_list:REG_DEAD (reg:SI 105 [ a ])
        (nil)))
(insn 42 41 43 8 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 94 [ d.8_13 ])
            (const_int 0 [0]))) pr68624.c:15 3 {*cmpsi_ccno_1}
     (expr_list:REG_DEAD (reg:SI 94 [ d.8_13 ])
        (nil)))
(jump_insn 43 42 52 8 (set (pc)
        (if_then_else (ne (reg:CCZ 17 flags)
                (const_int 0 [0]))
            (label_ref 52)
            (pc))) pr68624.c:15 631 {*jcc_1}
     (expr_list:REG_DEAD (reg:CCZ 17 flags)
        (int_list:REG_BR_PROB 5000 (nil)))
 -> 52)
as if_info->test_bb and
(code_label 52 43 53 10 10 "" [1 uses])
(note 53 52 101 10 [bb 10] NOTE_INSN_BASIC_BLOCK)
(insn 101 53 54 10 (set (reg:SI 105 [ a ])
        (const_int -5 [0xfffffffffffffffb])) pr68624.c:16 -1
     (nil))
(insn 54 101 55 10 (set (mem/c:SI (symbol_ref:DI ("c") [flags 0x2] <var_decl
0x7ffff7ff9d80 c>) [1 c+0 S4 A32])
        (reg:SI 105 [ a ])) pr68624.c:16 -1
     (expr_list:REG_DEAD (reg:SI 105 [ a ])
        (nil)))
as if_info->test_bb, else_bb is NULL.
emit_a is:
(set (reg:SI 107)
    (reg:SI 105 [ a ]))
where the pseudo 107 is tmp_a.  Before the patch we've emitted:
(insn 107 42 108 8 (set (reg:SI 107)
        (reg:SI 105 [ a ])) pr68624.c:16 86 {*movsi_internal}
     (nil))
(insn 108 107 109 8 (set (reg:SI 105 [ a ])
        (const_int -5 [0xfffffffffffffffb])) pr68624.c:16 86 {*movsi_internal}
     (nil))
(insn 109 108 110 8 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg:SI 94 [ d.8_13 ])
            (const_int 0 [0]))) pr68624.c:16 3 {*cmpsi_ccno_1}
     (nil))
(insn 110 109 111 8 (set (reg:SI 106)
        (if_then_else:SI (ne (reg:CCZ 17 flags)
                (const_int 0 [0]))
            (reg:SI 105 [ a ])
            (reg:SI 107))) pr68624.c:16 957 {*movsicc_noc}
     (nil))
(insn 111 110 57 8 (set (mem/c:SI (symbol_ref:DI ("c") [flags 0x2]  <var_decl
0x7f01572d1d80 c>) [1 c+0 S4 A32])
        (reg:SI 106)) pr68624.c:16 86 {*movsi_internal}
     (nil))
i.e. tmp_a has been first assigned the original value, then the 105 pseudo
changed.  But with the patch it is now broken:
(insn 107 42 108 8 (set (reg:SI 105 [ a ])
        (const_int -5 [0xfffffffffffffffb])) pr68624.c:16 86 {*movsi_internal}
     (nil))
(insn 108 107 109 8 (set (reg:SI 107)
        (reg:SI 105 [ a ])) pr68624.c:16 86 {*movsi_internal}
     (nil))
which means that the original value is unconditionally overwritten.


More information about the Gcc-bugs mailing list