Make getModRefInfo(Instruction *) not crash on certain types of instructions
authorDaniel Berlin <dberlin@dberlin.org>
Tue, 28 Apr 2015 19:19:14 +0000 (19:19 +0000)
committerDaniel Berlin <dberlin@dberlin.org>
Tue, 28 Apr 2015 19:19:14 +0000 (19:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236023 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/AliasAnalysis.cpp
unittests/Analysis/AliasAnalysisTest.cpp

index 43db1763bbbce87a5e7dbd79f8d77626e7ba6ea1..1ee60ff1a307aa7a312193252450a377f1922558 100644 (file)
@@ -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;
index 1ba396c1ecae4c7824b15a621e8b292684bd7ef4..66ed4637c7ae5f0408956cc3274d6d0fee7aa4de 100644 (file)
@@ -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