blob: dc1b25b8c02ec548ef70adce480f7885719cd2bc [file] [log] [blame]
Xin Tong801b4ce2017-06-06 02:34:41 +00001//===- OrderedInstructions.cpp - Unit tests for OrderedInstructions ------===//
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
Max Kazantsev3a864552018-08-30 04:49:03 +000010#include "llvm/Analysis/OrderedInstructions.h"
Xin Tong801b4ce2017-06-06 02:34:41 +000011#include "llvm/IR/BasicBlock.h"
12#include "llvm/IR/Dominators.h"
13#include "llvm/IR/IRBuilder.h"
14#include "llvm/IR/Instructions.h"
15#include "llvm/IR/LLVMContext.h"
16#include "llvm/IR/Module.h"
17#include "gtest/gtest.h"
18
19using namespace llvm;
20
21/// Check intra-basicblock and inter-basicblock dominance using
22/// OrderedInstruction.
23TEST(OrderedInstructionsTest, DominanceTest) {
24 LLVMContext Ctx;
25 Module M("test", Ctx);
26 IRBuilder<> B(Ctx);
27 FunctionType *FTy =
28 FunctionType::get(Type::getVoidTy(Ctx), {B.getInt8PtrTy()}, false);
29 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
30
31 // Create the function as follow and check for dominance relation.
32 //
33 // test():
34 // bbx:
35 // loadx;
36 // loady;
37 // bby:
38 // loadz;
39 // return;
40 //
41 // More specifically, check for loadx -> (dominates) loady,
42 // loady -> loadx and loady -> loadz.
43 //
44 // Create BBX with 2 loads.
45 BasicBlock *BBX = BasicBlock::Create(Ctx, "bbx", F);
46 B.SetInsertPoint(BBX);
47 Argument *PointerArg = &*F->arg_begin();
48 LoadInst *LoadInstX = B.CreateLoad(PointerArg);
49 LoadInst *LoadInstY = B.CreateLoad(PointerArg);
50
51 // Create BBY with 1 load.
52 BasicBlock *BBY = BasicBlock::Create(Ctx, "bby", F);
53 B.SetInsertPoint(BBY);
54 LoadInst *LoadInstZ = B.CreateLoad(PointerArg);
55 B.CreateRet(LoadInstZ);
56 std::unique_ptr<DominatorTree> DT(new DominatorTree(*F));
57 OrderedInstructions OI(&*DT);
58
59 // Intra-BB dominance test.
60 EXPECT_TRUE(OI.dominates(LoadInstX, LoadInstY));
61 EXPECT_FALSE(OI.dominates(LoadInstY, LoadInstX));
62
63 // Inter-BB dominance test.
64 EXPECT_TRUE(OI.dominates(LoadInstY, LoadInstZ));
65}