diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/Sink.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/Sink/landingpad.ll | 33 |
2 files changed, 34 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/Sink.cpp b/llvm/lib/Transforms/Scalar/Sink.cpp index f6ccd999ea0..7c0ac7aa6fa 100644 --- a/llvm/lib/Transforms/Scalar/Sink.cpp +++ b/llvm/lib/Transforms/Scalar/Sink.cpp @@ -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 diff --git a/llvm/test/Transforms/Sink/landingpad.ll b/llvm/test/Transforms/Sink/landingpad.ll new file mode 100644 index 00000000000..10548fd5b7d --- /dev/null +++ b/llvm/test/Transforms/Sink/landingpad.ll @@ -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 +} |