<div dir="ltr">Hello Balaram,<br><br>It looks like this commit broke tests on our builder:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/5719">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/5719</a><br><br>. . .<br>Failing Tests (1):<br>    LLVM :: Transforms/CalledValuePropagation/simple-arguments.ll<br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 25, 2017 at 7:55 AM, Balaram Makam via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: bmakam<br>
Date: Wed Oct 25 07:55:48 2017<br>
New Revision: 316582<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=316582&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=316582&view=rev</a><br>
Log:<br>
[Local] Fix a bug in the domtree update logic for MergeBasicBlockIntoOnlyPred.<br>
<br>
Summary: For some irreducible CFG the domtree nodes might be dead, do not update domtree for dead nodes.<br>
<br>
Reviewers: kuhar, dberlin, hfinkel<br>
<br>
Reviewed By: kuhar<br>
<br>
Subscribers: llvm-commits, mcrosier<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D38960" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D38960</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/<wbr>Utils/Local.cpp<br>
    llvm/trunk/unittests/<wbr>Transforms/Utils/Local.cpp<br>
<br>
Modified: llvm/trunk/lib/Transforms/<wbr>Utils/Local.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=316582&r1=316581&r2=316582&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Utils/Local.cpp?<wbr>rev=316582&r1=316581&r2=<wbr>316582&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Transforms/<wbr>Utils/Local.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/<wbr>Utils/Local.cpp Wed Oct 25 07:55:48 2017<br>
@@ -649,9 +649,13 @@ void llvm::<wbr>MergeBasicBlockIntoOnlyPred(B<br>
     DestBB->moveAfter(PredBB);<br>
<br>
   if (DT) {<br>
-    BasicBlock *PredBBIDom = DT->getNode(PredBB)->getIDom()<wbr>->getBlock();<br>
-    DT->changeImmediateDominator(<wbr>DestBB, PredBBIDom);<br>
-    DT->eraseNode(PredBB);<br>
+    // For some irreducible CFG we end up having forward-unreachable blocks<br>
+    // so check if getNode returns a valid node before updating the domtree.<br>
+    if (DomTreeNode *DTN = DT->getNode(PredBB)) {<br>
+      BasicBlock *PredBBIDom = DTN->getIDom()->getBlock();<br>
+      DT->changeImmediateDominator(<wbr>DestBB, PredBBIDom);<br>
+      DT->eraseNode(PredBB);<br>
+    }<br>
   }<br>
   // Nuke BB.<br>
   PredBB->eraseFromParent();<br>
<br>
Modified: llvm/trunk/unittests/<wbr>Transforms/Utils/Local.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Utils/Local.cpp?rev=316582&r1=316581&r2=316582&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>Transforms/Utils/Local.cpp?<wbr>rev=316582&r1=316581&r2=<wbr>316582&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/<wbr>Transforms/Utils/Local.cpp (original)<br>
+++ llvm/trunk/unittests/<wbr>Transforms/Utils/Local.cpp Wed Oct 25 07:55:48 2017<br>
@@ -166,3 +166,48 @@ TEST(Local, ReplaceDbgDeclare) {<br>
       Declares++;<br>
   EXPECT_EQ(2, Declares);<br>
 }<br>
+<br>
+/// Build the dominator tree for the function and run the Test.<br>
+static void runWithDomTree(<br>
+    Module &M, StringRef FuncName,<br>
+    function_ref<void(Function &F, DominatorTree *DT)> Test) {<br>
+  auto *F = M.getFunction(FuncName);<br>
+  ASSERT_NE(F, nullptr) << "Could not find " << FuncName;<br>
+  // Compute the dominator tree for the function.<br>
+  DominatorTree DT(*F);<br>
+  Test(*F, &DT);<br>
+}<br>
+<br>
+TEST(Local, MergeBasicBlockIntoOnlyPred) {<br>
+  LLVMContext C;<br>
+<br>
+  std::unique_ptr<Module> M = parseIR(<br>
+      C,<br>
+      "define i32 @f(i8* %str) {\n"<br>
+      "entry:\n"<br>
+      "  br label %bb2.i\n"<br>
+      "bb2.i:                                            ; preds = %bb4.i, %entry\n"<br>
+      "  br i1 false, label %bb4.i, label %base2flt.exit204\n"<br>
+      "bb4.i:                                            ; preds = %bb2.i\n"<br>
+      "  br i1 false, label %base2flt.exit204, label %bb2.i\n"<br>
+      "bb10.i196.bb7.i197_crit_edge:                     ; No predecessors!\n"<br>
+      "  br label %bb7.i197\n"<br>
+      "bb7.i197:                                         ; preds = %bb10.i196.bb7.i197_crit_edge\<wbr>n"<br>
+      "  %.reg2mem.0 = phi i32 [ %.reg2mem.0, %bb10.i196.bb7.i197_crit_edge ]\n"<br>
+      "  br i1 undef, label %base2flt.exit204, label %base2flt.exit204\n"<br>
+      "base2flt.exit204:                                 ; preds = %bb7.i197, %bb7.i197, %bb2.i, %bb4.i\n"<br>
+      "  ret i32 0\n"<br>
+      "}\n");<br>
+  runWithDomTree(<br>
+      *M, "f", [&](Function &F, DominatorTree *DT) {<br>
+        for (Function::iterator I = F.begin(), E = F.end(); I != E;) {<br>
+          BasicBlock *BB = &*I++;<br>
+          BasicBlock *SinglePred = BB->getSinglePredecessor();<br>
+          if (!SinglePred || SinglePred == BB || BB->hasAddressTaken()) continue;<br>
+          BranchInst *Term = dyn_cast<BranchInst>(<wbr>SinglePred->getTerminator());<br>
+          if (Term && !Term->isConditional())<br>
+            MergeBasicBlockIntoOnlyPred(<wbr>BB, DT);<br>
+        }<br>
+        EXPECT_TRUE(DT->verify());<br>
+      });<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>