https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117095
--- Comment #2 from Stefan Schulze Frielinghaus <stefansf at gcc dot gnu.org> --- Prior cse2 we have (jump_insn 217 78 216 10 (parallel [ (set (pc) (if_then_else (ne (reg:SI 165) (const_int 1 [0x1])) (label_ref 216) (pc))) (set (reg:SI 165) (plus:SI (reg:SI 165) (const_int -1 [0xffffffffffffffff]))) (clobber (scratch:SI)) (clobber (reg:CC 33 %cc)) ]) "t.c":14:17 discrim 1 2192 {doloop_si64} (int_list:REG_BR_PROB 955630228 (nil)) -> 216) ... (insn 99 98 100 12 (set (reg:SI 138) (const_int 1 [0x1])) "t.c":9:31 1507 {*movsi_zarch} (nil)) (insn 100 99 103 12 (parallel [ (set (reg:SI 137) (minus:SI (reg:SI 138) (subreg:SI (reg:HI 135 [ a ]) 0))) (clobber (reg:CC 33 %cc)) ]) "t.c":9:31 1904 {*subsi3} (expr_list:REG_DEAD (reg:SI 138) (expr_list:REG_DEAD (reg:HI 135 [ a ]) (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))))) where insn 100 computes 1-a. After cse2 insn 99 is removed and pseudo 138 is replaced with the branch-on-count pseudo 165 from jump_insn 217: (insn 100 98 103 12 (parallel [ (set (reg:SI 137) (minus:SI (reg:SI 165) (subreg:SI (reg:HI 135 [ a ]) 0))) (clobber (reg:CC 33 %cc)) ]) "t.c":9:31 1904 {*subsi3} (expr_list:REG_DEAD (reg:SI 138) (expr_list:REG_DEAD (reg:HI 135 [ a ]) (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))))) However, pseudo 165 is always 0 which means the result of the subtraction is also always 0 since variable `a` is always 0. Looks like cse2 missed that in the parallel pseudo 165 is decreased.