@@ -632,6 +632,9 @@ SPIRVFunction *LLVMToSPIRV::transFunctionDecl(Function *F) {
632632 if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_vector_compute))
633633 transVectorComputeMetadata (F);
634634
635+ if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_maximum_registers))
636+ transFunctionMetadataAsExecutionMode (BF, F);
637+
635638 SPIRVDBG (dbgs () << " [transFunction] " << *F << " => " ;
636639 spvdbgs () << *BF << ' \n ' ;)
637640 return BF;
@@ -708,6 +711,38 @@ void LLVMToSPIRV::transVectorComputeMetadata(Function *F) {
708711 }
709712}
710713
714+ void LLVMToSPIRV::transFunctionMetadataAsExecutionMode (SPIRVFunction *BF,
715+ Function *F) {
716+ SmallVector<MDNode *, 1 > RegisterAllocModeMDs;
717+ F->getMetadata (" RegisterAllocMode" , RegisterAllocModeMDs);
718+
719+ for (unsigned I = 0 ; I < RegisterAllocModeMDs.size (); I++) {
720+ auto *RegisterAllocMode = RegisterAllocModeMDs[I]->getOperand (0 ).get ();
721+ if (isa<MDString>(RegisterAllocMode)) {
722+ const std::string Str = getMDOperandAsString (RegisterAllocModeMDs[I], 0 );
723+ const NamedMaximumNumberOfRegisters NamedValue =
724+ SPIRVNamedMaximumNumberOfRegistersNameMap::rmap (Str);
725+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
726+ OpExecutionMode, BF, ExecutionModeNamedMaximumRegistersINTEL,
727+ NamedValue)));
728+ } else if (isa<MDNode>(RegisterAllocMode)) {
729+ auto *RegisterAllocNodeMDOp =
730+ getMDOperandAsMDNode (RegisterAllocModeMDs[I], 0 );
731+ const int Num = getMDOperandAsInt (RegisterAllocNodeMDOp, 0 );
732+ auto *Const =
733+ BM->addConstant (transType (Type::getInt32Ty (F->getContext ())), Num);
734+ BF->addExecutionMode (BM->add (new SPIRVExecutionModeId (
735+ BF, ExecutionModeMaximumRegistersIdINTEL, Const->getId ())));
736+ } else {
737+ const int64_t RegisterAllocVal =
738+ mdconst::dyn_extract<ConstantInt>(RegisterAllocMode)->getZExtValue ();
739+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
740+ OpExecutionMode, BF, ExecutionModeMaximumRegistersINTEL,
741+ RegisterAllocVal)));
742+ }
743+ }
744+ }
745+
711746SPIRVValue *LLVMToSPIRV::transConstant (Value *V) {
712747 if (auto CPNull = dyn_cast<ConstantPointerNull>(V))
713748 return BM->addNullConstant (
@@ -3254,23 +3289,25 @@ bool LLVMToSPIRV::transExecutionMode() {
32543289 case spv::ExecutionModeContractionOff:
32553290 case spv::ExecutionModeInitializer:
32563291 case spv::ExecutionModeFinalizer:
3257- BF->addExecutionMode (BM->add (
3258- new SPIRVExecutionMode (BF, static_cast <ExecutionMode>(EMode))));
3292+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3293+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
3294+ break ;
32593295 break ;
32603296 case spv::ExecutionModeLocalSize:
32613297 case spv::ExecutionModeLocalSizeHint: {
32623298 unsigned X, Y, Z;
32633299 N.get (X).get (Y).get (Z);
32643300 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3265- BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
3301+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
32663302 } break ;
32673303 case spv::ExecutionModeMaxWorkgroupSizeINTEL: {
32683304 if (BM->isAllowedToUseExtension (
32693305 ExtensionID::SPV_INTEL_kernel_attributes)) {
32703306 unsigned X, Y, Z;
32713307 N.get (X).get (Y).get (Z);
32723308 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3273- BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
3309+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X, Y,
3310+ Z)));
32743311 BM->addCapability (CapabilityKernelAttributesINTEL);
32753312 }
32763313 } break ;
@@ -3279,16 +3316,16 @@ bool LLVMToSPIRV::transExecutionMode() {
32793316 case spv::ExecutionModeSubgroupsPerWorkgroup: {
32803317 unsigned X;
32813318 N.get (X);
3282- BF->addExecutionMode (BM->add (
3283- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode), X)));
3319+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3320+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X)));
32843321 } break ;
32853322 case spv::ExecutionModeNumSIMDWorkitemsINTEL: {
32863323 if (BM->isAllowedToUseExtension (
32873324 ExtensionID::SPV_INTEL_kernel_attributes)) {
32883325 unsigned X;
32893326 N.get (X);
32903327 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3291- BF, static_cast <ExecutionMode>(EMode), X)));
3328+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X)));
32923329 BM->addCapability (CapabilityFPGAKernelAttributesINTEL);
32933330 }
32943331 } break ;
@@ -3298,7 +3335,7 @@ bool LLVMToSPIRV::transExecutionMode() {
32983335 unsigned X;
32993336 N.get (X);
33003337 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3301- BF, static_cast <ExecutionMode>(EMode), X)));
3338+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X)));
33023339 BM->addCapability (CapabilityFPGAKernelAttributesINTEL);
33033340 }
33043341 } break ;
@@ -3308,15 +3345,16 @@ bool LLVMToSPIRV::transExecutionMode() {
33083345 unsigned SLMSize;
33093346 N.get (SLMSize);
33103347 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3311- BF, static_cast <ExecutionMode>(EMode), SLMSize)));
3348+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), SLMSize)));
33123349 } break ;
33133350 case spv::ExecutionModeNamedBarrierCountINTEL: {
33143351 if (!BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_vector_compute))
33153352 break ;
33163353 unsigned NBarrierCnt = 0 ;
33173354 N.get (NBarrierCnt);
3318- BF->addExecutionMode (new SPIRVExecutionMode (
3319- BF, static_cast <ExecutionMode>(EMode), NBarrierCnt));
3355+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3356+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
3357+ NBarrierCnt)));
33203358 BM->addExtension (ExtensionID::SPV_INTEL_vector_compute);
33213359 BM->addCapability (CapabilityVectorComputeINTEL);
33223360 } break ;
@@ -3331,7 +3369,8 @@ bool LLVMToSPIRV::transExecutionMode() {
33313369 unsigned TargetWidth;
33323370 N.get (TargetWidth);
33333371 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3334- BF, static_cast <ExecutionMode>(EMode), TargetWidth)));
3372+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
3373+ TargetWidth)));
33353374 } break ;
33363375 case spv::ExecutionModeRoundingModeRTPINTEL:
33373376 case spv::ExecutionModeRoundingModeRTNINTEL:
@@ -3343,12 +3382,13 @@ bool LLVMToSPIRV::transExecutionMode() {
33433382 unsigned TargetWidth;
33443383 N.get (TargetWidth);
33453384 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3346- BF, static_cast <ExecutionMode>(EMode), TargetWidth)));
3385+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
3386+ TargetWidth)));
33473387 } break ;
33483388 case spv::ExecutionModeFastCompositeKernelINTEL: {
33493389 if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_fast_composite))
3350- BF->addExecutionMode (BM->add (
3351- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
3390+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3391+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
33523392 } break ;
33533393 default :
33543394 llvm_unreachable (" invalid execution mode" );
@@ -3393,8 +3433,8 @@ void LLVMToSPIRV::transFPContract() {
33933433 }
33943434
33953435 if (DisableContraction) {
3396- BF->addExecutionMode (BF->getModule ()->add (
3397- new SPIRVExecutionMode ( BF, spv::ExecutionModeContractionOff)));
3436+ BF->addExecutionMode (BF->getModule ()->add (new SPIRVExecutionMode (
3437+ OpExecutionMode, BF, spv::ExecutionModeContractionOff)));
33983438 }
33993439 }
34003440}
0 commit comments