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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
We also use magic alias set e.g. directly in RTL DSE
(ALIAS_SET_MEMORY_BARRIER).

Anyway, there are multiple MEMs that need to be treated specially.  For the TLS
cases, it is e.g. on x86_64:
(insn 15 27 16 2 (parallel [
            (set (reg:CCZ 17 flags)
                (unspec:CCZ [
                        (mem/v/f/c:DI (plus:DI (reg/f:DI 19 frame)
                                (const_int -8 [0xfffffffffffffff8])) [3
D.1946+0 S8 A64])
                        (mem/f:DI (const_int 40 [0x28]) [4
MEM[(<address-space-1> long unsigned int *)40B]+0 S8 A64 AS1])
                    ] UNSPEC_SP_TEST))
            (clobber (scratch:DI))
        ]) "pr87370.c":23:1 978 {stack_protect_test_di}
     (nil))

so there is MEM_VOLATILE_P stack canary MEM where we could use a special
MEM_EXPR, after all, we apparently already have there a VAR_DECL, and can
check that in crtl->stack_protect_guard, so this part shouldn't be that hard,
except that we for some strange reason treat all volatile reads as killing
everything, so we'd need to ignore MEM_VOLATILE_P for that special case.  The
initial set ssp is a store to a volatile mem, so perhaps just ignoring such
MEMs altogether would DTRT.
The next thing is the TLS MEM, which has some MEM_EXPR in there (and isn't
volatile).  Can that use some magic VAR_DECL in MEM_EXPR instead of the
expression it uses?  It is weird that outside of MEM_EXPR it actually doesn't
record anywhere that it is another address space.  Can we ignore this MEM
altogether too?

Finally, with -mstack-protector-guard=global, we have e.g.:
(insn 13 25 14 2 (parallel [
            (set (reg:CCZ 17 flags)
                (unspec:CCZ [
                        (mem/v/f/c:DI (plus:DI (reg/f:DI 19 frame)
                                (const_int -8 [0xfffffffffffffff8])) [3
D.1946+0 S8 A64])
                        (mem/v/f/c:DI (symbol_ref:DI ("__stack_chk_guard")
[flags 0x40]  <var_decl 0x7f348fa555a0 __stack_chk_guard>) [3 __stack_ch
k_guard+0 S8 A64])
                    ] UNSPEC_SP_TEST))
            (clobber (scratch:DI))
        ]) "pr87370.c":23:1 978 {stack_protect_test_di}
     (nil))

so there is yet another MEM_VOLATILE_P memory.  Wonder why we are so
conservative about the volatile MEM reads, e.g. for a volatile MEM read from a
var I don't see why it should kill frame related stores.

Reply via email to