From: Benjamin Kramer Date: Fri, 2 Jun 2017 13:10:31 +0000 (+0000) Subject: [OrderedBasicBlock] Return false for comesBefore(A, A) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2118193ddf9b7975050e4e7990b63691b7011bdc;p=llvm [OrderedBasicBlock] Return false for comesBefore(A, A) So far it would return true for the first uncached query, then cached queries return false. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304545 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/OrderedBasicBlock.h b/include/llvm/Analysis/OrderedBasicBlock.h index 5aa813eb483..2e716af1f60 100644 --- a/include/llvm/Analysis/OrderedBasicBlock.h +++ b/include/llvm/Analysis/OrderedBasicBlock.h @@ -58,6 +58,7 @@ public: /// comes before \p B in \p BB. This is a simplification that considers /// cached instruction positions and ignores other basic blocks, being /// only relevant to compare relative instructions positions inside \p BB. + /// Returns false for A == B. bool dominates(const Instruction *A, const Instruction *B); }; diff --git a/lib/Analysis/OrderedBasicBlock.cpp b/lib/Analysis/OrderedBasicBlock.cpp index 0f0016f22cc..a04c0aef04b 100644 --- a/lib/Analysis/OrderedBasicBlock.cpp +++ b/lib/Analysis/OrderedBasicBlock.cpp @@ -55,7 +55,7 @@ bool OrderedBasicBlock::comesBefore(const Instruction *A, assert(II != IE && "Instruction not found?"); assert((Inst == A || Inst == B) && "Should find A or B"); LastInstFound = II; - return Inst == A; + return Inst != B; } /// \brief Find out whether \p A dominates \p B, meaning whether \p A diff --git a/unittests/Analysis/CMakeLists.txt b/unittests/Analysis/CMakeLists.txt index 40d5ea5f5ad..8082c54b9c6 100644 --- a/unittests/Analysis/CMakeLists.txt +++ b/unittests/Analysis/CMakeLists.txt @@ -9,17 +9,18 @@ add_llvm_unittest(AnalysisTests AliasAnalysisTest.cpp BlockFrequencyInfoTest.cpp BranchProbabilityInfoTest.cpp + CallGraphTest.cpp CFGTest.cpp CGSCCPassManagerTest.cpp - CallGraphTest.cpp LazyCallGraphTest.cpp LoopInfoTest.cpp MemoryBuiltinsTest.cpp MemorySSA.cpp + OrderedBasicBlockTest.cpp ProfileSummaryInfoTest.cpp ScalarEvolutionTest.cpp - TBAATest.cpp TargetLibraryInfoTest.cpp + TBAATest.cpp UnrollAnalyzer.cpp ValueTrackingTest.cpp ) diff --git a/unittests/Analysis/OrderedBasicBlockTest.cpp b/unittests/Analysis/OrderedBasicBlockTest.cpp new file mode 100644 index 00000000000..b8b9ff04ce7 --- /dev/null +++ b/unittests/Analysis/OrderedBasicBlockTest.cpp @@ -0,0 +1,58 @@ +//===- 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 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