DominatorTreeTest.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "llvm/Analysis/Dominators.h"
  2. #include "llvm/Assembly/Parser.h"
  3. #include "llvm/Instructions.h"
  4. #include "llvm/LLVMContext.h"
  5. #include "llvm/Module.h"
  6. #include "llvm/PassManager.h"
  7. #include "llvm/Support/SourceMgr.h"
  8. #include "gtest/gtest.h"
  9. using namespace llvm;
  10. namespace llvm {
  11. void initializeDPassPass(PassRegistry&);
  12. namespace {
  13. struct DPass : public FunctionPass {
  14. static char ID;
  15. virtual bool runOnFunction(Function &F) {
  16. DominatorTree *DT = &getAnalysis<DominatorTree>();
  17. Function::iterator FI = F.begin();
  18. BasicBlock *BB0 = FI++;
  19. BasicBlock::iterator BBI = BB0->begin();
  20. Instruction *Y1 = BBI++;
  21. Instruction *Y2 = BBI++;
  22. Instruction *Y3 = BBI++;
  23. BasicBlock *BB1 = FI++;
  24. BBI = BB1->begin();
  25. Instruction *Y4 = BBI++;
  26. BasicBlock *BB2 = FI++;
  27. BBI = BB2->begin();
  28. Instruction *Y5 = BBI++;
  29. BasicBlock *BB3 = FI++;
  30. BBI = BB3->begin();
  31. Instruction *Y6 = BBI++;
  32. Instruction *Y7 = BBI++;
  33. BasicBlock *BB4 = FI++;
  34. BBI = BB4->begin();
  35. Instruction *Y8 = BBI++;
  36. Instruction *Y9 = BBI++;
  37. // Reachability
  38. EXPECT_TRUE(DT->isReachableFromEntry(BB0));
  39. EXPECT_TRUE(DT->isReachableFromEntry(BB1));
  40. EXPECT_TRUE(DT->isReachableFromEntry(BB2));
  41. EXPECT_FALSE(DT->isReachableFromEntry(BB3));
  42. EXPECT_TRUE(DT->isReachableFromEntry(BB4));
  43. // BB dominance
  44. EXPECT_TRUE(DT->dominates(BB0, BB0));
  45. EXPECT_TRUE(DT->dominates(BB0, BB1));
  46. EXPECT_TRUE(DT->dominates(BB0, BB2));
  47. EXPECT_TRUE(DT->dominates(BB0, BB3));
  48. EXPECT_TRUE(DT->dominates(BB0, BB4));
  49. EXPECT_FALSE(DT->dominates(BB1, BB0));
  50. EXPECT_TRUE(DT->dominates(BB1, BB1));
  51. EXPECT_FALSE(DT->dominates(BB1, BB2));
  52. EXPECT_TRUE(DT->dominates(BB1, BB3));
  53. EXPECT_FALSE(DT->dominates(BB1, BB4));
  54. EXPECT_FALSE(DT->dominates(BB2, BB0));
  55. EXPECT_FALSE(DT->dominates(BB2, BB1));
  56. EXPECT_TRUE(DT->dominates(BB2, BB2));
  57. EXPECT_TRUE(DT->dominates(BB2, BB3));
  58. EXPECT_FALSE(DT->dominates(BB2, BB4));
  59. EXPECT_FALSE(DT->dominates(BB3, BB0));
  60. EXPECT_FALSE(DT->dominates(BB3, BB1));
  61. EXPECT_FALSE(DT->dominates(BB3, BB2));
  62. EXPECT_TRUE(DT->dominates(BB3, BB3));
  63. EXPECT_FALSE(DT->dominates(BB3, BB4));
  64. // BB proper dominance
  65. EXPECT_FALSE(DT->properlyDominates(BB0, BB0));
  66. EXPECT_TRUE(DT->properlyDominates(BB0, BB1));
  67. EXPECT_TRUE(DT->properlyDominates(BB0, BB2));
  68. EXPECT_TRUE(DT->properlyDominates(BB0, BB3));
  69. EXPECT_FALSE(DT->properlyDominates(BB1, BB0));
  70. EXPECT_FALSE(DT->properlyDominates(BB1, BB1));
  71. EXPECT_FALSE(DT->properlyDominates(BB1, BB2));
  72. EXPECT_TRUE(DT->properlyDominates(BB1, BB3));
  73. EXPECT_FALSE(DT->properlyDominates(BB2, BB0));
  74. EXPECT_FALSE(DT->properlyDominates(BB2, BB1));
  75. EXPECT_FALSE(DT->properlyDominates(BB2, BB2));
  76. EXPECT_TRUE(DT->properlyDominates(BB2, BB3));
  77. EXPECT_FALSE(DT->properlyDominates(BB3, BB0));
  78. EXPECT_FALSE(DT->properlyDominates(BB3, BB1));
  79. EXPECT_FALSE(DT->properlyDominates(BB3, BB2));
  80. EXPECT_FALSE(DT->properlyDominates(BB3, BB3));
  81. // Instruction dominance in the same reachable BB
  82. EXPECT_FALSE(DT->dominates(Y1, Y1));
  83. EXPECT_TRUE(DT->dominates(Y1, Y2));
  84. EXPECT_FALSE(DT->dominates(Y2, Y1));
  85. EXPECT_FALSE(DT->dominates(Y2, Y2));
  86. // Instruction dominance in the same unreachable BB
  87. EXPECT_TRUE(DT->dominates(Y6, Y6));
  88. EXPECT_TRUE(DT->dominates(Y6, Y7));
  89. EXPECT_TRUE(DT->dominates(Y7, Y6));
  90. EXPECT_TRUE(DT->dominates(Y7, Y7));
  91. // Invoke
  92. EXPECT_TRUE(DT->dominates(Y3, Y4));
  93. EXPECT_FALSE(DT->dominates(Y3, Y5));
  94. // Phi
  95. EXPECT_TRUE(DT->dominates(Y2, Y9));
  96. EXPECT_FALSE(DT->dominates(Y3, Y9));
  97. EXPECT_FALSE(DT->dominates(Y8, Y9));
  98. // Anything dominates unreachable
  99. EXPECT_TRUE(DT->dominates(Y1, Y6));
  100. EXPECT_TRUE(DT->dominates(Y3, Y6));
  101. // Unreachable doesn't dominate reachable
  102. EXPECT_FALSE(DT->dominates(Y6, Y1));
  103. // Instruction, BB dominance
  104. EXPECT_FALSE(DT->dominates(Y1, BB0));
  105. EXPECT_TRUE(DT->dominates(Y1, BB1));
  106. EXPECT_TRUE(DT->dominates(Y1, BB2));
  107. EXPECT_TRUE(DT->dominates(Y1, BB3));
  108. EXPECT_TRUE(DT->dominates(Y1, BB4));
  109. EXPECT_FALSE(DT->dominates(Y3, BB0));
  110. EXPECT_TRUE(DT->dominates(Y3, BB1));
  111. EXPECT_FALSE(DT->dominates(Y3, BB2));
  112. EXPECT_TRUE(DT->dominates(Y3, BB3));
  113. EXPECT_FALSE(DT->dominates(Y3, BB4));
  114. EXPECT_TRUE(DT->dominates(Y6, BB3));
  115. return false;
  116. }
  117. virtual void getAnalysisUsage(AnalysisUsage &AU) const {
  118. AU.addRequired<DominatorTree>();
  119. }
  120. DPass() : FunctionPass(ID) {
  121. initializeDPassPass(*PassRegistry::getPassRegistry());
  122. }
  123. };
  124. char DPass::ID = 0;
  125. Module* makeLLVMModule(DPass *P) {
  126. const char *ModuleStrig =
  127. "declare i32 @g()\n" \
  128. "define void @f(i32 %x) {\n" \
  129. "bb0:\n" \
  130. " %y1 = add i32 %x, 1\n" \
  131. " %y2 = add i32 %x, 1\n" \
  132. " %y3 = invoke i32 @g() to label %bb1 unwind label %bb2\n" \
  133. "bb1:\n" \
  134. " %y4 = add i32 %x, 1\n" \
  135. " br label %bb4\n" \
  136. "bb2:\n" \
  137. " %y5 = landingpad i32 personality i32 ()* @g\n" \
  138. " cleanup\n" \
  139. " br label %bb4\n" \
  140. "bb3:\n" \
  141. " %y6 = add i32 %x, 1\n" \
  142. " %y7 = add i32 %x, 1\n" \
  143. " ret void\n" \
  144. "bb4:\n" \
  145. " %y8 = phi i32 [0, %bb2], [%y4, %bb1]\n"
  146. " %y9 = phi i32 [0, %bb2], [%y4, %bb1]\n"
  147. " ret void\n" \
  148. "}\n";
  149. LLVMContext &C = getGlobalContext();
  150. SMDiagnostic Err;
  151. return ParseAssemblyString(ModuleStrig, NULL, Err, C);
  152. }
  153. TEST(DominatorTree, Unreachable) {
  154. DPass *P = new DPass();
  155. Module *M = makeLLVMModule(P);
  156. PassManager Passes;
  157. Passes.add(P);
  158. Passes.run(*M);
  159. }
  160. }
  161. }
  162. INITIALIZE_PASS_BEGIN(DPass, "dpass", "dpass", false, false)
  163. INITIALIZE_PASS_DEPENDENCY(DominatorTree)
  164. INITIALIZE_PASS_END(DPass, "dpass", "dpass", false, false)