From 888d479702d42688f55399530f867d2db118ffaa Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Mon, 16 Nov 2015 04:47:58 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253182 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/Sink.cpp | 2 +- test/Transforms/Sink/landingpad.ll | 33 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/Sink/landingpad.ll diff --git a/lib/Transforms/Scalar/Sink.cpp b/lib/Transforms/Scalar/Sink.cpp index f6ccd999ea0..7c0ac7aa6fa 100644 --- a/lib/Transforms/Scalar/Sink.cpp +++ b/lib/Transforms/Scalar/Sink.cpp @@ -169,7 +169,7 @@ static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA, return false; } - if (isa(Inst) || isa(Inst)) + if (isa(Inst) || isa(Inst) || Inst->isEHPad()) return false; // Convergent operations cannot be made control-dependent on additional diff --git a/test/Transforms/Sink/landingpad.ll b/test/Transforms/Sink/landingpad.ll new file mode 100644 index 00000000000..10548fd5b7d --- /dev/null +++ b/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 +} -- 2.34.1