AliasAnalysisTest.cpp 3.9 KB

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