<div dir="ltr"><div class="gmail_quote">On Mon, Apr 13, 2015 at 4:12 PM Daniel Berlin <<a href="mailto:dberlin@dberlin.org">dberlin@dberlin.org</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dannyb<br>
Date: Mon Apr 13 18:05:45 2015<br>
New Revision: 234811<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=234811&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=234811&view=rev</a><br>
Log:<br>
Make getModRefInfo with a default location not crash.<br>
Add getModRefInfo that works without location.<br>
Add unit tests.<br>
<br>
Added:<br>
    llvm/trunk/unittests/Analysis/AliasAnalysisTest.cpp<br>
Modified:<br>
    llvm/trunk/include/llvm/Analysis/AliasAnalysis.h<br>
    llvm/trunk/lib/Analysis/AliasAnalysis.cpp<br>
    llvm/trunk/unittests/Analysis/CMakeLists.txt<br>
<br>
Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=234811&r1=234810&r2=234811&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=234811&r1=234810&r2=234811&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original)<br>
+++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Mon Apr 13 18:05:45 2015<br>
@@ -352,6 +352,24 @@ public:<br>
     return (MRB & ModRef) && (MRB & ArgumentPointees);<br>
   }<br>
<br>
+  /// getModRefInfo - Return information about whether or not an<br>
+  /// instruction may read or write memory (without regard to a<br>
+  /// specific location)<br></blockquote><div><br></div><div>Please follow the new doxygen coding standards.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  ModRefResult getModRefInfo(const Instruction *I) {<br>
+    if (auto CS = ImmutableCallSite(I)) {<br>
+      auto MRB = getModRefBehavior(CS);<br>
+      if (MRB & ModRef)<br>
+        return ModRef;<br>
+      else if (MRB & Ref)<br>
+        return Ref;<br>
+      else if (MRB & Mod)<br>
+        return Mod;<br>
+      return NoModRef;<br></blockquote><div><br></div><div>As commented in other threads, please no else after returns.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    }<br>
+<br>
+    return getModRefInfo(I, Location());<br>
+  }<br>
+<br>
   /// getModRefInfo - Return information about whether or not an instruction may<br>
   /// read or write the specified memory location.  An instruction<br>
   /// that doesn't read or write memory may be trivially LICM'd for example.<br>
<br>
Modified: llvm/trunk/lib/Analysis/AliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=234811&r1=234810&r2=234811&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=234811&r1=234810&r2=234811&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Mon Apr 13 18:05:45 2015<br>
@@ -330,7 +330,7 @@ AliasAnalysis::getModRefInfo(const LoadI<br>
<br>
   // If the load address doesn't alias the given address, it doesn't read<br>
   // or write the specified memory.<br>
-  if (!alias(getLocation(L), Loc))<br>
+  if (Loc.Ptr && !alias(getLocation(L), Loc))<br>
     return NoModRef;<br>
<br>
   // Otherwise, a load just reads.<br>
@@ -343,15 +343,18 @@ AliasAnalysis::getModRefInfo(const Store<br>
   if (!S->isUnordered())<br>
     return ModRef;<br>
<br>
-  // If the store address cannot alias the pointer in question, then the<br>
-  // specified memory cannot be modified by the store.<br>
-  if (!alias(getLocation(S), Loc))<br>
-    return NoModRef;<br>
+  if (Loc.Ptr) {<br>
+    // If the store address cannot alias the pointer in question, then the<br>
+    // specified memory cannot be modified by the store.<br>
+    if (!alias(getLocation(S), Loc))<br>
+      return NoModRef;<br>
+<br>
+    // If the pointer is a pointer to constant memory, then it could not have<br>
+    // been modified by this store.<br>
+    if (pointsToConstantMemory(Loc))<br>
+      return NoModRef;<br>
<br>
-  // If the pointer is a pointer to constant memory, then it could not have been<br>
-  // modified by this store.<br>
-  if (pointsToConstantMemory(Loc))<br>
-    return NoModRef;<br>
+  }<br>
<br>
   // Otherwise, a store just writes.<br>
   return Mod;<br>
<br>
Added: llvm/trunk/unittests/Analysis/AliasAnalysisTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/AliasAnalysisTest.cpp?rev=234811&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/AliasAnalysisTest.cpp?rev=234811&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/Analysis/AliasAnalysisTest.cpp (added)<br>
+++ llvm/trunk/unittests/Analysis/AliasAnalysisTest.cpp Mon Apr 13 18:05:45 2015<br>
@@ -0,0 +1,94 @@<br>
+//===--- AliasAnalysisTest.cpp - Mixed TBAA unit tests --------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm/Analysis/AliasAnalysis.h"<br>
+#include "llvm/Analysis/Passes.h"<br>
+#include "llvm/IR/Constants.h"<br>
+#include "llvm/IR/Instructions.h"<br>
+#include "llvm/IR/LLVMContext.h"<br>
+#include "llvm/IR/Module.h"<br>
+#include "llvm/IR/LegacyPassManager.h"<br>
+#include "llvm/Support/CommandLine.h"<br>
+#include "gtest/gtest.h"<br>
+<br>
+namespace llvm {<br>
+namespace {<br>
+<br>
+class AliasAnalysisTest : public testing::Test {<br>
+protected:<br>
+  AliasAnalysisTest() : M("AliasAnalysisTBAATest", C) {}<br>
+<br>
+  // This is going to check that calling getModRefInfo without a location, and<br>
+  // with a default location, first, doesn't crash, and second, gives the right<br>
+  // answer.<br>
+  void CheckModRef(Instruction *I, AliasAnalysis::ModRefResult Result) {<br>
+    static char ID;<br>
+    class CheckModRefTestPass : public FunctionPass {<br>
+    public:<br>
+      CheckModRefTestPass(Instruction *I, AliasAnalysis::ModRefResult Result)<br>
+          : FunctionPass(ID), ExpectResult(Result), I(I) {}<br>
+      static int initialize() {<br>
+        PassInfo *PI = new PassInfo("CheckModRef testing pass", "", &ID,<br>
+                                    nullptr, true, true);<br>
+        PassRegistry::getPassRegistry()->registerPass(*PI, false);<br>
+        initializeAliasAnalysisAnalysisGroup(*PassRegistry::getPassRegistry());<br>
+        initializeBasicAliasAnalysisPass(*PassRegistry::getPassRegistry());<br>
+        return 0;<br>
+      }<br>
+      void getAnalysisUsage(AnalysisUsage &AU) const override {<br>
+        AU.setPreservesAll();<br>
+        AU.addRequiredTransitive<AliasAnalysis>();<br>
+      }<br>
+      bool runOnFunction(Function &) override {<br>
+        AliasAnalysis &AA = getAnalysis<AliasAnalysis>();<br>
+        EXPECT_EQ(AA.getModRefInfo(I, AliasAnalysis::Location()), ExpectResult);<br>
+        EXPECT_EQ(AA.getModRefInfo(I), ExpectResult);<br>
+        return false;<br>
+      }<br>
+      AliasAnalysis::ModRefResult ExpectResult;<br>
+      Instruction *I;<br>
+    };<br>
+    static int initialize = CheckModRefTestPass::initialize();<br>
+    (void)initialize;<br>
+    CheckModRefTestPass *P = new CheckModRefTestPass(I, Result);<br>
+    legacy::PassManager PM;<br>
+    PM.add(createBasicAliasAnalysisPass());<br>
+    PM.add(P);<br>
+    PM.run(M);<br>
+  }<br>
+<br>
+  LLVMContext C;<br>
+  Module M;<br>
+};<br>
+<br>
+TEST_F(AliasAnalysisTest, getModRefInfo) {<br>
+  // Setup function.<br>
+  FunctionType *FTy =<br>
+      FunctionType::get(Type::getVoidTy(C), std::vector<Type *>(), false);<br>
+  auto *F = cast<Function>(M.getOrInsertFunction("f", FTy));<br>
+  auto *BB = BasicBlock::Create(C, "entry", F);<br>
+  auto IntType = Type::getInt32Ty(C);<br>
+  auto PtrType = Type::getInt32PtrTy(C);<br>
+  auto *Value = ConstantInt::get(IntType, 42);<br>
+  auto *Addr = ConstantPointerNull::get(PtrType);<br>
+<br>
+  auto *Store1 = new StoreInst(Value, Addr, BB);<br>
+  auto *Load1 = new LoadInst(Addr, "load", BB);<br>
+  auto *Add1 = BinaryOperator::CreateAdd(Value, Value, "add", BB);<br>
+<br>
+  ReturnInst::Create(C, nullptr, BB);<br>
+<br>
+  // Check basic results<br>
+  CheckModRef(Store1, AliasAnalysis::ModRefResult::Mod);<br>
+  CheckModRef(Load1, AliasAnalysis::ModRefResult::Ref);<br>
+  CheckModRef(Add1, AliasAnalysis::ModRefResult::NoModRef);<br>
+}<br>
+<br>
+} // end anonymous namspace<br>
+} // end llvm namespace<br>
<br>
Modified: llvm/trunk/unittests/Analysis/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/CMakeLists.txt?rev=234811&r1=234810&r2=234811&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/CMakeLists.txt?rev=234811&r1=234810&r2=234811&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/Analysis/CMakeLists.txt (original)<br>
+++ llvm/trunk/unittests/Analysis/CMakeLists.txt Mon Apr 13 18:05:45 2015<br>
@@ -7,6 +7,7 @@ set(LLVM_LINK_COMPONENTS<br>
   )<br>
<br>
 add_llvm_unittest(AnalysisTests<br>
+  AliasAnalysisTest.cpp<br>
   CallGraphTest.cpp<br>
   CFGTest.cpp<br>
   LazyCallGraphTest.cpp<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>