From daee17d68a3e834d14ac742e2dad92cee476248b Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Fri, 22 Jan 2016 21:02:55 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@258551 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/PlaceSafepoints.cpp | 14 ++++++++++++++ test/Transforms/PlaceSafepoints/no-statepoints.ll | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 test/Transforms/PlaceSafepoints/no-statepoints.ll diff --git a/lib/Transforms/Scalar/PlaceSafepoints.cpp b/lib/Transforms/Scalar/PlaceSafepoints.cpp index 3df40df861f..63e8115bea6 100644 --- a/lib/Transforms/Scalar/PlaceSafepoints.cpp +++ b/lib/Transforms/Scalar/PlaceSafepoints.cpp @@ -108,6 +108,11 @@ static cl::opt CountedLoopTripWidth("spp-counted-loop-trip-width", static cl::opt 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 NoStatepoints("spp-no-statepoints", cl::Hidden, + cl::init(false)); + // Print tracing output static cl::opt 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? diff --git a/test/Transforms/PlaceSafepoints/no-statepoints.ll b/test/Transforms/PlaceSafepoints/no-statepoints.ll new file mode 100644 index 00000000000..3e4988cb316 --- /dev/null +++ b/test/Transforms/PlaceSafepoints/no-statepoints.ll @@ -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 +} -- 2.11.0