From 5a10d127b959133dc17e7ab1a0b4a25ab16f8668 Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Wed, 15 Aug 2018 06:21:02 +0000 Subject: [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 --- llvm/lib/Analysis/AliasSetTracker.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Analysis/AliasSetTracker.cpp') 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()); + if (!MayWriteMemory) { Alias = SetMayAlias; Access |= RefAccess; return; -- cgit v1.2.3