[llvm] r234811 - Make getModRefInfo with a default location not crash.

Benjamin Kramer benny.kra at gmail.com
Tue Apr 14 09:45:49 PDT 2015


> On 14.04.2015, at 00:05, 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)
> +  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;

Isn't this just 'return MRB & ModRef'?

- Ben

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





More information about the llvm-commits mailing list