https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112494

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I almost want to say this is a bug in the x86 back-end where it pushes the
flags onto the stack.

That is:
(insn 11 8 12 2 (set (mem:DI (pre_dec:DI (reg/f:DI 7 sp)) [0  S8 A8])
        (reg:DI 17 flags))
"/opt/compiler-explorer/gcc-trunk-20231112/lib/gcc/x86_64-linux-gnu/14.0.0/include/ia32intrin.h":262:10
70 {*pushfldi2}
     (expr_list:REG_DEAD (reg:DI 17 flags)
        (nil)))
(insn 12 11 20 2 (set (reg:DI 102)
        (mem:DI (post_inc:DI (reg/f:DI 7 sp)) [0  S8 A8]))
"/opt/compiler-explorer/gcc-trunk-20231112/lib/gcc/x86_64-linux-gnu/14.0.0/include/ia32intrin.h":262:10
66 {*popdi1}
     (expr_list:REG_UNUSED (reg:DI 102)
        (nil)))
(insn 20 12 21 2 (set (reg:CCZ 17 flags)
        (compare:CCZ (reg/v:DI 98 [ flags1D.40416 ])
            (const_int 0 [0]))) "/app/example.cpp":14:15 8 {*cmpdi_ccno_1}
     (expr_list:REG_EQUAL (compare:CCZ (const_int 215 [0xd7])
            (const_int 0 [0]))
        (expr_list:REG_DEAD (reg/v:DI 98 [ flags1D.40416 ])
            (nil))))

Maybe it should be represented as:
(set (mem:DI (pre_dec:DI (reg/f:DI 7 sp)) [0  S8 A8])
        (unspec (reg:CC 17 flags) GET_EFLAGS))

Likewise for poping:
(set (reg:DI 17 flags)
        (mem:DI (post_inc:DI (reg/f:DI 7 sp)) [0  S8 A8]))
     (nil)

Should really be:
(set (reg:CC 17 flags)
        (unspec:CC (mem:DI (post_inc:DI (reg/f:DI 7 sp)) [0  S8 A8]))
SET_EFLAGS))

Reply via email to