diff options
author | Anna Thomas <anna@azul.com> | 2016-08-09 20:00:47 +0000 |
---|---|---|
committer | Anna Thomas <anna@azul.com> | 2016-08-09 20:00:47 +0000 |
commit | b2d12b81c34a14a29cd12d1a597f49b344de7a07 (patch) | |
tree | 2f60e4264509a91add3b2f503de90a048ea1818e /llvm/lib | |
parent | 6b1f5f891fcb3b3d513e8935d3c7b4b5151217a8 (diff) | |
download | bcm5719-llvm-b2d12b81c34a14a29cd12d1a597f49b344de7a07.tar.gz bcm5719-llvm-b2d12b81c34a14a29cd12d1a597f49b344de7a07.zip |
[EarlyCSE] Teach about CSE'ing over invariant.start intrinsics
Summary:
Teach EarlyCSE about invariant.start intrinsic. Specifically, we can perform
store-load, load-load forwarding over this call.
Reviewers: majnemer, reames, dberlin, sanjoy
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D23268
llvm-svn: 278153
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/EarlyCSE.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp index 6376aae5cbd..0a8a7508c19 100644 --- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp +++ b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp @@ -562,6 +562,19 @@ bool EarlyCSE::processNode(DomTreeNode *Node) { continue; } + // Skip invariant.start intrinsics since they only read memory, and we can + // forward values across it. Also, we dont need to consume the last store + // since the semantics of invariant.start allow us to perform DSE of the + // last store, if there was a store following invariant.start. Consider: + // + // store 30, i8* p + // invariant.start(p) + // store 40, i8* p + // We can DSE the store to 30, since the store 40 to invariant location p + // causes undefined behaviour. + if (match(Inst, m_Intrinsic<Intrinsic::invariant_start>())) + continue; + if (match(Inst, m_Intrinsic<Intrinsic::experimental_guard>())) { if (auto *CondI = dyn_cast<Instruction>(cast<CallInst>(Inst)->getArgOperand(0))) { |