summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeno Fischer <kfischer@college.harvard.edu>2015-11-16 04:47:58 +0000
committerKeno Fischer <kfischer@college.harvard.edu>2015-11-16 04:47:58 +0000
commit86c95b5642807d2aba091f437d11691b3a285439 (patch)
tree907f352738a1de8470b9e8f5340aad98fa3035ec
parent678125d7ec3c9b42ce106a4836b4345577733213 (diff)
downloadbcm5719-llvm-86c95b5642807d2aba091f437d11691b3a285439.tar.gz
bcm5719-llvm-86c95b5642807d2aba091f437d11691b3a285439.zip
[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
-rw-r--r--llvm/lib/Transforms/Scalar/Sink.cpp2
-rw-r--r--llvm/test/Transforms/Sink/landingpad.ll33
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
+}
OpenPOWER on IntegriCloud