https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86438
Uroš Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2018-07-09 Ever confirmed|0 |1 --- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> --- Looks like postreload cmp elimitation pass is at fault. It converts: (insn 64 63 76 2 (parallel [ (set (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]) (plus:DI (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]) (const_int 5 [0x5]))) (clobber (reg:CC 17 flags)) ]) "pr86438.c":17 232 {*adddi_1} (nil)) (insn 76 64 77 2 (set (reg:DI 4 si [orig:88 _2 ] [88]) (const_int 0 [0])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 77 76 14 2 (set (reg:DI 5 di [ _2+8 ]) (const_int 0 [0])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 14 77 15 2 (set (reg:DI 4 si [orig:88 _2 ] [88]) (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 15 14 66 2 (set (reg:DI 5 di [ _2+8 ]) (const_int 0 [0])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 66 15 67 2 (set (reg:CC 17 flags) (compare:CC (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]) (reg:DI 4 si [orig:88 _2 ] [88]))) "pr86438.c":18 12 {*cmpdi_1} (nil)) (note 67 66 78 2 NOTE_INSN_DELETED) (insn 78 67 79 2 (set (reg:QI 2 cx [orig:96 _11+8 ] [96]) (ltu:QI (reg:CC 17 flags) (const_int 0 [0]))) "pr86438.c":18 700 {*setcc_qi} (nil)) to: (insn 64 63 76 2 (parallel [ (set (reg:CCC 17 flags) (compare:CCC (plus:DI (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]) (const_int 5 [0x5])) (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]))) (set (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]) (plus:DI (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94]) (const_int 5 [0x5]))) ]) "pr86438.c":17 346 {*adddi3_cc_overflow_1} (nil)) (insn 76 64 77 2 (set (reg:DI 4 si [orig:88 _2 ] [88]) (const_int 0 [0])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 77 76 14 2 (set (reg:DI 5 di [ _2+8 ]) (const_int 0 [0])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 14 77 15 2 (set (reg:DI 4 si [orig:88 _2 ] [88]) (reg:DI 0 ax [orig:94 iftmp.0_9 ] [94])) "pr86438.c":18 85 {*movdi_internal} (nil)) (insn 15 14 67 2 (set (reg:DI 5 di [ _2+8 ]) (const_int 0 [0])) "pr86438.c":18 85 {*movdi_internal} (nil)) (note 67 15 78 2 NOTE_INSN_DELETED) (insn 78 67 79 2 (set (reg:QI 2 cx [orig:96 _11+8 ] [96]) (ltu:QI (reg:CCC 17 flags) (const_int 0 [0]))) "pr86438.c":18 700 {*setcc_qi} (nil)) Please note that (insn 66) is deleted and (insn 64) gets converted to an insn that sets flags reg in CCCmode (where only carry flag is valid). The original sequence sets flags reg in CCmode (where all flags are valid), so these two sequences are not identical. Adding -fno-compare-elim fixes the test.