forked from OSchip/llvm-project
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 llvm-svn: 283129
This commit is contained in:
parent
2ee505e715
commit
b4d2678c6f
|
@ -1331,6 +1331,10 @@ bool JumpThreadingPass::ProcessBranchOnXOR(BinaryOperator *BO) {
|
|||
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
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue