https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94238
--- Comment #2 from Jeffrey A. Law <law at redhat dot com> --- Just getting started here. But at least CSE seems to be doing exactly what we want. We have this going into cse1: (insn 15 14 16 4 (set (mem/c:SI (symbol_ref:DI ("c") [flags 0x2] <var_decl 0x7f642a835c60 c>) [1 c+0 S4 A32]) (const_int 1 [0x1])) "j.c":9:5 67 {*movsi_internal} (nil)) (insn 16 15 17 4 (set (reg/v:SI 94 [ l ]) (mem/c:SI (symbol_ref:DI ("e") [flags 0x2] <var_decl 0x7f642a835d80 e>) [1 e+0 S4 A32])) "j.c":14:9 67 {*movsi_internal} (nil)) (insn 17 16 18 4 (set (reg/v:SI 95 [ m ]) (mem/c:SI (symbol_ref:DI ("a") [flags 0x2] <var_decl 0x7f642a835b40 a>) [1 a+0 S4 A32])) "j.c":14:16 67 {*movsi_internal} (nil)) (insn 18 17 19 4 (set (reg:CCGC 17 flags) (compare:CCGC (reg/v:SI 94 [ l ]) (reg/v:SI 95 [ m ]))) "j.c":15:16 11 {*cmpsi_1} (nil)) (insn 19 18 20 4 (set (reg:QI 103) (lt:QI (reg:CCGC 17 flags) (const_int 0 [0]))) "j.c":15:16 732 {*setcc_qi} (nil)) (insn 20 19 21 4 (set (reg:CCGC 17 flags) (compare:CCGC (reg/v:SI 94 [ l ]) (reg/v:SI 95 [ m ]))) "j.c":15:20 11 {*cmpsi_1} (nil)) When processing reg18 we record that (reg 17) has the same value as (compare (reg 94) (reg 95)). When we start processing insn 20, we find that equivalence. So if we conceptually replace the RHS of insn 20 with (reg 17) it becomes a nop-set which is now discovered. This results in cse removing insn 20. This is good :-) Introduction of the LTGT happens somewhere in combine. I'm still digging into that.