[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:
Keno Fischer 2015-11-16 04:47:58 +00:00
parent 678125d7ec
commit 86c95b5642
2 changed files with 34 additions and 1 deletions

View File

@ -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

View File

@ -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
}