<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>