[Bug target/94238] [10 Regression] ICE in ix86_cc_mode, at config/i386/i386.c:15285 since r10-7268-g529ea7d9596b26ba

law at redhat dot com gcc-bugzilla@gcc.gnu.org
Fri Mar 20 18:10:07 GMT 2020


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.


More information about the Gcc-bugs mailing list