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,
|
static cl::opt<bool> SplitBackedge("spp-split-backedge", cl::Hidden,
|
||||||
cl::init(false));
|
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
|
// Print tracing output
|
||||||
static cl::opt<bool> TraceLSP("spp-trace", cl::Hidden, cl::init(false));
|
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(),
|
ParsePointNeeded.insert(ParsePointNeeded.end(), RuntimeCalls.begin(),
|
||||||
RuntimeCalls.end());
|
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
|
PollsNeeded.clear(); // make sure we don't accidentally use
|
||||||
// The dominator tree has been invalidated by the inlining performed in the
|
// The dominator tree has been invalidated by the inlining performed in the
|
||||||
// above loop. TODO: Teach the inliner how to update the dom tree?
|
// 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