@@ -671,6 +671,9 @@ SPIRVFunction *LLVMToSPIRV::transFunctionDecl(Function *F) {
671671
672672 transFPGAFunctionMetadata (BF, F);
673673
674+ if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_maximum_registers))
675+ transFunctionMetadataAsExecutionMode (BF, F);
676+
674677 SPIRVDBG (dbgs () << " [transFunction] " << *F << " => " ;
675678 spvdbgs () << *BF << ' \n ' ;)
676679 return BF;
@@ -769,6 +772,38 @@ void LLVMToSPIRV::transFPGAFunctionMetadata(SPIRVFunction *BF, Function *F) {
769772 }
770773}
771774
775+ void LLVMToSPIRV::transFunctionMetadataAsExecutionMode (SPIRVFunction *BF,
776+ Function *F) {
777+ SmallVector<MDNode *, 1 > RegisterAllocModeMDs;
778+ F->getMetadata (" RegisterAllocMode" , RegisterAllocModeMDs);
779+
780+ for (unsigned I = 0 ; I < RegisterAllocModeMDs.size (); I++) {
781+ auto *RegisterAllocMode = RegisterAllocModeMDs[I]->getOperand (0 ).get ();
782+ if (isa<MDString>(RegisterAllocMode)) {
783+ const std::string Str = getMDOperandAsString (RegisterAllocModeMDs[I], 0 );
784+ const NamedMaximumNumberOfRegisters NamedValue =
785+ SPIRVNamedMaximumNumberOfRegistersNameMap::rmap (Str);
786+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
787+ OpExecutionMode, BF, ExecutionModeNamedMaximumRegistersINTEL,
788+ NamedValue)));
789+ } else if (isa<MDNode>(RegisterAllocMode)) {
790+ auto *RegisterAllocNodeMDOp =
791+ getMDOperandAsMDNode (RegisterAllocModeMDs[I], 0 );
792+ const int Num = getMDOperandAsInt (RegisterAllocNodeMDOp, 0 );
793+ auto *Const =
794+ BM->addConstant (transType (Type::getInt32Ty (F->getContext ())), Num);
795+ BF->addExecutionMode (BM->add (new SPIRVExecutionModeId (
796+ BF, ExecutionModeMaximumRegistersIdINTEL, Const->getId ())));
797+ } else {
798+ const int64_t RegisterAllocVal =
799+ mdconst::dyn_extract<ConstantInt>(RegisterAllocMode)->getZExtValue ();
800+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
801+ OpExecutionMode, BF, ExecutionModeMaximumRegistersINTEL,
802+ RegisterAllocVal)));
803+ }
804+ }
805+ }
806+
772807SPIRVValue *LLVMToSPIRV::transConstant (Value *V) {
773808 if (auto CPNull = dyn_cast<ConstantPointerNull>(V))
774809 return BM->addNullConstant (
@@ -3681,14 +3716,14 @@ bool LLVMToSPIRV::transExecutionMode() {
36813716
36823717 switch (EMode) {
36833718 case spv::ExecutionModeContractionOff:
3684- BF->addExecutionMode (BM->add (
3685- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
3719+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3720+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
36863721 break ;
36873722 case spv::ExecutionModeInitializer:
36883723 case spv::ExecutionModeFinalizer:
36893724 if (BM->isAllowedToUseVersion (VersionNumber::SPIRV_1_1)) {
3690- BF->addExecutionMode (BM->add (
3691- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
3725+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3726+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
36923727 } else {
36933728 getErrorLog ().checkError (false , SPIRVEC_Requires1_1,
36943729 " Initializer/Finalizer Execution Mode" );
@@ -3700,33 +3735,34 @@ bool LLVMToSPIRV::transExecutionMode() {
37003735 unsigned X, Y, Z;
37013736 N.get (X).get (Y).get (Z);
37023737 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3703- BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
3738+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
37043739 } break ;
37053740 case spv::ExecutionModeMaxWorkgroupSizeINTEL: {
37063741 if (BM->isAllowedToUseExtension (
37073742 ExtensionID::SPV_INTEL_kernel_attributes)) {
37083743 unsigned X, Y, Z;
37093744 N.get (X).get (Y).get (Z);
37103745 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3711- BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
3746+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X, Y,
3747+ Z)));
37123748 BM->addCapability (CapabilityKernelAttributesINTEL);
37133749 }
37143750 } break ;
37153751 case spv::ExecutionModeNoGlobalOffsetINTEL: {
3716- if (BM->isAllowedToUseExtension (
3717- ExtensionID::SPV_INTEL_kernel_attributes)) {
3718- BF-> addExecutionMode (BM-> add (
3719- new SPIRVExecutionMode (BF, static_cast <ExecutionMode>(EMode))));
3720- BM-> addCapability (CapabilityKernelAttributesINTEL );
3721- }
3752+ if (! BM->isAllowedToUseExtension (
3753+ ExtensionID::SPV_INTEL_kernel_attributes))
3754+ break ;
3755+ BF-> addExecutionMode (BM-> add ( new SPIRVExecutionMode (
3756+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))) );
3757+ BM-> addCapability (CapabilityKernelAttributesINTEL);
37223758 } break ;
37233759 case spv::ExecutionModeVecTypeHint:
37243760 case spv::ExecutionModeSubgroupSize:
37253761 case spv::ExecutionModeSubgroupsPerWorkgroup: {
37263762 unsigned X;
37273763 N.get (X);
3728- BF->addExecutionMode (BM->add (
3729- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode), X)));
3764+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3765+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X)));
37303766 } break ;
37313767 case spv::ExecutionModeNumSIMDWorkitemsINTEL:
37323768 case spv::ExecutionModeSchedulerTargetFmaxMhzINTEL:
@@ -3736,7 +3772,7 @@ bool LLVMToSPIRV::transExecutionMode() {
37363772 unsigned X;
37373773 N.get (X);
37383774 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3739- BF, static_cast <ExecutionMode>(EMode), X)));
3775+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X)));
37403776 BM->addCapability (CapabilityFPGAKernelAttributesINTEL);
37413777 }
37423778 } break ;
@@ -3746,15 +3782,16 @@ bool LLVMToSPIRV::transExecutionMode() {
37463782 unsigned SLMSize;
37473783 N.get (SLMSize);
37483784 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3749- BF, static_cast <ExecutionMode>(EMode), SLMSize)));
3785+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), SLMSize)));
37503786 } break ;
37513787 case spv::ExecutionModeNamedBarrierCountINTEL: {
37523788 if (!BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_vector_compute))
37533789 break ;
37543790 unsigned NBarrierCnt = 0 ;
37553791 N.get (NBarrierCnt);
3756- BF->addExecutionMode (new SPIRVExecutionMode (
3757- BF, static_cast <ExecutionMode>(EMode), NBarrierCnt));
3792+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3793+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
3794+ NBarrierCnt)));
37583795 BM->addExtension (ExtensionID::SPV_INTEL_vector_compute);
37593796 BM->addCapability (CapabilityVectorComputeINTEL);
37603797 } break ;
@@ -3769,7 +3806,8 @@ bool LLVMToSPIRV::transExecutionMode() {
37693806 unsigned TargetWidth;
37703807 N.get (TargetWidth);
37713808 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3772- BF, static_cast <ExecutionMode>(EMode), TargetWidth)));
3809+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
3810+ TargetWidth)));
37733811 } break ;
37743812 case spv::ExecutionModeRoundingModeRTPINTEL:
37753813 case spv::ExecutionModeRoundingModeRTNINTEL:
@@ -3781,12 +3819,13 @@ bool LLVMToSPIRV::transExecutionMode() {
37813819 unsigned TargetWidth;
37823820 N.get (TargetWidth);
37833821 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3784- BF, static_cast <ExecutionMode>(EMode), TargetWidth)));
3822+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
3823+ TargetWidth)));
37853824 } break ;
37863825 case spv::ExecutionModeFastCompositeKernelINTEL: {
37873826 if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_fast_composite))
3788- BF->addExecutionMode (BM->add (
3789- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
3827+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
3828+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
37903829 } break ;
37913830 default :
37923831 llvm_unreachable (" invalid execution mode" );
@@ -3831,8 +3870,8 @@ void LLVMToSPIRV::transFPContract() {
38313870 }
38323871
38333872 if (DisableContraction) {
3834- BF->addExecutionMode (BF->getModule ()->add (
3835- new SPIRVExecutionMode ( BF, spv::ExecutionModeContractionOff)));
3873+ BF->addExecutionMode (BF->getModule ()->add (new SPIRVExecutionMode (
3874+ OpExecutionMode, BF, spv::ExecutionModeContractionOff)));
38363875 }
38373876 }
38383877}
0 commit comments