1//===--- AliasAnalysisTest.cpp - Mixed TBAA unit tests --------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Analysis/AliasAnalysis.h"
11#include "llvm/Analysis/Passes.h"
12#include "llvm/IR/Constants.h"
13#include "llvm/IR/Instructions.h"
14#include "llvm/IR/LLVMContext.h"
15#include "llvm/IR/Module.h"
16#include "llvm/IR/LegacyPassManager.h"
17#include "llvm/Support/CommandLine.h"
18#include "gtest/gtest.h"
19
20namespace llvm {
21namespace {
22
23class AliasAnalysisTest : public testing::Test {
24protected:
25  AliasAnalysisTest() : M("AliasAnalysisTBAATest", C) {}
26
27  // This is going to check that calling getModRefInfo without a location, and
28  // with a default location, first, doesn't crash, and second, gives the right
29  // answer.
30  void CheckModRef(Instruction *I, AliasAnalysis::ModRefResult Result) {
31    static char ID;
32    class CheckModRefTestPass : public FunctionPass {
33    public:
34      CheckModRefTestPass(Instruction *I, AliasAnalysis::ModRefResult Result)
35          : FunctionPass(ID), ExpectResult(Result), I(I) {}
36      static int initialize() {
37        PassInfo *PI = new PassInfo("CheckModRef testing pass", "", &ID,
38                                    nullptr, true, true);
39        PassRegistry::getPassRegistry()->registerPass(*PI, false);
40        initializeAliasAnalysisAnalysisGroup(*PassRegistry::getPassRegistry());
41        initializeBasicAliasAnalysisPass(*PassRegistry::getPassRegistry());
42        return 0;
43      }
44      void getAnalysisUsage(AnalysisUsage &AU) const override {
45        AU.setPreservesAll();
46        AU.addRequiredTransitive<AliasAnalysis>();
47      }
48      bool runOnFunction(Function &) override {
49        AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
50        EXPECT_EQ(AA.getModRefInfo(I, AliasAnalysis::Location()), ExpectResult);
51        EXPECT_EQ(AA.getModRefInfo(I), ExpectResult);
52        return false;
53      }
54      AliasAnalysis::ModRefResult ExpectResult;
55      Instruction *I;
56    };
57    static int initialize = CheckModRefTestPass::initialize();
58    (void)initialize;
59    CheckModRefTestPass *P = new CheckModRefTestPass(I, Result);
60    legacy::PassManager PM;
61    PM.add(createBasicAliasAnalysisPass());
62    PM.add(P);
63    PM.run(M);
64  }
65
66  LLVMContext C;
67  Module M;
68};
69
70TEST_F(AliasAnalysisTest, getModRefInfo) {
71  // Setup function.
72  FunctionType *FTy =
73      FunctionType::get(Type::getVoidTy(C), std::vector<Type *>(), false);
74  auto *F = cast<Function>(M.getOrInsertFunction("f", FTy));
75  auto *BB = BasicBlock::Create(C, "entry", F);
76  auto IntType = Type::getInt32Ty(C);
77  auto PtrType = Type::getInt32PtrTy(C);
78  auto *Value = ConstantInt::get(IntType, 42);
79  auto *Addr = ConstantPointerNull::get(PtrType);
80
81  auto *Store1 = new StoreInst(Value, Addr, BB);
82  auto *Load1 = new LoadInst(Addr, "load", BB);
83  auto *Add1 = BinaryOperator::CreateAdd(Value, Value, "add", BB);
84
85  ReturnInst::Create(C, nullptr, BB);
86
87  // Check basic results
88  CheckModRef(Store1, AliasAnalysis::ModRefResult::Mod);
89  CheckModRef(Load1, AliasAnalysis::ModRefResult::Ref);
90  CheckModRef(Add1, AliasAnalysis::ModRefResult::NoModRef);
91}
92
93} // end anonymous namspace
94} // end llvm namespace
95