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