[llvm] r283129 - Jump threading: avoid trying to split edge into landingpad block (PR27840)

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 3 11:18:05 PDT 2016


Author: hans
Date: Mon Oct  3 13:18:04 2016
New Revision: 283129

URL: http://llvm.org/viewvc/llvm-project?rev=283129&view=rev
Log:
Jump threading: avoid trying to split edge into landingpad block (PR27840)

Splitting the edge is nontrivial because of the landing pad, and we would
currently assert trying to do it.

Differential Revision: https://reviews.llvm.org/D24680

Added:
    llvm/trunk/test/Transforms/JumpThreading/pr27840.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=283129&r1=283128&r2=283129&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Mon Oct  3 13:18:04 2016
@@ -1331,6 +1331,10 @@ bool JumpThreadingPass::ProcessBranchOnX
   if (!isa<PHINode>(BB->front()))
     return false;
 
+  // If this BB is a landing pad, we won't be able to split the edge into it.
+  if (BB->isEHPad())
+    return false;
+
   // If we have a xor as the branch input to this block, and we know that the
   // LHS or RHS of the xor in any predecessor is true/false, then we can clone
   // the condition into the predecessor and fix that value to true, saving some

Added: llvm/trunk/test/Transforms/JumpThreading/pr27840.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/pr27840.ll?rev=283129&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/JumpThreading/pr27840.ll (added)
+++ llvm/trunk/test/Transforms/JumpThreading/pr27840.ll Mon Oct  3 13:18:04 2016
@@ -0,0 +1,33 @@
+; RUN: opt -jump-threading -S < %s | FileCheck %s
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.11.0"
+
+declare void @helper()
+declare i32 @__gxx_personality_v0(...)
+
+
+define void @pr27840(i8* %call, i1 %A) personality i32(...)* @__gxx_personality_v0 {
+entry:
+  invoke void @helper()
+          to label %invoke.cont unwind label %lpad
+
+; Don't jump threading; we can't split the critical edge from entry to lpad.
+; CHECK-LABEL: @pr27840
+; CHECK: invoke
+; CHECK-NEXT: to label %invoke.cont unwind label %lpad
+
+invoke.cont:
+  invoke void @helper()
+          to label %nowhere unwind label %lpad
+
+lpad:
+  %b = phi i1 [ true, %invoke.cont ], [ false, %entry ]
+  landingpad { i8*, i32 }
+          cleanup
+  %xor = xor i1 %b, %A
+  br i1 %xor, label %nowhere, label %invoke.cont
+
+nowhere:
+  unreachable
+}




More information about the llvm-commits mailing list