[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