https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116372
--- Comment #7 from Manolis Tsamis <tsamismanolis at gmail dot com> --- This looks to be the same issue with https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116405. The transformation: insn 1: (insn 12 31 13 3 (parallel [ (set (reg:DI 67 [ y_4 ]) (plus:DI (reg:DI 67 [ y_4 ]) (const_int -1 [0xffffffffffffffff]))) (clobber (reg:CC 33 %cc)) ]) "a.c":5:8 1857 {*adddi3} (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))) noce_convert_multiple_sets_1 sequence for insn 1: insn 0 (insn 52 0 53 (parallel [ (set (reg:DI 78) (plus:DI (reg:DI 67 [ y_4 ]) (const_int -1 [0xffffffffffffffff]))) (clobber (reg:CC 33 %cc)) ]) -1 (nil)) insn 1 (insn 53 52 54 (set (reg:CCS 33 %cc) (compare:CCS (reg:DI 67 [ y_4 ]) (const_int 0 [0]))) -1 (nil)) insn 2 (insn 54 53 0 (set (reg:DI 77) (if_then_else:DI (lt (reg:CCS 33 %cc) (const_int 0 [0])) (reg:DI 78) (reg:DI 67 [ y_4 ]))) -1 (nil)) insn 2: (insn 13 12 14 3 (parallel [ (set (reg:DI 67 [ y_4 ]) (ior:DI (reg:DI 67 [ y_4 ]) (const_int -16 [0xfffffffffffffff0]))) (clobber (reg:CC 33 %cc)) ]) "a.c":5:8 2022 {*iordi3} (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))) noce_convert_multiple_sets_1 sequence for insn 2: insn 0 (insn 59 0 60 (parallel [ (set (reg:DI 81) (ior:DI (reg:DI 77) (const_int -16 [0xfffffffffffffff0]))) (clobber (reg:CC 33 %cc)) ]) -1 (nil)) insn 1 (insn 60 59 61 (set (reg:CCS 33 %cc) (compare:CCS (reg:DI 67 [ y_4 ]) (const_int 0 [0]))) -1 (nil)) insn 2 (insn 61 60 0 (set (reg:DI 80) (if_then_else:DI (lt (reg:CCS 33 %cc) (const_int 0 [0])) (reg:DI 81) (reg:DI 67 [ y_4 ]))) -1 (nil)) insn 3: (insn 14 13 15 3 (parallel [ (set (reg:DI 67 [ y_4 ]) (plus:DI (reg:DI 67 [ y_4 ]) (const_int 1 [0x1]))) (clobber (reg:CC 33 %cc)) ]) "a.c":5:8 1857 {*adddi3} (expr_list:REG_UNUSED (reg:CC 33 %cc) (nil))) noce_convert_multiple_sets_1 sequence for insn 3: insn 0 (insn 64 0 65 (parallel [ (set (reg:DI 82) (plus:DI (reg:DI 80) (const_int 1 [0x1]))) (clobber (reg:CC 33 %cc)) ]) -1 (nil)) insn 1 (insn 65 64 66 (set (reg:CCS 33 %cc) (compare:CCS (reg:DI 67 [ y_4 ]) (const_int 0 [0]))) -1 (nil)) insn 2 (insn 66 65 0 (set (reg:DI 67 [ y_4 ]) (if_then_else:DI (lt (reg:CCS 33 %cc) (const_int 0 [0])) (reg:DI 82) (reg:DI 67 [ y_4 ]))) -1 (nil)) noce_convert_multiple_sets final sequence: insn 0 (insn 52 0 53 (parallel [ (set (reg:DI 78) (plus:DI (reg:DI 67 [ y_4 ]) (const_int -1 [0xffffffffffffffff]))) (clobber (reg:CC 33 %cc)) ]) -1 (nil)) insn 1 (insn 53 52 54 (set (reg:CCS 33 %cc) (compare:CCS (reg:DI 67 [ y_4 ]) (const_int 0 [0]))) -1 (nil)) insn 2 (insn 54 53 59 (set (reg:DI 77) (if_then_else:DI (lt (reg:CCS 33 %cc) (const_int 0 [0])) (reg:DI 78) (reg:DI 67 [ y_4 ]))) -1 (nil)) insn 3 (insn 59 54 60 (parallel [ (set (reg:DI 81) (ior:DI (reg:DI 77) (const_int -16 [0xfffffffffffffff0]))) (clobber (reg:CC 33 %cc)) ]) -1 (nil)) insn 4 (insn 60 59 61 (set (reg:CCS 33 %cc) (compare:CCS (reg:DI 67 [ y_4 ]) (const_int 0 [0]))) -1 (nil)) insn 5 (insn 61 60 64 (set (reg:DI 80) (if_then_else:DI (lt (reg:CCS 33 %cc) (const_int 0 [0])) (reg:DI 81) (reg:DI 67 [ y_4 ]))) -1 (nil)) insn 6 (insn 64 61 65 (parallel [ (set (reg:DI 82) (plus:DI (reg:DI 80) (const_int 1 [0x1]))) (clobber (reg:CC 33 %cc)) ]) -1 (nil)) insn 7 (insn 65 64 66 (set (reg:CCS 33 %cc) (compare:CCS (reg:DI 67 [ y_4 ]) (const_int 0 [0]))) -1 (nil)) insn 8 (insn 66 65 67 (set (reg:DI 67 [ y_4 ]) (if_then_else:DI (lt (reg:CCS 33 %cc) (const_int 0 [0])) (reg:DI 82) (reg:DI 67 [ y_4 ]))) -1 (nil)) insn 9 (insn 67 66 68 (set (reg:DI 67 [ y_4 ]) (reg:DI 77)) 1503 {*movdi_64} (nil)) insn 10 (insn 68 67 0 (set (reg:DI 67 [ y_4 ]) (reg:DI 80)) 1503 {*movdi_64} (nil)) Where it can be seen that the last two instructions in the final sequence (insn 9 and 10) overwrite the result register reg:DI 67. Due to that and similarly to PR116405 some calculations are then incorrectly optimized away.