diff options
author | Philip Reames <listmail@philipreames.com> | 2019-03-19 18:27:18 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2019-03-19 18:27:18 +0000 |
commit | db65a5b776f20795df41741bc7042d6b61070886 (patch) | |
tree | 0f3b66a9bd3e3ad43733c3fffa5b3fc69c2dee84 /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | |
parent | c3608fc0d6e992cf8eb0eff1fab021eca85e41ca (diff) | |
download | bcm5719-llvm-db65a5b776f20795df41741bc7042d6b61070886.tar.gz bcm5719-llvm-db65a5b776f20795df41741bc7042d6b61070886.zip |
Allow unordered loads to be considered invariant in CodeGen
The actual code change is fairly straight forward, but exercising it isn't. First, it turned out we weren't adding the appropriate flags in SelectionDAG. Second, it turned out that we've got some optimization gaps, so obvious test cases don't work.
My first attempt (in atomic-unordered.ll) points out a deficiency in our peephole-opt folding logic which I plan to fix separately. Instead, I'm exercising this through MachineLICM.
Differential Revision: https://reviews.llvm.org/D59375
llvm-svn: 356494
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 3aedee8db0b..6d7f2840adf 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -4564,6 +4564,11 @@ void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) { auto Flags = MachineMemOperand::MOLoad; if (I.isVolatile()) Flags |= MachineMemOperand::MOVolatile; + if (I.getMetadata(LLVMContext::MD_invariant_load) != nullptr) + Flags |= MachineMemOperand::MOInvariant; + if (isDereferenceablePointer(I.getPointerOperand(), DAG.getDataLayout())) + Flags |= MachineMemOperand::MODereferenceable; + Flags |= TLI.getMMOFlags(I); MachineMemOperand *MMO = |