summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2017-06-02 13:10:31 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2017-06-02 13:10:31 +0000
commitc1f5ae236ccea74ac69a05bc2313e2bd275ad78d (patch)
tree2bce1011f268789b7eee736dc3bcc2f859f45792
parent090b8616e26707c0c9c37c6cc55882a10603afbf (diff)
downloadbcm5719-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.h1
-rw-r--r--llvm/lib/Analysis/OrderedBasicBlock.cpp2
-rw-r--r--llvm/unittests/Analysis/CMakeLists.txt5
-rw-r--r--llvm/unittests/Analysis/OrderedBasicBlockTest.cpp58
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
OpenPOWER on IntegriCloud