[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