@@ -915,6 +915,9 @@ SPIRVFunction *LLVMToSPIRVBase::transFunctionDecl(Function *F) {
915915
916916 transFPGAFunctionMetadata (BF, F);
917917
918+ if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_maximum_registers))
919+ transFunctionMetadataAsExecutionMode (BF, F);
920+
918921 transAuxDataInst (BF, F);
919922
920923 SPIRVDBG (dbgs () << " [transFunction] " << *F << " => " ;
@@ -1041,6 +1044,38 @@ void LLVMToSPIRVBase::transFPGAFunctionMetadata(SPIRVFunction *BF,
10411044 }
10421045}
10431046
1047+ void LLVMToSPIRVBase::transFunctionMetadataAsExecutionMode (SPIRVFunction *BF,
1048+ Function *F) {
1049+ SmallVector<MDNode *, 1 > RegisterAllocModeMDs;
1050+ F->getMetadata (" RegisterAllocMode" , RegisterAllocModeMDs);
1051+
1052+ for (unsigned I = 0 ; I < RegisterAllocModeMDs.size (); I++) {
1053+ auto *RegisterAllocMode = RegisterAllocModeMDs[I]->getOperand (0 ).get ();
1054+ if (isa<MDString>(RegisterAllocMode)) {
1055+ const StringRef Str = getMDOperandAsString (RegisterAllocModeMDs[I], 0 );
1056+ const internal::InternalNamedMaximumNumberOfRegisters NamedValue =
1057+ SPIRVNamedMaximumNumberOfRegistersNameMap::rmap (Str.str ());
1058+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
1059+ OpExecutionMode, BF,
1060+ internal::ExecutionModeNamedMaximumRegistersINTEL, NamedValue)));
1061+ } else if (isa<MDNode>(RegisterAllocMode)) {
1062+ auto *RegisterAllocNodeMDOp =
1063+ getMDOperandAsMDNode (RegisterAllocModeMDs[I], 0 );
1064+ const int Num = getMDOperandAsInt (RegisterAllocNodeMDOp, 0 );
1065+ auto *Const =
1066+ BM->addConstant (transType (Type::getInt32Ty (F->getContext ())), Num);
1067+ BF->addExecutionMode (BM->add (new SPIRVExecutionModeId (
1068+ BF, internal::ExecutionModeMaximumRegistersIdINTEL, Const->getId ())));
1069+ } else {
1070+ const int64_t RegisterAllocVal =
1071+ mdconst::dyn_extract<ConstantInt>(RegisterAllocMode)->getZExtValue ();
1072+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
1073+ OpExecutionMode, BF, internal::ExecutionModeMaximumRegistersINTEL,
1074+ RegisterAllocVal)));
1075+ }
1076+ }
1077+ }
1078+
10441079void LLVMToSPIRVBase::transAuxDataInst (SPIRVFunction *BF, Function *F) {
10451080 auto *BM = BF->getModule ();
10461081 if (!BM->preserveAuxData ())
@@ -3376,6 +3411,8 @@ bool LLVMToSPIRVBase::isKnownIntrinsic(Intrinsic::ID Id) {
33763411 case Intrinsic::dbg_label:
33773412 case Intrinsic::trap:
33783413 case Intrinsic::arithmetic_fence:
3414+ case Intrinsic::uadd_with_overflow:
3415+ case Intrinsic::usub_with_overflow:
33793416 return true ;
33803417 default :
33813418 // Unknown intrinsics' declarations should always be translated
@@ -3809,6 +3846,16 @@ SPIRVValue *LLVMToSPIRVBase::transIntrinsicInst(IntrinsicInst *II,
38093846 SPIRVValue *Zero = transValue (Constant::getNullValue (II->getType ()), BB);
38103847 return BM->addSelectInst (Cmp, Sub, Zero, BB);
38113848 }
3849+ case Intrinsic::uadd_with_overflow: {
3850+ return BM->addBinaryInst (OpIAddCarry, transType (II->getType ()),
3851+ transValue (II->getArgOperand (0 ), BB),
3852+ transValue (II->getArgOperand (1 ), BB), BB);
3853+ }
3854+ case Intrinsic::usub_with_overflow: {
3855+ return BM->addBinaryInst (OpISubBorrow, transType (II->getType ()),
3856+ transValue (II->getArgOperand (0 ), BB),
3857+ transValue (II->getArgOperand (1 ), BB), BB);
3858+ }
38123859 case Intrinsic::memset: {
38133860 // Generally there is no direct mapping of memset to SPIR-V. But it turns
38143861 // out that memset is emitted by Clang for initialization in default
@@ -4885,19 +4932,20 @@ bool LLVMToSPIRVBase::transExecutionMode() {
48854932 auto AddSingleArgExecutionMode = [&](ExecutionMode EMode) {
48864933 uint32_t Arg = 0 ;
48874934 N.get (Arg);
4888- BF->addExecutionMode (BM->add (new SPIRVExecutionMode (BF, EMode, Arg)));
4935+ BF->addExecutionMode (
4936+ BM->add (new SPIRVExecutionMode (OpExecutionMode, BF, EMode, Arg)));
48894937 };
48904938
48914939 switch (EMode) {
48924940 case spv::ExecutionModeContractionOff:
4893- BF->addExecutionMode (BM->add (
4894- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
4941+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
4942+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
48954943 break ;
48964944 case spv::ExecutionModeInitializer:
48974945 case spv::ExecutionModeFinalizer:
48984946 if (BM->isAllowedToUseVersion (VersionNumber::SPIRV_1_1)) {
4899- BF->addExecutionMode (BM->add (
4900- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
4947+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
4948+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
49014949 } else {
49024950 getErrorLog ().checkError (false , SPIRVEC_Requires1_1,
49034951 " Initializer/Finalizer Execution Mode" );
@@ -4909,15 +4957,16 @@ bool LLVMToSPIRVBase::transExecutionMode() {
49094957 unsigned X = 0 , Y = 0 , Z = 0 ;
49104958 N.get (X).get (Y).get (Z);
49114959 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
4912- BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
4960+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
49134961 } break ;
49144962 case spv::ExecutionModeMaxWorkgroupSizeINTEL: {
49154963 if (BM->isAllowedToUseExtension (
49164964 ExtensionID::SPV_INTEL_kernel_attributes)) {
49174965 unsigned X = 0 , Y = 0 , Z = 0 ;
49184966 N.get (X).get (Y).get (Z);
49194967 BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
4920- BF, static_cast <ExecutionMode>(EMode), X, Y, Z)));
4968+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode), X, Y,
4969+ Z)));
49214970 BM->addExtension (ExtensionID::SPV_INTEL_kernel_attributes);
49224971 BM->addCapability (CapabilityKernelAttributesINTEL);
49234972 }
@@ -4926,8 +4975,8 @@ bool LLVMToSPIRVBase::transExecutionMode() {
49264975 if (!BM->isAllowedToUseExtension (
49274976 ExtensionID::SPV_INTEL_kernel_attributes))
49284977 break ;
4929- BF->addExecutionMode (BM->add (
4930- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
4978+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
4979+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
49314980 BM->addExtension (ExtensionID::SPV_INTEL_kernel_attributes);
49324981 BM->addCapability (CapabilityKernelAttributesINTEL);
49334982 } break ;
@@ -4957,8 +5006,9 @@ bool LLVMToSPIRVBase::transExecutionMode() {
49575006 break ;
49585007 unsigned NBarrierCnt = 0 ;
49595008 N.get (NBarrierCnt);
4960- BF->addExecutionMode (new SPIRVExecutionMode (
4961- BF, static_cast <ExecutionMode>(EMode), NBarrierCnt));
5009+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
5010+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode),
5011+ NBarrierCnt)));
49625012 BM->addExtension (ExtensionID::SPV_INTEL_vector_compute);
49635013 BM->addCapability (CapabilityVectorComputeINTEL);
49645014 } break ;
@@ -4988,8 +5038,8 @@ bool LLVMToSPIRVBase::transExecutionMode() {
49885038 } break ;
49895039 case spv::internal::ExecutionModeFastCompositeKernelINTEL: {
49905040 if (BM->isAllowedToUseExtension (ExtensionID::SPV_INTEL_fast_composite))
4991- BF->addExecutionMode (BM->add (
4992- new SPIRVExecutionMode ( BF, static_cast <ExecutionMode>(EMode))));
5041+ BF->addExecutionMode (BM->add (new SPIRVExecutionMode (
5042+ OpExecutionMode, BF, static_cast <ExecutionMode>(EMode))));
49935043 } break ;
49945044 default :
49955045 llvm_unreachable (" invalid execution mode" );
@@ -5034,8 +5084,8 @@ void LLVMToSPIRVBase::transFPContract() {
50345084 }
50355085
50365086 if (DisableContraction) {
5037- BF->addExecutionMode (BF->getModule ()->add (
5038- new SPIRVExecutionMode ( BF, spv::ExecutionModeContractionOff)));
5087+ BF->addExecutionMode (BF->getModule ()->add (new SPIRVExecutionMode (
5088+ OpExecutionMode, BF, spv::ExecutionModeContractionOff)));
50395089 }
50405090 }
50415091}
0 commit comments