From b1e1aa04edf7d4d0139e13363f52fce06b81d58f Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Tue, 28 Apr 2015 19:19:14 +0000 Subject: [PATCH] Make getModRefInfo(Instruction *) not crash on certain types of instructions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236023 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/AliasAnalysis.cpp | 23 +++++++++++++---------- unittests/Analysis/AliasAnalysisTest.cpp | 10 ++++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index 43db1763bbb..1ee60ff1a30 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -379,15 +379,18 @@ AliasAnalysis::getModRefInfo(const StoreInst *S, const Location &Loc) { AliasAnalysis::ModRefResult AliasAnalysis::getModRefInfo(const VAArgInst *V, const Location &Loc) { - // If the va_arg address cannot alias the pointer in question, then the - // specified memory cannot be accessed by the va_arg. - if (!alias(getLocation(V), Loc)) - return NoModRef; - // If the pointer is a pointer to constant memory, then it could not have been - // modified by this va_arg. - if (pointsToConstantMemory(Loc)) - return NoModRef; + if (Loc.Ptr) { + // If the va_arg address cannot alias the pointer in question, then the + // specified memory cannot be accessed by the va_arg. + if (!alias(getLocation(V), Loc)) + return NoModRef; + + // If the pointer is a pointer to constant memory, then it could not have + // been modified by this va_arg. + if (pointsToConstantMemory(Loc)) + return NoModRef; + } // Otherwise, a va_arg reads and writes. return ModRef; @@ -400,7 +403,7 @@ AliasAnalysis::getModRefInfo(const AtomicCmpXchgInst *CX, const Location &Loc) { return ModRef; // If the cmpxchg address does not alias the location, it does not access it. - if (!alias(getLocation(CX), Loc)) + if (Loc.Ptr && !alias(getLocation(CX), Loc)) return NoModRef; return ModRef; @@ -413,7 +416,7 @@ AliasAnalysis::getModRefInfo(const AtomicRMWInst *RMW, const Location &Loc) { return ModRef; // If the atomicrmw address does not alias the location, it does not access it. - if (!alias(getLocation(RMW), Loc)) + if (Loc.Ptr && !alias(getLocation(RMW), Loc)) return NoModRef; return ModRef; diff --git a/unittests/Analysis/AliasAnalysisTest.cpp b/unittests/Analysis/AliasAnalysisTest.cpp index 1ba396c1eca..66ed4637c7a 100644 --- a/unittests/Analysis/AliasAnalysisTest.cpp +++ b/unittests/Analysis/AliasAnalysisTest.cpp @@ -81,6 +81,13 @@ TEST_F(AliasAnalysisTest, getModRefInfo) { auto *Store1 = new StoreInst(Value, Addr, BB); auto *Load1 = new LoadInst(Addr, "load", BB); auto *Add1 = BinaryOperator::CreateAdd(Value, Value, "add", BB); + auto *VAArg1 = new VAArgInst(Addr, PtrType, "vaarg", BB); + auto *CmpXChg1 = new AtomicCmpXchgInst(Addr, ConstantInt::get(IntType, 0), + ConstantInt::get(IntType, 1), + Monotonic, Monotonic, CrossThread, BB); + auto *AtomicRMW = + new AtomicRMWInst(AtomicRMWInst::Xchg, Addr, ConstantInt::get(IntType, 1), + Monotonic, CrossThread, BB); ReturnInst::Create(C, nullptr, BB); @@ -88,6 +95,9 @@ TEST_F(AliasAnalysisTest, getModRefInfo) { CheckModRef(Store1, AliasAnalysis::ModRefResult::Mod); CheckModRef(Load1, AliasAnalysis::ModRefResult::Ref); CheckModRef(Add1, AliasAnalysis::ModRefResult::NoModRef); + CheckModRef(VAArg1, AliasAnalysis::ModRefResult::ModRef); + CheckModRef(CmpXChg1, AliasAnalysis::ModRefResult::ModRef); + CheckModRef(AtomicRMW, AliasAnalysis::ModRefResult::ModRef); } } // end anonymous namspace