@@ -2868,6 +2868,61 @@ static SPIRVType *getSampledImageType(const TargetExtType *OpaqueType,
28682868 return GR->getOrCreateOpTypeSampledImage (OpaqueImageType, MIRBuilder);
28692869}
28702870
2871+ static SPIRVType *getInlineSpirvType (const TargetExtType *ExtensionType,
2872+ MachineIRBuilder &MIRBuilder,
2873+ SPIRVGlobalRegistry *GR) {
2874+ assert (ExtensionType->getNumIntParameters () == 3 &&
2875+ " Inline SPIR-V type builtin takes an opcode, size, and alignment "
2876+ " parameter" );
2877+ auto Opcode = ExtensionType->getIntParameter (0 );
2878+
2879+ return GR->getOrCreateUnknownType (
2880+ ExtensionType, MIRBuilder, Opcode,
2881+ [&ExtensionType, &GR, &MIRBuilder](llvm::MachineInstrBuilder Instr) {
2882+ for (llvm::Type *Param : ExtensionType->type_params ()) {
2883+ if (const TargetExtType *ParamEType =
2884+ dyn_cast<TargetExtType>(Param)) {
2885+ if (ParamEType->getName () == " spirv.IntegralConstant" ) {
2886+ assert (ParamEType->getNumTypeParameters () == 1 &&
2887+ " Inline SPIR-V integral constant builtin must have a type "
2888+ " parameter" );
2889+ assert (ParamEType->getNumIntParameters () == 1 &&
2890+ " Inline SPIR-V integral constant builtin must have a "
2891+ " value parameter" );
2892+
2893+ auto OperandValue = ParamEType->getIntParameter (0 );
2894+ auto *OperandType = ParamEType->getTypeParameter (0 );
2895+
2896+ const SPIRVType *OperandSPIRVType =
2897+ GR->getOrCreateSPIRVType (OperandType, MIRBuilder);
2898+
2899+ Instr = Instr.addUse (GR->buildConstantInt (
2900+ OperandValue, MIRBuilder, OperandSPIRVType, true ));
2901+ continue ;
2902+ } else if (ParamEType->getName () == " spirv.Literal" ) {
2903+ assert (ParamEType->getNumTypeParameters () == 0 &&
2904+ " Inline SPIR-V literal builtin does not take type "
2905+ " parameters" );
2906+ assert (ParamEType->getNumIntParameters () == 1 &&
2907+ " Inline SPIR-V literal builtin must have an integer "
2908+ " parameter" );
2909+
2910+ auto OperandValue = ParamEType->getIntParameter (0 );
2911+
2912+ Instr = Instr.addImm (OperandValue);
2913+ continue ;
2914+ }
2915+ }
2916+ const SPIRVType *TypeOperand =
2917+ GR->getOrCreateSPIRVType (Param, MIRBuilder);
2918+ Instr = Instr.addUse (GR->getSPIRVTypeID (TypeOperand));
2919+ }
2920+ return Instr;
2921+ });
2922+
2923+ // GR->getOrCreateSPIRVArrayType();
2924+ }
2925+
28712926namespace SPIRV {
28722927TargetExtType *parseBuiltinTypeNameToTargetExtType (std::string TypeName,
28732928 LLVMContext &Context) {
@@ -2940,39 +2995,45 @@ SPIRVType *lowerBuiltinType(const Type *OpaqueType,
29402995 const StringRef Name = BuiltinType->getName ();
29412996 LLVM_DEBUG (dbgs () << " Lowering builtin type: " << Name << " \n " );
29422997
2943- // Lookup the demangled builtin type in the TableGen records.
2944- const SPIRV::BuiltinType *TypeRecord = SPIRV::lookupBuiltinType (Name);
2945- if (!TypeRecord)
2946- report_fatal_error (" Missing TableGen record for builtin type: " + Name);
2947-
2948- // "Lower" the BuiltinType into TargetType. The following get<...>Type methods
2949- // use the implementation details from TableGen records or TargetExtType
2950- // parameters to either create a new OpType<...> machine instruction or get an
2951- // existing equivalent SPIRVType from GlobalRegistry.
29522998 SPIRVType *TargetType;
2953- switch (TypeRecord->Opcode ) {
2954- case SPIRV::OpTypeImage:
2955- TargetType = getImageType (BuiltinType, AccessQual, MIRBuilder, GR);
2956- break ;
2957- case SPIRV::OpTypePipe:
2958- TargetType = getPipeType (BuiltinType, MIRBuilder, GR);
2959- break ;
2960- case SPIRV::OpTypeDeviceEvent:
2961- TargetType = GR->getOrCreateOpTypeDeviceEvent (MIRBuilder);
2962- break ;
2963- case SPIRV::OpTypeSampler:
2964- TargetType = getSamplerType (MIRBuilder, GR);
2965- break ;
2966- case SPIRV::OpTypeSampledImage:
2967- TargetType = getSampledImageType (BuiltinType, MIRBuilder, GR);
2968- break ;
2969- case SPIRV::OpTypeCooperativeMatrixKHR:
2970- TargetType = getCoopMatrType (BuiltinType, MIRBuilder, GR);
2971- break ;
2972- default :
2973- TargetType =
2974- getNonParameterizedType (BuiltinType, TypeRecord, MIRBuilder, GR);
2975- break ;
2999+ if (Name == " spirv.Type" ) {
3000+ TargetType = getInlineSpirvType (BuiltinType, MIRBuilder, GR);
3001+ } else {
3002+ // Lookup the demangled builtin type in the TableGen records.
3003+ const SPIRV::BuiltinType *TypeRecord = SPIRV::lookupBuiltinType (Name);
3004+ if (!TypeRecord)
3005+ report_fatal_error (" Missing TableGen record for builtin type: " + Name);
3006+
3007+ // "Lower" the BuiltinType into TargetType. The following get<...>Type
3008+ // methods use the implementation details from TableGen records or
3009+ // TargetExtType parameters to either create a new OpType<...> machine
3010+ // instruction or get an existing equivalent SPIRVType from
3011+ // GlobalRegistry.
3012+
3013+ switch (TypeRecord->Opcode ) {
3014+ case SPIRV::OpTypeImage:
3015+ TargetType = getImageType (BuiltinType, AccessQual, MIRBuilder, GR);
3016+ break ;
3017+ case SPIRV::OpTypePipe:
3018+ TargetType = getPipeType (BuiltinType, MIRBuilder, GR);
3019+ break ;
3020+ case SPIRV::OpTypeDeviceEvent:
3021+ TargetType = GR->getOrCreateOpTypeDeviceEvent (MIRBuilder);
3022+ break ;
3023+ case SPIRV::OpTypeSampler:
3024+ TargetType = getSamplerType (MIRBuilder, GR);
3025+ break ;
3026+ case SPIRV::OpTypeSampledImage:
3027+ TargetType = getSampledImageType (BuiltinType, MIRBuilder, GR);
3028+ break ;
3029+ case SPIRV::OpTypeCooperativeMatrixKHR:
3030+ TargetType = getCoopMatrType (BuiltinType, MIRBuilder, GR);
3031+ break ;
3032+ default :
3033+ TargetType =
3034+ getNonParameterizedType (BuiltinType, TypeRecord, MIRBuilder, GR);
3035+ break ;
3036+ }
29763037 }
29773038
29783039 // Emit OpName instruction if a new OpType<...> instruction was added
0 commit comments