void SelectionDAGBuilder::LowerCallSiteWithDeoptBundleImpl( ImmutableCallSite CS, SDValue Callee, const BasicBlock *EHPadBB, bool VarArgDisallowed, bool ForceVoidReturnTy) { StatepointLoweringInfo SI(DAG); unsigned ArgBeginIndex = CS.arg_begin() - CS.getInstruction()->op_begin(); populateCallLoweringInfo( SI.CLI, CS, ArgBeginIndex, CS.getNumArgOperands(), Callee, ForceVoidReturnTy ? Type::getVoidTy(*DAG.getContext()) : CS.getType(), false); if (!VarArgDisallowed) SI.CLI.IsVarArg = CS.getFunctionType()->isVarArg(); auto DeoptBundle = *CS.getOperandBundle(LLVMContext::OB_deopt); unsigned DefaultID = StatepointDirectives::DeoptBundleStatepointID; auto SD = parseStatepointDirectivesFromAttrs(CS.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); SI.EHPadBB = EHPadBB; // NB! The GC arguments are deliberately left empty. if (SDValue ReturnVal = LowerAsSTATEPOINT(SI)) { const Instruction *Inst = CS.getInstruction(); ReturnVal = lowerRangeToAssertZExt(DAG, *Inst, ReturnVal); setValue(Inst, ReturnVal); } }
void SelectionDAGBuilder::LowerCallSiteWithDeoptBundle( ImmutableCallSite CS, SDValue Callee, const BasicBlock *EHPadBB) { StatepointLoweringInfo SI(DAG); unsigned ArgBeginIndex = CS.arg_begin() - CS.getInstruction()->op_begin(); populateCallLoweringInfo(SI.CLI, CS, ArgBeginIndex, CS.getNumArgOperands(), Callee, CS.getType(), false); auto DeoptBundle = *CS.getOperandBundle(LLVMContext::OB_deopt); unsigned DefaultID = StatepointDirectives::DeoptBundleStatepointID; auto SD = parseStatepointDirectivesFromAttrs(CS.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); SI.EHPadBB = EHPadBB; if (SDValue ReturnVal = LowerAsSTATEPOINT(SI)) { const Instruction *Inst = CS.getInstruction(); ReturnVal = lowerRangeToAssertZExt(DAG, *Inst, ReturnVal); setValue(Inst, ReturnVal); } }