https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89430
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |arm Status|UNCONFIRMED |NEW Last reconfirmed| |2019-02-21 Ever confirmed|0 |1 --- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Besides of store data races the issue is that we seem to not know that a[k] doesn't trap inside cond_store_replacement because we consider loads and stores separately (as if the memory might be mapped readonly): We need to be careful with loads or stores, for instance a load might not trap, while a store would, so if we see a dominating read access this doesn't mean that a later write access would not trap. Hence we also need to differentiate the type of access(es) seen. ??? We currently are very conservative and assume that a load might trap even if a store doesn't (write-only memory). This probably is overly conservative. */ Changing the testcase to do unsigned *a; void test(unsigned k, unsigned b) { a[k] = 5; if (b < a[k]) { a[k] = b; } } generates test: .LFB0: .cfi_startproc movl $5, %eax cmpl $5, %esi movl %edi, %edi cmovnb %eax, %esi movq a(%rip), %rax movl %esi, (%rax,%rdi,4) ret