[llvm] r304545 - [OrderedBasicBlock] Return false for comesBefore(A, A)

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 2 06:10:31 PDT 2017


Author: d0k
Date: Fri Jun  2 08:10:31 2017
New Revision: 304545

URL: http://llvm.org/viewvc/llvm-project?rev=304545&view=rev
Log:
[OrderedBasicBlock] Return false for comesBefore(A, A)

So far it would return true for the first uncached query, then cached
queries return false.

Added:
    llvm/trunk/unittests/Analysis/OrderedBasicBlockTest.cpp
Modified:
    llvm/trunk/include/llvm/Analysis/OrderedBasicBlock.h
    llvm/trunk/lib/Analysis/OrderedBasicBlock.cpp
    llvm/trunk/unittests/Analysis/CMakeLists.txt

Modified: llvm/trunk/include/llvm/Analysis/OrderedBasicBlock.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/OrderedBasicBlock.h?rev=304545&r1=304544&r2=304545&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/OrderedBasicBlock.h (original)
+++ llvm/trunk/include/llvm/Analysis/OrderedBasicBlock.h Fri Jun  2 08:10:31 2017
@@ -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);
 };
 

Modified: llvm/trunk/lib/Analysis/OrderedBasicBlock.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/OrderedBasicBlock.cpp?rev=304545&r1=304544&r2=304545&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/OrderedBasicBlock.cpp (original)
+++ llvm/trunk/lib/Analysis/OrderedBasicBlock.cpp Fri Jun  2 08:10:31 2017
@@ -55,7 +55,7 @@ bool OrderedBasicBlock::comesBefore(cons
   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

Modified: llvm/trunk/unittests/Analysis/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/CMakeLists.txt?rev=304545&r1=304544&r2=304545&view=diff
==============================================================================
--- llvm/trunk/unittests/Analysis/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Analysis/CMakeLists.txt Fri Jun  2 08:10:31 2017
@@ -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
   )

Added: llvm/trunk/unittests/Analysis/OrderedBasicBlockTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/OrderedBasicBlockTest.cpp?rev=304545&view=auto
==============================================================================
--- llvm/trunk/unittests/Analysis/OrderedBasicBlockTest.cpp (added)
+++ llvm/trunk/unittests/Analysis/OrderedBasicBlockTest.cpp Fri Jun  2 08:10:31 2017
@@ -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




More information about the llvm-commits mailing list