| //===- OrderedBasicBlockTest.cpp - OrderedBasicBlock unit tests -----------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Analysis/OrderedBasicBlock.h" |
| #include "llvm/AsmParser/Parser.h" |
| #include "llvm/IR/BasicBlock.h" |
| #include "llvm/IR/Function.h" |
| #include "llvm/IR/LLVMContext.h" |
| #include "llvm/IR/Module.h" |
| #include "llvm/Support/DataTypes.h" |
| #include "llvm/Support/SourceMgr.h" |
| #include "gtest/gtest.h" |
| |
| namespace llvm { |
| namespace { |
| |
| class OrderedBasicBlockTest : public testing::Test { |
| protected: |
| LLVMContext C; |
| |
| std::unique_ptr<Module> makeLLVMModule() { |
| const char *ModuleString = R"(define i32 @f(i32 %x) { |
| %add = add i32 %x, 42 |
| ret i32 %add |
| })"; |
| SMDiagnostic Err; |
| auto foo = parseAssemblyString(ModuleString, Err, C); |
| return foo; |
| } |
| }; |
| |
| TEST_F(OrderedBasicBlockTest, Basic) { |
| auto M = makeLLVMModule(); |
| Function *F = M->getFunction("f"); |
| BasicBlock::iterator I = F->front().begin(); |
| Instruction *Add = &*I++; |
| Instruction *Ret = &*I++; |
| |
| OrderedBasicBlock OBB(&F->front()); |
| // Intentionally duplicated to verify cached and uncached are the same. |
| EXPECT_FALSE(OBB.dominates(Add, Add)); |
| EXPECT_FALSE(OBB.dominates(Add, Add)); |
| EXPECT_TRUE(OBB.dominates(Add, Ret)); |
| EXPECT_TRUE(OBB.dominates(Add, Ret)); |
| EXPECT_FALSE(OBB.dominates(Ret, Add)); |
| EXPECT_FALSE(OBB.dominates(Ret, Add)); |
| EXPECT_FALSE(OBB.dominates(Ret, Ret)); |
| EXPECT_FALSE(OBB.dominates(Ret, Ret)); |
| } |
| |
| } // end anonymous namespace |
| } // end namespace llvm |