At the moment, we mark every atomic memory access as being also volatile. This is unnecessarily conservative and prohibits many legal transforms (DCE, folding, etc..).
The intention is to apply this patch as an NFC. (i.e. there should be no change in behaviour associated with this patch) Once it's in and baked for a bit, we'll start working through removing unnecessary bailouts one by one. We applied this same strategy to the middle end a few years ago, with good success.
To make sure this patch itself is NFC, it is build on top of a series of other patches which adjust code to (for the moment) be as conservative for an atomic access as for a volatile access and build up a test corpus (mostly in test/CodeGen/X86/atomics-unordered.ll)..
* D57593 Fix a bug in the definition of isUnordered on MachineMemOperand
* D57596 [CodeGen] Be conservative about atomic accesses as for volatile
* D57802 Be conservative about unordered accesses for the moment
* rL353959: [Tests] First batch of cornercase tests for unordered atomics.
* rL353966: [Tests] RMW folding tests w/unordered atomic operations.
* rL353972: [Tests] More unordered atomic lowering tests.
* rL353989: [SelectionDAG] Inline a single use helper function, and remove last non-MMO interface
* rL354740: [Hexagon, SystemZ] Be super conservative about atomics
* rL354800: [Lanai] Be super conservative about atomics
* rL354845: [ARM] Be super conservative about atomics
Attention Out of Tree Backend Owners: This patch may break you. If it does, you can use the TLI getMMOFlags hook to restore the MOVolatile to any instruction you need to. (I will also send a PSA to llvm-dev when this lands.)
Work planned for once this is in, and has baked for a bit:
* working through all of the TODOs in terms of code quality in the added tests
* D57803 [X86][GlobalISEL] Support lowering aligned unordered atomics
* ImplicitNullCheck for unordered loads
* load folding for unordered loads
* store folding for unordered stores
* load/store unfolding
* review of the other conservative bails outs inserted in pre-work for this patch