diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-03-24 20:23:29 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-03-24 20:23:29 +0000 |
commit | df9ae70f49a506cddf6bbfdb472b0913567d8010 (patch) | |
tree | d983645250970043594e7fbe9720e07753e95515 /llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp | |
parent | c9d4caa32c02c8bfa29c1e5af610c28f7592df5b (diff) | |
download | llvm-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.cpp | 34 |
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); + } +} |