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