[llvm] r323928 - Utils: Fix DomTree update for entry block

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 31 14:54:37 PST 2018


Author: arsenm
Date: Wed Jan 31 14:54:37 2018
New Revision: 323928

URL: http://llvm.org/viewvc/llvm-project?rev=323928&view=rev
Log:
Utils: Fix DomTree update for entry block

If SplitBlockPredecessors was used on a function entry block,
it wouldn't update the dominator tree.

Added:
    llvm/trunk/unittests/Transforms/Utils/BasicBlockUtils.cpp
Modified:
    llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
    llvm/trunk/unittests/Transforms/Utils/CMakeLists.txt
    llvm/trunk/unittests/Transforms/Utils/Local.cpp

Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=323928&r1=323927&r2=323928&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Wed Jan 31 14:54:37 2018
@@ -319,8 +319,15 @@ static void UpdateAnalysisInformation(Ba
                                       DominatorTree *DT, LoopInfo *LI,
                                       bool PreserveLCSSA, bool &HasLoopExit) {
   // Update dominator tree if available.
-  if (DT)
-    DT->splitBlock(NewBB);
+  if (DT) {
+    if (OldBB == DT->getRootNode()->getBlock()) {
+      assert(NewBB == &NewBB->getParent()->getEntryBlock());
+      DT->setNewRoot(NewBB);
+    } else {
+      // Split block expects NewBB to have a non-empty set of predecessors.
+      DT->splitBlock(NewBB);
+    }
+  }
 
   // The rest of the logic is only relevant for updating the loop structures.
   if (!LI)
@@ -504,7 +511,6 @@ BasicBlock *llvm::SplitBlockPredecessors
     // Insert dummy values as the incoming value.
     for (BasicBlock::iterator I = BB->begin(); isa<PHINode>(I); ++I)
       cast<PHINode>(I)->addIncoming(UndefValue::get(I->getType()), NewBB);
-    return NewBB;
   }
 
   // Update DominatorTree, LoopInfo, and LCCSA analysis information.
@@ -512,8 +518,11 @@ BasicBlock *llvm::SplitBlockPredecessors
   UpdateAnalysisInformation(BB, NewBB, Preds, DT, LI, PreserveLCSSA,
                             HasLoopExit);
 
-  // Update the PHI nodes in BB with the values coming from NewBB.
-  UpdatePHINodes(BB, NewBB, Preds, BI, HasLoopExit);
+  if (!Preds.empty()) {
+    // Update the PHI nodes in BB with the values coming from NewBB.
+    UpdatePHINodes(BB, NewBB, Preds, BI, HasLoopExit);
+  }
+
   return NewBB;
 }
 

Added: llvm/trunk/unittests/Transforms/Utils/BasicBlockUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/BasicBlockUtils.cpp?rev=323928&view=auto
==============================================================================
--- llvm/trunk/unittests/Transforms/Utils/BasicBlockUtils.cpp (added)
+++ llvm/trunk/unittests/Transforms/Utils/BasicBlockUtils.cpp Wed Jan 31 14:54:37 2018
@@ -0,0 +1,52 @@
+//===- BasicBlockUtils.cpp - Unit tests for BasicBlockUtils ---------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Utils/BasicBlockUtils.h"
+#include "llvm/AsmParser/Parser.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Dominators.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/Support/SourceMgr.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
+  SMDiagnostic Err;
+  std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
+  if (!Mod)
+    Err.print("BasicBlockUtilsTests", errs());
+  return Mod;
+}
+
+TEST(BasicBlockUtils, SplitBlockPredecessors) {
+  LLVMContext C;
+
+  std::unique_ptr<Module> M = parseIR(
+    C,
+    "define i32 @basic_func(i1 %cond) {\n"
+    "entry:\n"
+    "  br i1 %cond, label %bb0, label %bb1\n"
+    "bb0:\n"
+    "  br label %bb1\n"
+    "bb1:\n"
+    "  %phi = phi i32 [ 0, %entry ], [ 1, %bb0 ]"
+    "  ret i32 %phi\n"
+    "}\n"
+    "\n"
+    );
+
+  auto *F = M->getFunction("basic_func");
+  DominatorTree DT(*F);
+
+  // Make sure the dominator tree is properly updated if calling this on the
+  // entry block.
+  SplitBlockPredecessors(&F->getEntryBlock(), {}, "split.entry", &DT);
+  EXPECT_TRUE(DT.verify());
+}

Modified: llvm/trunk/unittests/Transforms/Utils/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/CMakeLists.txt?rev=323928&r1=323927&r2=323928&view=diff
==============================================================================
--- llvm/trunk/unittests/Transforms/Utils/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Transforms/Utils/CMakeLists.txt Wed Jan 31 14:54:37 2018
@@ -8,6 +8,7 @@ set(LLVM_LINK_COMPONENTS
 
 add_llvm_unittest(UtilsTests
   ASanStackFrameLayoutTest.cpp
+  BasicBlockUtils.cpp
   Cloning.cpp
   CodeExtractor.cpp
   FunctionComparator.cpp

Modified: llvm/trunk/unittests/Transforms/Utils/Local.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/Local.cpp?rev=323928&r1=323927&r2=323928&view=diff
==============================================================================
--- llvm/trunk/unittests/Transforms/Utils/Local.cpp (original)
+++ llvm/trunk/unittests/Transforms/Utils/Local.cpp Wed Jan 31 14:54:37 2018
@@ -100,7 +100,7 @@ TEST(Local, RemoveDuplicatePHINodes) {
   EXPECT_EQ(3U, BB->size());
 }
 
-std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
+static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
   SMDiagnostic Err;
   std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
   if (!Mod)




More information about the llvm-commits mailing list