<div dir="ltr">This broke bootstrap stage2 with a pretty clear crash in jump threading:<div><a href="http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/2476/steps/build-stage2-LLVMgold.so/logs/stdio">http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/2476/steps/build-stage2-LLVMgold.so/logs/stdio</a><br><div><a href="http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/15036">http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/15036</a><br></div></div><div><br></div><div>Reverting...</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Apr 18, 2017 at 10:28 PM Xin Tong via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: trentxintong<br>
Date: Wed Apr 19 00:15:57 2017<br>
New Revision: 300657<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=300657&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=300657&view=rev</a><br>
Log:<br>
[JumpThread] We want to fold (not thread) when all predecessor go to single BB's successor. .<br>
<br>
Summary: In case all predecessor go to a single successor of current BB. We want to fold (not thread).<br>
<br>
Reviewers: efriedma, sanjoy<br>
<br>
Reviewed By: sanjoy<br>
<br>
Subscribers: dberlin, majnemer, llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D30869" rel="noreferrer" target="_blank">https://reviews.llvm.org/D30869</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp<br>
    llvm/trunk/test/Transforms/JumpThreading/basic.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=300657&r1=300656&r2=300657&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=300657&r1=300656&r2=300657&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Wed Apr 19 00:15:57 2017<br>
@@ -1289,6 +1289,33 @@ bool JumpThreadingPass::ProcessThreadabl<br>
   if (PredToDestList.empty())<br>
     return false;<br>
<br>
+  // If all the predecessors go to a single known successor, we want to fold,<br>
+  // not thread. By doing so, we do not need to duplicate the current block and<br>
+  // also miss potential opportunities in case we don't/can't duplicate.<br>
+  if (OnlyDest && OnlyDest != MultipleDestSentinel) {<br>
+    if (PredToDestList.size() ==<br>
+        (size_t)std::distance(pred_begin(BB), pred_end(BB))) {<br>
+      for (BasicBlock *SuccBB : successors(BB)) {<br>
+        if (SuccBB != OnlyDest)<br>
+          SuccBB->removePredecessor(BB, true); // This is unreachable successor.<br>
+      }<br>
+<br>
+      // Finally update the terminator.<br>
+      TerminatorInst *Term = BB->getTerminator();<br>
+      BranchInst::Create(OnlyDest, Term);<br>
+      Term->eraseFromParent();<br>
+<br>
+      // If the condition is now dead due to the removal of the old terminator,<br>
+      // erase it.<br>
+      auto *CondInst = dyn_cast<Instruction>(Cond);<br>
+      if (CondInst && CondInst->use_empty())<br>
+        CondInst->eraseFromParent();<br>
+      // FIXME: in case this instruction is defined in the current BB and it<br>
+      // resolves to a single value from all predecessors, we can do RAUW.<br>
+      return true;<br>
+    }<br>
+  }<br>
+<br>
   // Determine which is the most common successor.  If we have many inputs and<br>
   // this block is a switch, we want to start by threading the batch that goes<br>
   // to the most popular destination first.  If we only know about one<br>
<br>
Modified: llvm/trunk/test/Transforms/JumpThreading/basic.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/basic.ll?rev=300657&r1=300656&r2=300657&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/basic.ll?rev=300657&r1=300656&r2=300657&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/JumpThreading/basic.ll (original)<br>
+++ llvm/trunk/test/Transforms/JumpThreading/basic.ll Wed Apr 19 00:15:57 2017<br>
@@ -4,6 +4,95 @@ declare i32 @f1()<br>
 declare i32 @f2()<br>
 declare void @f3()<br>
<br>
+; Make sure we can fold this branch ... We will not be able to thread it as<br>
+; L0 is too big to duplicate. L2 is the unreachable block here.<br>
+;<br>
+; CHECK-LABEL: @test_br_folding_not_threading(<br>
+; CHECK: L1:<br>
+; CHECK: call i32 @f2()<br>
+; CHECK: call void @f3()<br>
+; CHECK-NEXT: ret void<br>
+; CHECK-NOT: br<br>
+; CHECK: L3:<br>
+define void @test_br_folding_not_threading(i1 %cond) nounwind {<br>
+entry:<br>
+  br i1 %cond, label %L0, label %L3<br>
+L0:<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  br i1 %cond, label %L1, label %L2<br>
+<br>
+L1:<br>
+  call void @f3()<br>
+  ret void<br>
+L2:<br>
+  call void @f3()<br>
+  ret void<br>
+L3:<br>
+  call void @f3()<br>
+  ret void<br>
+}<br>
+<br>
+<br>
+; Make sure we can fold this branch ... We will not be able to thread it as<br>
+; L0 is too big to duplicate. L2 is the unreachable block here.<br>
+; With more than 1 predecessors.<br>
+;<br>
+; CHECK-LABEL: @test_br_folding_not_threading_multiple_preds(<br>
+; CHECK: L1:<br>
+; CHECK: call i32 @f2()<br>
+; CHECK: call void @f3()<br>
+; CHECK-NEXT: ret void<br>
+; CHECK-NOT: br<br>
+; CHECK: L3:<br>
+define void @test_br_folding_not_threading_multiple_preds(i1 %condx, i1 %cond) nounwind {<br>
+entry:<br>
+  br i1 %condx, label %X0, label %X1<br>
+<br>
+X0:<br>
+  br i1 %cond, label %L0, label %L3<br>
+<br>
+X1:<br>
+  br i1 %cond, label %L0, label %L3<br>
+<br>
+L0:<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  call i32 @f2()<br>
+  br i1 %cond, label %L1, label %L2<br>
+<br>
+L1:<br>
+  call void @f3()<br>
+  ret void<br>
+L2:<br>
+  call void @f3()<br>
+  ret void<br>
+L3:<br>
+  call void @f3()<br>
+  ret void<br>
+}<br>
+<br>
 define i32 @test1(i1 %cond) {<br>
 ; CHECK-LABEL: @test1(<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>