[llvm] r193769 - Lower stackmap intrinsics directly to their target opcode in the DAG builder.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Fri Nov 1 08:12:59 PDT 2013


Can you revert for now?

On 1 November 2013 11:09, Aaron Ballman <aaron at aaronballman.com> wrote:
> On Thu, Oct 31, 2013 at 1:18 PM, Andrew Trick <atrick at apple.com> wrote:
>> Author: atrick
>> Date: Thu Oct 31 12:18:24 2013
>> New Revision: 193769
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=193769&view=rev
>> Log:
>> Lower stackmap intrinsics directly to their target opcode in the DAG builder.
>>
>> Modified:
>>     llvm/trunk/include/llvm/Target/Target.td
>>     llvm/trunk/include/llvm/Target/TargetLowering.h
>>     llvm/trunk/include/llvm/Target/TargetOpcodes.h
>>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
>>     llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>>     llvm/trunk/utils/TableGen/CodeGenTarget.cpp
>>
>> Modified: llvm/trunk/include/llvm/Target/Target.td
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/Target.td?rev=193769&r1=193768&r2=193769&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/Target.td (original)
>> +++ llvm/trunk/include/llvm/Target/Target.td Thu Oct 31 12:18:24 2013
>> @@ -800,6 +800,19 @@ def LIFETIME_END : Instruction {
>>    let AsmString = "LIFETIME_END";
>>    let neverHasSideEffects = 1;
>>  }
>> +def STACKMAP : Instruction {
>> +  let OutOperandList = (outs);
>> +  let InOperandList = (ins i32imm:$id, i32imm:$nbytes, variable_ops);
>> +  let isCall = 1;
>> +  let mayLoad = 1;
>> +}
>> +def PATCHPOINT : Instruction {
>> +  let OutOperandList = (outs);
>> +  let InOperandList = (ins i32imm:$id, i32imm:$nbytes, unknown:$callee,
>> +                       i32imm:$nargs, variable_ops);
>> +  let isCall = 1;
>> +  let mayLoad = 1;
>> +}
>>  }
>>
>>  //===----------------------------------------------------------------------===//
>>
>> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=193769&r1=193768&r2=193769&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Thu Oct 31 12:18:24 2013
>> @@ -1920,6 +1920,8 @@ public:
>>      ArgListEntry() : isSExt(false), isZExt(false), isInReg(false),
>>        isSRet(false), isNest(false), isByVal(false), isReturned(false),
>>        Alignment(0) { }
>> +
>> +    void setAttributes(ImmutableCallSite *CS, unsigned AttrIdx);
>>    };
>>    typedef std::vector<ArgListEntry> ArgListTy;
>>
>>
>> Modified: llvm/trunk/include/llvm/Target/TargetOpcodes.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetOpcodes.h?rev=193769&r1=193768&r2=193769&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetOpcodes.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetOpcodes.h Thu Oct 31 12:18:24 2013
>> @@ -92,7 +92,19 @@ namespace TargetOpcode {
>>
>>      /// Lifetime markers.
>>      LIFETIME_START = 15,
>> -    LIFETIME_END = 16
>> +    LIFETIME_END = 16,
>> +
>> +    /// A Stackmap instruction captures the location of live variables at its
>> +    /// position in the instruction stream. It is followed by a shadow of bytes
>> +    /// that must lie within the function and not contain another stackmap.
>> +    STACKMAP = 17,
>> +
>> +    /// Patchable call instruction - this instruction represents a call to a
>> +    /// constant address, followed by a series of NOPs. It is intended to
>> +    /// support optimizations for dynamic languages (such as javascript) that
>> +    /// rewrite calls to runtimes with more efficient code sequences.
>> +    /// This also implies a stack map.
>> +    PATCHPOINT = 18
>>    };
>>  } // end namespace TargetOpcode
>>  } // end namespace llvm
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=193769&r1=193768&r2=193769&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Thu Oct 31 12:18:24 2013
>> @@ -5309,6 +5309,15 @@ SelectionDAGBuilder::visitIntrinsicCall(
>>    case Intrinsic::donothing:
>>      // ignore
>>      return 0;
>> +  case Intrinsic::experimental_stackmap: {
>> +    visitStackmap(I);
>> +    return 0;
>> +  }
>> +  case Intrinsic::experimental_patchpoint_void:
>> +  case Intrinsic::experimental_patchpoint_i64: {
>> +    visitPatchpoint(I);
>> +    return 0;
>> +  }
>>    }
>>  }
>>
>> @@ -5373,15 +5382,8 @@ void SelectionDAGBuilder::LowerCallTo(Im
>>      SDValue ArgNode = getValue(V);
>>      Entry.Node = ArgNode; Entry.Ty = V->getType();
>>
>> -    unsigned attrInd = i - CS.arg_begin() + 1;
>> -    Entry.isSExt     = CS.paramHasAttr(attrInd, Attribute::SExt);
>> -    Entry.isZExt     = CS.paramHasAttr(attrInd, Attribute::ZExt);
>> -    Entry.isInReg    = CS.paramHasAttr(attrInd, Attribute::InReg);
>> -    Entry.isSRet     = CS.paramHasAttr(attrInd, Attribute::StructRet);
>> -    Entry.isNest     = CS.paramHasAttr(attrInd, Attribute::Nest);
>> -    Entry.isByVal    = CS.paramHasAttr(attrInd, Attribute::ByVal);
>> -    Entry.isReturned = CS.paramHasAttr(attrInd, Attribute::Returned);
>> -    Entry.Alignment  = CS.getParamAlignment(attrInd);
>> +    // Skip the first return-type Attribute to get to params.
>> +    Entry.setAttributes(&CS, i - CS.arg_begin() + 1);
>>      Args.push_back(Entry);
>>    }
>>
>> @@ -5463,8 +5465,8 @@ void SelectionDAGBuilder::LowerCallTo(Im
>>    }
>>
>>    if (!Result.second.getNode()) {
>> -    // As a special case, a null chain means that a tail call has been emitted and
>> -    // the DAG root is already updated.
>> +    // As a special case, a null chain means that a tail call has been emitted
>> +    // and the DAG root is already updated.
>>      HasTailCall = true;
>>
>>      // Since there's no actual continuation from this block, nothing can be
>> @@ -6721,6 +6723,189 @@ void SelectionDAGBuilder::visitVACopy(co
>>                            DAG.getSrcValue(I.getArgOperand(1))));
>>  }
>>
>> +/// \brief Lower an argument list according to the target calling convention.
>> +///
>> +/// \return A tuple of <return-value, token-chain>
>> +///
>> +/// This is a helper for lowering intrinsics that follow a target calling
>> +/// convention or require stack pointer adjustment. Only a subset of the
>> +/// intrinsic's operands need to participate in the calling convention.
>> +std::pair<SDValue, SDValue>
>> +SelectionDAGBuilder::LowerCallOperands(const CallInst &CI, unsigned ArgIdx,
>> +                                       unsigned NumArgs, SDValue Callee) {
>> +  TargetLowering::ArgListTy Args;
>> +  Args.reserve(NumArgs);
>> +
>> +  // Populate the argument list.
>> +  // Attributes for args start at offset 1, after the return attribute.
>> +  ImmutableCallSite CS(&CI);
>> +  for (unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs, AttrI = ArgIdx + 1;
>> +       ArgI != ArgE; ++ArgI) {
>> +    const Value *V = CI.getOperand(ArgI);
>> +
>> +    assert(!V->getType()->isEmptyTy() && "Empty type passed to intrinsic.");
>> +
>> +    TargetLowering::ArgListEntry Entry;
>> +    Entry.Node = getValue(V);
>> +    Entry.Ty = V->getType();
>> +    Entry.setAttributes(&CS, AttrI);
>> +    Args.push_back(Entry);
>> +  }
>> +
>> +  TargetLowering::CallLoweringInfo CLI(getRoot(), CI.getType(),
>> +    /*retSExt*/ false, /*retZExt*/ false, /*isVarArg*/ false, /*isInReg*/ false,
>> +    NumArgs, CI.getCallingConv(), /*isTailCall*/ false, /*doesNotReturn*/ false,
>> +    /*isReturnValueUsed*/ CI.use_empty(), Callee, Args, DAG, getCurSDLoc());
>> +
>> +  const TargetLowering *TLI = TM.getTargetLowering();
>> +  return TLI->LowerCallTo(CLI);
>> +}
>> +
>> +/// \brief Lower llvm.experimental.stackmap directly to its target opcode.
>> +void SelectionDAGBuilder::visitStackmap(const CallInst &CI) {
>> +  // void @llvm.experimental.stackmap(i32 <id>, i32 <numShadowBytes>,
>> +  //                                  [live variables...])
>> +
>> +  assert(CI.getType()->isVoidTy() && "Stackmap cannot return a value.");
>> +
>> +  SDValue Callee = getValue(CI.getCalledValue());
>> +
>> +  // Lower into a call sequence with no args and no return value.
>> +  std::pair<SDValue, SDValue> Result = LowerCallOperands(CI, 0, 0, Callee);
>> +  // Set the root to the target-lowered call chain.
>> +  SDValue Chain = Result.second;
>> +  DAG.setRoot(Chain);
>> +
>> +  /// Get a call instruction from the call sequence chain.
>> +  /// Tail calls are not allowed.
>> +  SDNode *CallEnd = Chain.getNode();
>> +  assert(CallEnd->getOpcode() == ISD::CALLSEQ_END &&
>> +         "Expected a callseq node.");
>> +  SDNode *Call = CallEnd->getOperand(0).getNode();
>> +  bool hasGlue = Call->getGluedNode();
>> +
>> +  assert(Call->getNumOperands() == hasGlue ? 2 : 1 &&
>> +         "Unexpected extra stackmap call arguments.");
>
> This assert has an order of evaluation logic error in it, and so it
> could never fire.  I fixed this in r193861, but the assert is now
> firing on the build bots.  Can you look into the failure?
>
> Thanks!
>
> ~Aaron
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list