]> granicus.if.org Git - llvm/commitdiff
[OrderedBasicBlock] Return false for comesBefore(A, A)
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 2 Jun 2017 13:10:31 +0000 (13:10 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 2 Jun 2017 13:10:31 +0000 (13:10 +0000)
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

include/llvm/Analysis/OrderedBasicBlock.h
lib/Analysis/OrderedBasicBlock.cpp
unittests/Analysis/CMakeLists.txt
unittests/Analysis/OrderedBasicBlockTest.cpp [new file with mode: 0644]

index 5aa813eb483246f9ac4faff9de5e412ca510e3d9..2e716af1f60ddbbf77f92dbeebb80a1ab337c6d8 100644 (file)
@@ -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);
 };
 
index 0f0016f22cc0a79849f4c443109604ba5280fd66..a04c0aef04beaa7cc74a82f629db0d13f461b17a 100644 (file)
@@ -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
index 40d5ea5f5ad783f0bc4cd6287cb88aeb29b1443c..8082c54b9c662f7421931e0602aec207fa486006 100644 (file)
@@ -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 (file)
index 0000000..b8b9ff0
--- /dev/null
@@ -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