From: Philip Reames Date: Sun, 26 Apr 2015 19:41:23 +0000 (+0000) Subject: Don't Place Entry Safepoints Before the llvm.frameescape() Intrinsic X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=83a049f2a65d6422049e094ad75cea2301b4f4b3;p=oota-llvm.git 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235820 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/PlaceSafepoints.cpp b/lib/Transforms/Scalar/PlaceSafepoints.cpp index 536f2a673bb..ffed810d823 100644 --- a/lib/Transforms/Scalar/PlaceSafepoints.cpp +++ b/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/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll b/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll new file mode 100644 index 00000000000..e24c9009ea1 --- /dev/null +++ b/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 +}