1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittests/IR/DominatorTreeTest.cpp - Constants unit tests -----===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Dominators.h" 11*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/PostDominators.h" 12*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h" 13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h" 14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h" 19*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker using namespace llvm; 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker namespace llvm { 24*9880d681SAndroid Build Coastguard Worker void initializeDPassPass(PassRegistry&); 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker namespace { 27*9880d681SAndroid Build Coastguard Worker struct DPass : public FunctionPass { 28*9880d681SAndroid Build Coastguard Worker static char ID; runOnFunctionllvm::__anon899d76eb0111::DPass29*9880d681SAndroid Build Coastguard Worker bool runOnFunction(Function &F) override { 30*9880d681SAndroid Build Coastguard Worker DominatorTree *DT = 31*9880d681SAndroid Build Coastguard Worker &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 32*9880d681SAndroid Build Coastguard Worker PostDominatorTree *PDT = 33*9880d681SAndroid Build Coastguard Worker &getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree(); 34*9880d681SAndroid Build Coastguard Worker Function::iterator FI = F.begin(); 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker BasicBlock *BB0 = &*FI++; 37*9880d681SAndroid Build Coastguard Worker BasicBlock::iterator BBI = BB0->begin(); 38*9880d681SAndroid Build Coastguard Worker Instruction *Y1 = &*BBI++; 39*9880d681SAndroid Build Coastguard Worker Instruction *Y2 = &*BBI++; 40*9880d681SAndroid Build Coastguard Worker Instruction *Y3 = &*BBI++; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker BasicBlock *BB1 = &*FI++; 43*9880d681SAndroid Build Coastguard Worker BBI = BB1->begin(); 44*9880d681SAndroid Build Coastguard Worker Instruction *Y4 = &*BBI++; 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker BasicBlock *BB2 = &*FI++; 47*9880d681SAndroid Build Coastguard Worker BBI = BB2->begin(); 48*9880d681SAndroid Build Coastguard Worker Instruction *Y5 = &*BBI++; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker BasicBlock *BB3 = &*FI++; 51*9880d681SAndroid Build Coastguard Worker BBI = BB3->begin(); 52*9880d681SAndroid Build Coastguard Worker Instruction *Y6 = &*BBI++; 53*9880d681SAndroid Build Coastguard Worker Instruction *Y7 = &*BBI++; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker BasicBlock *BB4 = &*FI++; 56*9880d681SAndroid Build Coastguard Worker BBI = BB4->begin(); 57*9880d681SAndroid Build Coastguard Worker Instruction *Y8 = &*BBI++; 58*9880d681SAndroid Build Coastguard Worker Instruction *Y9 = &*BBI++; 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker // Reachability 61*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->isReachableFromEntry(BB0)); 62*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->isReachableFromEntry(BB1)); 63*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->isReachableFromEntry(BB2)); 64*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->isReachableFromEntry(BB3)); 65*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->isReachableFromEntry(BB4)); 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker // BB dominance 68*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB0, BB0)); 69*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB0, BB1)); 70*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB0, BB2)); 71*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB0, BB3)); 72*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB0, BB4)); 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB1, BB0)); 75*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB1, BB1)); 76*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB1, BB2)); 77*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB1, BB3)); 78*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB1, BB4)); 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB2, BB0)); 81*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB2, BB1)); 82*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB2, BB2)); 83*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB2, BB3)); 84*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB2, BB4)); 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB3, BB0)); 87*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB3, BB1)); 88*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB3, BB2)); 89*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(BB3, BB3)); 90*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(BB3, BB4)); 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker // BB proper dominance 93*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB0, BB0)); 94*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->properlyDominates(BB0, BB1)); 95*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->properlyDominates(BB0, BB2)); 96*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->properlyDominates(BB0, BB3)); 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB1, BB0)); 99*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB1, BB1)); 100*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB1, BB2)); 101*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->properlyDominates(BB1, BB3)); 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB2, BB0)); 104*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB2, BB1)); 105*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB2, BB2)); 106*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->properlyDominates(BB2, BB3)); 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB3, BB0)); 109*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB3, BB1)); 110*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB3, BB2)); 111*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->properlyDominates(BB3, BB3)); 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker // Instruction dominance in the same reachable BB 114*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y1, Y1)); 115*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y1, Y2)); 116*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y2, Y1)); 117*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y2, Y2)); 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker // Instruction dominance in the same unreachable BB 120*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y6, Y6)); 121*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y6, Y7)); 122*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y7, Y6)); 123*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y7, Y7)); 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker // Invoke 126*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y3, Y4)); 127*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y3, Y5)); 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker // Phi 130*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y2, Y9)); 131*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y3, Y9)); 132*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y8, Y9)); 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker // Anything dominates unreachable 135*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y1, Y6)); 136*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y3, Y6)); 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker // Unreachable doesn't dominate reachable 139*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y6, Y1)); 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker // Instruction, BB dominance 142*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y1, BB0)); 143*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y1, BB1)); 144*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y1, BB2)); 145*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y1, BB3)); 146*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y1, BB4)); 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y3, BB0)); 149*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y3, BB1)); 150*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y3, BB2)); 151*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y3, BB3)); 152*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(DT->dominates(Y3, BB4)); 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(DT->dominates(Y6, BB3)); 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker // Post dominance. 157*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(PDT->dominates(BB0, BB0)); 158*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(PDT->dominates(BB1, BB0)); 159*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(PDT->dominates(BB2, BB0)); 160*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(PDT->dominates(BB3, BB0)); 161*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(PDT->dominates(BB4, BB1)); 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker // Dominance descendants. 164*9880d681SAndroid Build Coastguard Worker SmallVector<BasicBlock *, 8> DominatedBBs, PostDominatedBBs; 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker DT->getDescendants(BB0, DominatedBBs); 167*9880d681SAndroid Build Coastguard Worker PDT->getDescendants(BB0, PostDominatedBBs); 168*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DominatedBBs.size(), 4UL); 169*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(PostDominatedBBs.size(), 1UL); 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker // BB3 is unreachable. It should have no dominators nor postdominators. 172*9880d681SAndroid Build Coastguard Worker DominatedBBs.clear(); 173*9880d681SAndroid Build Coastguard Worker PostDominatedBBs.clear(); 174*9880d681SAndroid Build Coastguard Worker DT->getDescendants(BB3, DominatedBBs); 175*9880d681SAndroid Build Coastguard Worker DT->getDescendants(BB3, PostDominatedBBs); 176*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DominatedBBs.size(), 0UL); 177*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(PostDominatedBBs.size(), 0UL); 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker // Check DFS Numbers before 180*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB0)->getDFSNumIn(), 0UL); 181*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB0)->getDFSNumOut(), 7UL); 182*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB1)->getDFSNumIn(), 1UL); 183*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB1)->getDFSNumOut(), 2UL); 184*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB2)->getDFSNumIn(), 5UL); 185*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB2)->getDFSNumOut(), 6UL); 186*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB4)->getDFSNumIn(), 3UL); 187*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB4)->getDFSNumOut(), 4UL); 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker // Reattach block 3 to block 1 and recalculate 190*9880d681SAndroid Build Coastguard Worker BB1->getTerminator()->eraseFromParent(); 191*9880d681SAndroid Build Coastguard Worker BranchInst::Create(BB4, BB3, ConstantInt::getTrue(F.getContext()), BB1); 192*9880d681SAndroid Build Coastguard Worker DT->recalculate(F); 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker // Check DFS Numbers after 195*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB0)->getDFSNumIn(), 0UL); 196*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB0)->getDFSNumOut(), 9UL); 197*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB1)->getDFSNumIn(), 1UL); 198*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB1)->getDFSNumOut(), 4UL); 199*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB2)->getDFSNumIn(), 7UL); 200*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB2)->getDFSNumOut(), 8UL); 201*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB3)->getDFSNumIn(), 2UL); 202*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB3)->getDFSNumOut(), 3UL); 203*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB4)->getDFSNumIn(), 5UL); 204*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DT->getNode(BB4)->getDFSNumOut(), 6UL); 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker return false; 207*9880d681SAndroid Build Coastguard Worker } getAnalysisUsagellvm::__anon899d76eb0111::DPass208*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override { 209*9880d681SAndroid Build Coastguard Worker AU.addRequired<DominatorTreeWrapperPass>(); 210*9880d681SAndroid Build Coastguard Worker AU.addRequired<PostDominatorTreeWrapperPass>(); 211*9880d681SAndroid Build Coastguard Worker } DPassllvm::__anon899d76eb0111::DPass212*9880d681SAndroid Build Coastguard Worker DPass() : FunctionPass(ID) { 213*9880d681SAndroid Build Coastguard Worker initializeDPassPass(*PassRegistry::getPassRegistry()); 214*9880d681SAndroid Build Coastguard Worker } 215*9880d681SAndroid Build Coastguard Worker }; 216*9880d681SAndroid Build Coastguard Worker char DPass::ID = 0; 217*9880d681SAndroid Build Coastguard Worker makeLLVMModule(LLVMContext & Context,DPass * P)218*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> makeLLVMModule(LLVMContext &Context, DPass *P) { 219*9880d681SAndroid Build Coastguard Worker const char *ModuleStrig = 220*9880d681SAndroid Build Coastguard Worker "declare i32 @g()\n" \ 221*9880d681SAndroid Build Coastguard Worker "define void @f(i32 %x) personality i32 ()* @g {\n" \ 222*9880d681SAndroid Build Coastguard Worker "bb0:\n" \ 223*9880d681SAndroid Build Coastguard Worker " %y1 = add i32 %x, 1\n" \ 224*9880d681SAndroid Build Coastguard Worker " %y2 = add i32 %x, 1\n" \ 225*9880d681SAndroid Build Coastguard Worker " %y3 = invoke i32 @g() to label %bb1 unwind label %bb2\n" \ 226*9880d681SAndroid Build Coastguard Worker "bb1:\n" \ 227*9880d681SAndroid Build Coastguard Worker " %y4 = add i32 %x, 1\n" \ 228*9880d681SAndroid Build Coastguard Worker " br label %bb4\n" \ 229*9880d681SAndroid Build Coastguard Worker "bb2:\n" \ 230*9880d681SAndroid Build Coastguard Worker " %y5 = landingpad i32\n" \ 231*9880d681SAndroid Build Coastguard Worker " cleanup\n" \ 232*9880d681SAndroid Build Coastguard Worker " br label %bb4\n" \ 233*9880d681SAndroid Build Coastguard Worker "bb3:\n" \ 234*9880d681SAndroid Build Coastguard Worker " %y6 = add i32 %x, 1\n" \ 235*9880d681SAndroid Build Coastguard Worker " %y7 = add i32 %x, 1\n" \ 236*9880d681SAndroid Build Coastguard Worker " ret void\n" \ 237*9880d681SAndroid Build Coastguard Worker "bb4:\n" \ 238*9880d681SAndroid Build Coastguard Worker " %y8 = phi i32 [0, %bb2], [%y4, %bb1]\n" 239*9880d681SAndroid Build Coastguard Worker " %y9 = phi i32 [0, %bb2], [%y4, %bb1]\n" 240*9880d681SAndroid Build Coastguard Worker " ret void\n" \ 241*9880d681SAndroid Build Coastguard Worker "}\n"; 242*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err; 243*9880d681SAndroid Build Coastguard Worker return parseAssemblyString(ModuleStrig, Err, Context); 244*9880d681SAndroid Build Coastguard Worker } 245*9880d681SAndroid Build Coastguard Worker TEST(DominatorTree,Unreachable)246*9880d681SAndroid Build Coastguard Worker TEST(DominatorTree, Unreachable) { 247*9880d681SAndroid Build Coastguard Worker DPass *P = new DPass(); 248*9880d681SAndroid Build Coastguard Worker LLVMContext Context; 249*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = makeLLVMModule(Context, P); 250*9880d681SAndroid Build Coastguard Worker legacy::PassManager Passes; 251*9880d681SAndroid Build Coastguard Worker Passes.add(P); 252*9880d681SAndroid Build Coastguard Worker Passes.run(*M); 253*9880d681SAndroid Build Coastguard Worker } 254*9880d681SAndroid Build Coastguard Worker } 255*9880d681SAndroid Build Coastguard Worker } 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_BEGIN(DPass, "dpass", "dpass", false, false) 258*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 259*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass) 260*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_END(DPass, "dpass", "dpass", false, false) 261