@@ -3041,6 +3041,57 @@ static SPIRVType *getSampledImageType(const TargetExtType *OpaqueType,
30413041 return GR->getOrCreateOpTypeSampledImage (OpaqueImageType, MIRBuilder);
30423042}
30433043
3044+ static SPIRVType *getInlineSpirvType (const TargetExtType *ExtensionType,
3045+ MachineIRBuilder &MIRBuilder,
3046+ SPIRVGlobalRegistry *GR) {
3047+ assert (ExtensionType->getNumIntParameters () == 3 &&
3048+ " Inline SPIR-V type builtin takes an opcode, size, and alignment "
3049+ " parameter" );
3050+ auto Opcode = ExtensionType->getIntParameter (0 );
3051+
3052+ SmallVector<MCOperand> Operands;
3053+ for (llvm::Type *Param : ExtensionType->type_params ()) {
3054+ if (const TargetExtType *ParamEType = dyn_cast<TargetExtType>(Param)) {
3055+ if (ParamEType->getName () == " spirv.IntegralConstant" ) {
3056+ assert (ParamEType->getNumTypeParameters () == 1 &&
3057+ " Inline SPIR-V integral constant builtin must have a type "
3058+ " parameter" );
3059+ assert (ParamEType->getNumIntParameters () == 1 &&
3060+ " Inline SPIR-V integral constant builtin must have a "
3061+ " value parameter" );
3062+
3063+ auto OperandValue = ParamEType->getIntParameter (0 );
3064+ auto *OperandType = ParamEType->getTypeParameter (0 );
3065+
3066+ const SPIRVType *OperandSPIRVType = GR->getOrCreateSPIRVType (
3067+ OperandType, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true );
3068+
3069+ Operands.push_back (MCOperand::createReg (GR->buildConstantInt (
3070+ OperandValue, MIRBuilder, OperandSPIRVType, true )));
3071+ continue ;
3072+ } else if (ParamEType->getName () == " spirv.Literal" ) {
3073+ assert (ParamEType->getNumTypeParameters () == 0 &&
3074+ " Inline SPIR-V literal builtin does not take type "
3075+ " parameters" );
3076+ assert (ParamEType->getNumIntParameters () == 1 &&
3077+ " Inline SPIR-V literal builtin must have an integer "
3078+ " parameter" );
3079+
3080+ auto OperandValue = ParamEType->getIntParameter (0 );
3081+
3082+ Operands.push_back (MCOperand::createImm (OperandValue));
3083+ continue ;
3084+ }
3085+ }
3086+ const SPIRVType *TypeOperand = GR->getOrCreateSPIRVType (
3087+ Param, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, true );
3088+ Operands.push_back (MCOperand::createReg (GR->getSPIRVTypeID (TypeOperand)));
3089+ }
3090+
3091+ return GR->getOrCreateUnknownType (ExtensionType, MIRBuilder, Opcode,
3092+ Operands);
3093+ }
3094+
30443095namespace SPIRV {
30453096TargetExtType *parseBuiltinTypeNameToTargetExtType (std::string TypeName,
30463097 LLVMContext &Context) {
@@ -3113,39 +3164,45 @@ SPIRVType *lowerBuiltinType(const Type *OpaqueType,
31133164 const StringRef Name = BuiltinType->getName ();
31143165 LLVM_DEBUG (dbgs () << " Lowering builtin type: " << Name << " \n " );
31153166
3116- // Lookup the demangled builtin type in the TableGen records.
3117- const SPIRV::BuiltinType *TypeRecord = SPIRV::lookupBuiltinType (Name);
3118- if (!TypeRecord)
3119- report_fatal_error (" Missing TableGen record for builtin type: " + Name);
3120-
3121- // "Lower" the BuiltinType into TargetType. The following get<...>Type methods
3122- // use the implementation details from TableGen records or TargetExtType
3123- // parameters to either create a new OpType<...> machine instruction or get an
3124- // existing equivalent SPIRVType from GlobalRegistry.
31253167 SPIRVType *TargetType;
3126- switch (TypeRecord->Opcode ) {
3127- case SPIRV::OpTypeImage:
3128- TargetType = getImageType (BuiltinType, AccessQual, MIRBuilder, GR);
3129- break ;
3130- case SPIRV::OpTypePipe:
3131- TargetType = getPipeType (BuiltinType, MIRBuilder, GR);
3132- break ;
3133- case SPIRV::OpTypeDeviceEvent:
3134- TargetType = GR->getOrCreateOpTypeDeviceEvent (MIRBuilder);
3135- break ;
3136- case SPIRV::OpTypeSampler:
3137- TargetType = getSamplerType (MIRBuilder, GR);
3138- break ;
3139- case SPIRV::OpTypeSampledImage:
3140- TargetType = getSampledImageType (BuiltinType, MIRBuilder, GR);
3141- break ;
3142- case SPIRV::OpTypeCooperativeMatrixKHR:
3143- TargetType = getCoopMatrType (BuiltinType, MIRBuilder, GR);
3144- break ;
3145- default :
3146- TargetType =
3147- getNonParameterizedType (BuiltinType, TypeRecord, MIRBuilder, GR);
3148- break ;
3168+ if (Name == " spirv.Type" ) {
3169+ TargetType = getInlineSpirvType (BuiltinType, MIRBuilder, GR);
3170+ } else {
3171+ // Lookup the demangled builtin type in the TableGen records.
3172+ const SPIRV::BuiltinType *TypeRecord = SPIRV::lookupBuiltinType (Name);
3173+ if (!TypeRecord)
3174+ report_fatal_error (" Missing TableGen record for builtin type: " + Name);
3175+
3176+ // "Lower" the BuiltinType into TargetType. The following get<...>Type
3177+ // methods use the implementation details from TableGen records or
3178+ // TargetExtType parameters to either create a new OpType<...> machine
3179+ // instruction or get an existing equivalent SPIRVType from
3180+ // GlobalRegistry.
3181+
3182+ switch (TypeRecord->Opcode ) {
3183+ case SPIRV::OpTypeImage:
3184+ TargetType = getImageType (BuiltinType, AccessQual, MIRBuilder, GR);
3185+ break ;
3186+ case SPIRV::OpTypePipe:
3187+ TargetType = getPipeType (BuiltinType, MIRBuilder, GR);
3188+ break ;
3189+ case SPIRV::OpTypeDeviceEvent:
3190+ TargetType = GR->getOrCreateOpTypeDeviceEvent (MIRBuilder);
3191+ break ;
3192+ case SPIRV::OpTypeSampler:
3193+ TargetType = getSamplerType (MIRBuilder, GR);
3194+ break ;
3195+ case SPIRV::OpTypeSampledImage:
3196+ TargetType = getSampledImageType (BuiltinType, MIRBuilder, GR);
3197+ break ;
3198+ case SPIRV::OpTypeCooperativeMatrixKHR:
3199+ TargetType = getCoopMatrType (BuiltinType, MIRBuilder, GR);
3200+ break ;
3201+ default :
3202+ TargetType =
3203+ getNonParameterizedType (BuiltinType, TypeRecord, MIRBuilder, GR);
3204+ break ;
3205+ }
31493206 }
31503207
31513208 // Emit OpName instruction if a new OpType<...> instruction was added
0 commit comments