summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/AliasSetTracker.cpp
diff options
context:
space:
mode:
authorMax Kazantsev <max.kazantsev@azul.com>2018-08-15 06:21:02 +0000
committerMax Kazantsev <max.kazantsev@azul.com>2018-08-15 06:21:02 +0000
commit5a10d127b959133dc17e7ab1a0b4a25ab16f8668 (patch)
treee5139f256e859d0040210d6fdc02ca3cdd2729d8 /llvm/lib/Analysis/AliasSetTracker.cpp
parent530b8d1c3d6a316b1e7c33471a38bc4d7dfb56dd (diff)
downloadbcm5719-llvm-5a10d127b959133dc17e7ab1a0b4a25ab16f8668.tar.gz
bcm5719-llvm-5a10d127b959133dc17e7ab1a0b4a25ab16f8668.zip
[AliasSetTracker] Do not treat experimental_guard intrinsic as memory writing instruction
The `experimental_guard` intrinsic has memory write semantics to model the thread-exiting logic, but does not do any actual writes to memory. Currently, `AliasSetTracker` treats it as a normal memory write. As result, a loop-invariant load cannot be hoisted out of loop because the guard may possibly alias with it. This patch makes `AliasSetTracker` so that it doesn't treat guards as memory writes. Differential Revision: https://reviews.llvm.org/D50497 Reviewed By: reames llvm-svn: 339753
Diffstat (limited to 'llvm/lib/Analysis/AliasSetTracker.cpp')
-rw-r--r--llvm/lib/Analysis/AliasSetTracker.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/AliasSetTracker.cpp b/llvm/lib/Analysis/AliasSetTracker.cpp
index 65b61e40ddf..1a495ec3000 100644
--- a/llvm/lib/Analysis/AliasSetTracker.cpp
+++ b/llvm/lib/Analysis/AliasSetTracker.cpp
@@ -24,6 +24,7 @@
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
+#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Value.h"
#include "llvm/Pass.h"
#include "llvm/Support/AtomicOrdering.h"
@@ -169,7 +170,12 @@ void AliasSet::addUnknownInst(Instruction *I, AliasAnalysis &AA) {
addRef();
UnknownInsts.emplace_back(I);
- if (!I->mayWriteToMemory()) {
+ // Guards are marked as modifying memory for control flow modelling purposes,
+ // but don't actually modify any specific memory location.
+ using namespace PatternMatch;
+ bool MayWriteMemory = I->mayWriteToMemory() &&
+ !match(I, m_Intrinsic<Intrinsic::experimental_guard>());
+ if (!MayWriteMemory) {
Alias = SetMayAlias;
Access |= RefAccess;
return;
OpenPOWER on IntegriCloud