diff options
Diffstat (limited to 'unittests/IR/DominatorTreeTest.cpp')
-rw-r--r-- | unittests/IR/DominatorTreeTest.cpp | 129 |
1 files changed, 59 insertions, 70 deletions
diff --git a/unittests/IR/DominatorTreeTest.cpp b/unittests/IR/DominatorTreeTest.cpp index 498e111a31f6..d2062839a734 100644 --- a/unittests/IR/DominatorTreeTest.cpp +++ b/unittests/IR/DominatorTreeTest.cpp @@ -7,30 +7,73 @@ // //===----------------------------------------------------------------------===// -#include "llvm/IR/Dominators.h" #include "llvm/Analysis/PostDominators.h" #include "llvm/AsmParser/Parser.h" #include "llvm/IR/Constants.h" +#include "llvm/IR/Dominators.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" -#include "llvm/IR/LegacyPassManager.h" #include "llvm/Support/SourceMgr.h" #include "gtest/gtest.h" using namespace llvm; -namespace llvm { - void initializeDPassPass(PassRegistry&); - - namespace { - struct DPass : public FunctionPass { - static char ID; - bool runOnFunction(Function &F) override { - DominatorTree *DT = - &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); - PostDominatorTree *PDT = - &getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree(); +/// Build the dominator tree for the function and run the Test. +static void +runWithDomTree(Module &M, StringRef FuncName, + function_ref<void(Function &F, DominatorTree *DT, + DominatorTreeBase<BasicBlock> *PDT)> + Test) { + auto *F = M.getFunction(FuncName); + ASSERT_NE(F, nullptr) << "Could not find " << FuncName; + // Compute the dominator tree for the function. + DominatorTree DT(*F); + DominatorTreeBase<BasicBlock> PDT(/*isPostDom*/ true); + PDT.recalculate(*F); + Test(*F, &DT, &PDT); +} + +static std::unique_ptr<Module> makeLLVMModule(LLVMContext &Context, + StringRef ModuleStr) { + SMDiagnostic Err; + std::unique_ptr<Module> M = parseAssemblyString(ModuleStr, Err, Context); + assert(M && "Bad assembly?"); + return M; +} + +TEST(DominatorTree, Unreachable) { + StringRef ModuleString = + "declare i32 @g()\n" + "define void @f(i32 %x) personality i32 ()* @g {\n" + "bb0:\n" + " %y1 = add i32 %x, 1\n" + " %y2 = add i32 %x, 1\n" + " %y3 = invoke i32 @g() to label %bb1 unwind label %bb2\n" + "bb1:\n" + " %y4 = add i32 %x, 1\n" + " br label %bb4\n" + "bb2:\n" + " %y5 = landingpad i32\n" + " cleanup\n" + " br label %bb4\n" + "bb3:\n" + " %y6 = add i32 %x, 1\n" + " %y7 = add i32 %x, 1\n" + " ret void\n" + "bb4:\n" + " %y8 = phi i32 [0, %bb2], [%y4, %bb1]\n" + " %y9 = phi i32 [0, %bb2], [%y4, %bb1]\n" + " ret void\n" + "}\n"; + + // Parse the module. + LLVMContext Context; + std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString); + + runWithDomTree( + *M, "f", + [&](Function &F, DominatorTree *DT, DominatorTreeBase<BasicBlock> *PDT) { Function::iterator FI = F.begin(); BasicBlock *BB0 = &*FI++; @@ -205,66 +248,12 @@ namespace llvm { // Change root node DT->verifyDomTree(); - BasicBlock *NewEntry = BasicBlock::Create(F.getContext(), "new_entry", - &F, BB0); + BasicBlock *NewEntry = + BasicBlock::Create(F.getContext(), "new_entry", &F, BB0); BranchInst::Create(BB0, NewEntry); EXPECT_EQ(F.begin()->getName(), NewEntry->getName()); EXPECT_TRUE(&F.getEntryBlock() == NewEntry); DT->setNewRoot(NewEntry); DT->verifyDomTree(); - - return false; - } - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired<DominatorTreeWrapperPass>(); - AU.addRequired<PostDominatorTreeWrapperPass>(); - } - DPass() : FunctionPass(ID) { - initializeDPassPass(*PassRegistry::getPassRegistry()); - } - }; - char DPass::ID = 0; - - std::unique_ptr<Module> makeLLVMModule(LLVMContext &Context, DPass *P) { - const char *ModuleString = - "declare i32 @g()\n" \ - "define void @f(i32 %x) personality i32 ()* @g {\n" \ - "bb0:\n" \ - " %y1 = add i32 %x, 1\n" \ - " %y2 = add i32 %x, 1\n" \ - " %y3 = invoke i32 @g() to label %bb1 unwind label %bb2\n" \ - "bb1:\n" \ - " %y4 = add i32 %x, 1\n" \ - " br label %bb4\n" \ - "bb2:\n" \ - " %y5 = landingpad i32\n" \ - " cleanup\n" \ - " br label %bb4\n" \ - "bb3:\n" \ - " %y6 = add i32 %x, 1\n" \ - " %y7 = add i32 %x, 1\n" \ - " ret void\n" \ - "bb4:\n" \ - " %y8 = phi i32 [0, %bb2], [%y4, %bb1]\n" - " %y9 = phi i32 [0, %bb2], [%y4, %bb1]\n" - " ret void\n" \ - "}\n"; - SMDiagnostic Err; - return parseAssemblyString(ModuleString, Err, Context); - } - - TEST(DominatorTree, Unreachable) { - DPass *P = new DPass(); - LLVMContext Context; - std::unique_ptr<Module> M = makeLLVMModule(Context, P); - legacy::PassManager Passes; - Passes.add(P); - Passes.run(*M); - } - } + }); } - -INITIALIZE_PASS_BEGIN(DPass, "dpass", "dpass", false, false) -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) -INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass) -INITIALIZE_PASS_END(DPass, "dpass", "dpass", false, false) |