forked from OSchip/llvm-project
[Sink] Don't move landingpads
Summary: Moving landingpads into successor basic blocks makes the verifier sad. Teach Sink that much like PHI nodes and terminator instructions, landingpads (and cleanuppads, etc.) may not be moved between basic blocks. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14475 llvm-svn: 253182
This commit is contained in:
parent
678125d7ec
commit
86c95b5642
|
@ -169,7 +169,7 @@ static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (isa<TerminatorInst>(Inst) || isa<PHINode>(Inst))
|
||||
if (isa<TerminatorInst>(Inst) || isa<PHINode>(Inst) || Inst->isEHPad())
|
||||
return false;
|
||||
|
||||
// Convergent operations cannot be made control-dependent on additional
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
; Test that we don't sink landingpads
|
||||
; RUN: opt -sink -S < %s | FileCheck %s
|
||||
|
||||
declare hidden void @g()
|
||||
declare void @h()
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
||||
define void @f() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||
entry:
|
||||
invoke void @g()
|
||||
to label %invoke.cont.15 unwind label %lpad
|
||||
|
||||
invoke.cont.15:
|
||||
unreachable
|
||||
|
||||
; CHECK: lpad:
|
||||
; CHECK: %0 = landingpad { i8*, i32 }
|
||||
lpad:
|
||||
%0 = landingpad { i8*, i32 }
|
||||
catch i8* null
|
||||
invoke void @h()
|
||||
to label %invoke.cont unwind label %lpad.1
|
||||
|
||||
; CHECK: invoke.cont
|
||||
; CHECK-NOT: %0 = landingpad { i8*, i32 }
|
||||
invoke.cont:
|
||||
ret void
|
||||
|
||||
lpad.1:
|
||||
%1 = landingpad { i8*, i32 }
|
||||
cleanup
|
||||
resume { i8*, i32 } %1
|
||||
}
|
Loading…
Reference in New Issue