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.