summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Reames <listmail@philipreames.com>2015-04-26 19:41:23 +0000
committerPhilip Reames <listmail@philipreames.com>2015-04-26 19:41:23 +0000
commit2e78fa49a82c496a0701b996bacf2868204bef64 (patch)
treebbb939b34385b778987f2016486f7609de38d983
parentce216063acb78375a07323468730a7de33b4b5f9 (diff)
downloadbcm5719-llvm-2e78fa49a82c496a0701b996bacf2868204bef64.tar.gz
bcm5719-llvm-2e78fa49a82c496a0701b996bacf2868204bef64.zip
Don't Place Entry Safepoints Before the llvm.frameescape() Intrinsic
llvm.frameescape() intrinsic is not a real call. The intrinsic can only exist in the entry block. Inserting a gc.statepoint() before llvm.frameescape() may split the entry block, and push the intrinsic out of the entry block. Patch by: Swaroop.Sridhar@microsoft.com Differential Revision: http://reviews.llvm.org/D8910 llvm-svn: 235820
-rw-r--r--llvm/lib/Transforms/Scalar/PlaceSafepoints.cpp7
-rw-r--r--llvm/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll29
2 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/PlaceSafepoints.cpp b/llvm/lib/Transforms/Scalar/PlaceSafepoints.cpp
index 536f2a673bb..ffed810d823 100644
--- a/llvm/lib/Transforms/Scalar/PlaceSafepoints.cpp
+++ b/llvm/lib/Transforms/Scalar/PlaceSafepoints.cpp
@@ -430,6 +430,13 @@ static Instruction *findLocationForEntrySafepoint(Function &F,
if (II->getIntrinsicID() == Intrinsic::assume) {
continue;
}
+ // llvm.frameescape() intrinsic is not a real call. The intrinsic can
+ // exist only in the entry block.
+ // Inserting a statepoint before llvm.frameescape() may split the
+ // entry block, and push the intrinsic out of the entry block.
+ if (II->getIntrinsicID() == Intrinsic::frameescape) {
+ continue;
+ }
}
break;
}
diff --git a/llvm/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll b/llvm/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll
new file mode 100644
index 00000000000..e24c9009ea1
--- /dev/null
+++ b/llvm/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll
@@ -0,0 +1,29 @@
+; RUN: opt %s -S -place-safepoints | FileCheck %s
+
+declare void @llvm.frameescape(...)
+
+; Do we insert the entry safepoint after the frameescape intrinsic?
+define void @parent() gc "statepoint-example" {
+; CHECK-LABEL: @parent
+entry:
+; CHECK-LABEL: entry
+; CHECK-NEXT: alloca
+; CHECK-NEXT: frameescape
+; CHECK-NEXT: statepoint
+ %ptr = alloca i32
+ call void (...) @llvm.frameescape(i32* %ptr)
+ ret void
+}
+
+; This function is inlined when inserting a poll. To avoid recursive
+; issues, make sure we don't place safepoints in it.
+declare void @do_safepoint()
+define void @gc.safepoint_poll() {
+; CHECK-LABEL: gc.safepoint_poll
+; CHECK-LABEL: entry
+; CHECK-NEXT: do_safepoint
+; CHECK-NEXT: ret void
+entry:
+ call void @do_safepoint()
+ ret void
+}
OpenPOWER on IntegriCloud