forked from OSchip/llvm-project
[PlaceSafepoints] Introduce a -spp-no-statepoints flag
Summary: This change adds a `-spp-no-statepoints` flag to PlaceSafepoints that bypasses the code that wraps newly introduced polls and existing calls in gc.statepoint. With `-spp-no-statepoints` enabled, PlaceSafepoints effectively becomes a safpeoint **poll** insertion pass. The eventual goal is to "constant fold" this option, along with `-rs4gc-use-deopt-bundles` to `true`, once clients using gc.statepoint are okay doing so. Reviewers: pgavlin, reames, JosephTremoulet Subscribers: sanjoy, mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D16439 llvm-svn: 258551
This commit is contained in:
parent
7b384e7fef
commit
95639746e5
|
@ -108,6 +108,11 @@ static cl::opt<int> CountedLoopTripWidth("spp-counted-loop-trip-width",
|
|||
static cl::opt<bool> SplitBackedge("spp-split-backedge", cl::Hidden,
|
||||
cl::init(false));
|
||||
|
||||
// If true, don't wrap calls (the ones present in the IR, and the ones
|
||||
// introduced due to polls) in gc.statepoint.
|
||||
static cl::opt<bool> NoStatepoints("spp-no-statepoints", cl::Hidden,
|
||||
cl::init(false));
|
||||
|
||||
// Print tracing output
|
||||
static cl::opt<bool> TraceLSP("spp-trace", cl::Hidden, cl::init(false));
|
||||
|
||||
|
@ -661,6 +666,15 @@ bool PlaceSafepoints::runOnFunction(Function &F) {
|
|||
ParsePointNeeded.insert(ParsePointNeeded.end(), RuntimeCalls.begin(),
|
||||
RuntimeCalls.end());
|
||||
}
|
||||
|
||||
// If we've been asked to not wrap the calls with gc.statepoint, then we're
|
||||
// done. In the near future, this option will be "constant folded" to true,
|
||||
// and the code below that deals with insert gc.statepoint calls will be
|
||||
// removed. Wrapping potentially safepointing calls in gc.statepoint will
|
||||
// then become the responsibility of the RewriteStatepointsForGC pass.
|
||||
if (NoStatepoints)
|
||||
return modified;
|
||||
|
||||
PollsNeeded.clear(); // make sure we don't accidentally use
|
||||
// The dominator tree has been invalidated by the inlining performed in the
|
||||
// above loop. TODO: Teach the inliner how to update the dom tree?
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
; RUN: opt -spp-no-statepoints -S -place-safepoints < %s | FileCheck %s
|
||||
|
||||
define void @test() gc "statepoint-example" {
|
||||
; CHECK-LABEL: test(
|
||||
entry:
|
||||
; CHECK: entry:
|
||||
; CHECK: call void @do_safepoint()
|
||||
br label %other
|
||||
|
||||
other:
|
||||
; CHECK: other:
|
||||
call void undef() "gc-leaf-function"
|
||||
; CHECK: call void @do_safepoint()
|
||||
br label %other
|
||||
}
|
||||
|
||||
declare void @do_safepoint()
|
||||
define void @gc.safepoint_poll() {
|
||||
call void @do_safepoint()
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue