diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2017-06-02 13:10:31 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2017-06-02 13:10:31 +0000 |
commit | c1f5ae236ccea74ac69a05bc2313e2bd275ad78d (patch) | |
tree | 2bce1011f268789b7eee736dc3bcc2f859f45792 | |
parent | 090b8616e26707c0c9c37c6cc55882a10603afbf (diff) | |
download | bcm5719-llvm-c1f5ae236ccea74ac69a05bc2313e2bd275ad78d.tar.gz bcm5719-llvm-c1f5ae236ccea74ac69a05bc2313e2bd275ad78d.zip |
[OrderedBasicBlock] Return false for comesBefore(A, A)
So far it would return true for the first uncached query, then cached
queries return false.
llvm-svn: 304545
-rw-r--r-- | llvm/include/llvm/Analysis/OrderedBasicBlock.h | 1 | ||||
-rw-r--r-- | llvm/lib/Analysis/OrderedBasicBlock.cpp | 2 | ||||
-rw-r--r-- | llvm/unittests/Analysis/CMakeLists.txt | 5 | ||||
-rw-r--r-- | llvm/unittests/Analysis/OrderedBasicBlockTest.cpp | 58 |
4 files changed, 63 insertions, 3 deletions
diff --git a/llvm/include/llvm/Analysis/OrderedBasicBlock.h b/llvm/include/llvm/Analysis/OrderedBasicBlock.h index 5aa813eb483..2e716af1f60 100644 --- a/llvm/include/llvm/Analysis/OrderedBasicBlock.h +++ b/llvm/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/llvm/lib/Analysis/OrderedBasicBlock.cpp b/llvm/lib/Analysis/OrderedBasicBlock.cpp index 0f0016f22cc..a04c0aef04b 100644 --- a/llvm/lib/Analysis/OrderedBasicBlock.cpp +++ b/llvm/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/llvm/unittests/Analysis/CMakeLists.txt b/llvm/unittests/Analysis/CMakeLists.txt index 40d5ea5f5ad..8082c54b9c6 100644 --- a/llvm/unittests/Analysis/CMakeLists.txt +++ b/llvm/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/llvm/unittests/Analysis/OrderedBasicBlockTest.cpp b/llvm/unittests/Analysis/OrderedBasicBlockTest.cpp new file mode 100644 index 00000000000..b8b9ff04ce7 --- /dev/null +++ b/llvm/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<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 |