aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-03-24 20:23:29 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-03-24 20:23:29 +0000
commitdf9ae70f49a506cddf6bbfdb472b0913567d8010 (patch)
treed983645250970043594e7fbe9720e07753e95515 /llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
parentc9d4caa32c02c8bfa29c1e5af610c28f7592df5b (diff)
downloadllvm-df9ae70f49a506cddf6bbfdb472b0913567d8010.zip
llvm-df9ae70f49a506cddf6bbfdb472b0913567d8010.tar.gz
llvm-df9ae70f49a506cddf6bbfdb472b0913567d8010.tar.bz2
Add lowering support for llvm.experimental.deoptimize
Summary: Only adds support for "naked" calls to llvm.experimental.deoptimize. Support for round-tripping through RewriteStatepointsForGC will come as a separate patch (should be simpler than this one). Reviewers: reames Subscribers: sanjoy, mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D18429 llvm-svn: 264329
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
index f50d7d0..bf9f1fa 100644
--- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
@@ -923,3 +923,37 @@ void SelectionDAGBuilder::visitGCRelocate(const GCRelocateInst &Relocate) {
assert(SpillLoad.getNode());
setValue(&Relocate, SpillLoad);
}
+
+void SelectionDAGBuilder::LowerDeoptimizeCall(const CallInst *CI) {
+ const auto &TLI = DAG.getTargetLoweringInfo();
+
+ SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::DEOPTIMIZE),
+ TLI.getPointerTy(DAG.getDataLayout()));
+ StatepointLoweringInfo SI(DAG);
+ unsigned ArgBeginIndex = CI->arg_begin() - CI->op_begin();
+ populateCallLoweringInfo(SI.CLI, CI, ArgBeginIndex, CI->getNumArgOperands(),
+ Callee, CI->getType(), false);
+
+ // We don't lower calls to __llvm_deoptimize as varargs, but as a
+ // regular call.
+ assert(!SI.CLI.IsVarArg && "Expected from populateCallLoweringInfo!");
+
+ auto DeoptBundle = *CI->getOperandBundle(LLVMContext::OB_deopt);
+
+ unsigned DefaultID = StatepointDirectives::DeoptBundleStatepointID;
+
+ auto SD = parseStatepointDirectivesFromAttrs(CI->getAttributes());
+ SI.ID = SD.StatepointID.getValueOr(DefaultID);
+ SI.NumPatchBytes = SD.NumPatchBytes.getValueOr(0);
+
+ SI.DeoptState =
+ ArrayRef<const Use>(DeoptBundle.Inputs.begin(), DeoptBundle.Inputs.end());
+ SI.StatepointFlags = static_cast<uint64_t>(StatepointFlags::None);
+
+ // NB! The GC arguments are specifically left empty.
+
+ if (SDValue ReturnVal = LowerAsSTATEPOINT(SI)) {
+ ReturnVal = lowerRangeToAssertZExt(DAG, *CI, ReturnVal);
+ setValue(CI, ReturnVal);
+ }
+}