From 5b57d524bdf7b0f5433cfb4b9649a9668b3a6b7c Mon Sep 17 00:00:00 2001 From: "Levytskyy, Vyacheslav" Date: Thu, 21 Nov 2024 14:35:18 -0800 Subject: [PATCH] fix for SPV_INTEL_function_pointers: result type of OpConstantFunctionPointerINTEL must be OpTypePointer with Storage Class operand equal to CodeSectionINTEL --- llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp | 10 +++++++--- llvm/lib/Target/SPIRV/SPIRVUtils.cpp | 2 ++ llvm/lib/Target/SPIRV/SPIRVUtils.h | 2 ++ .../extensions/SPV_INTEL_function_pointers/fp_const.ll | 3 ++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp index 6b23b0d6b6f78..569fa98ab93e6 100644 --- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp @@ -3292,9 +3292,6 @@ bool SPIRVInstructionSelector::selectGlobalValue( PointerBaseType = GR.getOrCreateSPIRVType( GVType, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false); } - SPIRVType *ResType = GR.getOrCreateSPIRVPointerType( - PointerBaseType, I, TII, - addressSpaceToStorageClass(GV->getAddressSpace(), STI)); std::string GlobalIdent; if (!GV->hasName()) { @@ -3327,6 +3324,10 @@ bool SPIRVInstructionSelector::selectGlobalValue( STI.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers) ? dyn_cast(GV) : nullptr; + SPIRVType *ResType = GR.getOrCreateSPIRVPointerType( + PointerBaseType, I, TII, + GVFun ? SPIRV::StorageClass::CodeSectionINTEL + : addressSpaceToStorageClass(GV->getAddressSpace(), STI)); if (GVFun) { // References to a function via function pointers generate virtual // registers without a definition. We will resolve it later, during @@ -3378,6 +3379,9 @@ bool SPIRVInstructionSelector::selectGlobalValue( ? SPIRV::LinkageType::LinkOnceODR : SPIRV::LinkageType::Export); + SPIRVType *ResType = GR.getOrCreateSPIRVPointerType( + PointerBaseType, I, TII, + addressSpaceToStorageClass(GV->getAddressSpace(), STI)); Register Reg = GR.buildGlobalVariable(ResVReg, ResType, GlobalIdent, GV, Storage, Init, GlobalVar->isConstant(), HasLnkTy, LnkType, MIRBuilder, true); diff --git a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp index aeb2c29f7b861..ad8dfa0e8811b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp @@ -205,6 +205,8 @@ addressSpaceToStorageClass(unsigned AddrSpace, const SPIRVSubtarget &STI) { : SPIRV::StorageClass::CrossWorkgroup; case 7: return SPIRV::StorageClass::Input; + case 9: + return SPIRV::StorageClass::CodeSectionINTEL; default: report_fatal_error("Unknown address space"); } diff --git a/llvm/lib/Target/SPIRV/SPIRVUtils.h b/llvm/lib/Target/SPIRV/SPIRVUtils.h index 298b0b93b0e4d..da0e8769cac1b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVUtils.h +++ b/llvm/lib/Target/SPIRV/SPIRVUtils.h @@ -166,6 +166,8 @@ storageClassToAddressSpace(SPIRV::StorageClass::StorageClass SC) { return 6; case SPIRV::StorageClass::Input: return 7; + case SPIRV::StorageClass::CodeSectionINTEL: + return 9; default: report_fatal_error("Unable to get address space id"); } diff --git a/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_function_pointers/fp_const.ll b/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_function_pointers/fp_const.ll index b4faba9a4eb8e..3ebfa1d8c8a9d 100644 --- a/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_function_pointers/fp_const.ll +++ b/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_function_pointers/fp_const.ll @@ -10,8 +10,9 @@ ; CHECK-DAG: %[[TyInt64:.*]] = OpTypeInt 64 0 ; CHECK-DAG: %[[TyFun:.*]] = OpTypeFunction %[[TyInt64]] %[[TyInt64]] ; CHECK-DAG: %[[TyInt8:.*]] = OpTypeInt 8 0 +; CHECK-DAG: %[[TyPtrFunCodeSection:.*]] = OpTypePointer CodeSectionINTEL %[[TyFun]] +; CHECK-DAG: %[[ConstFunFp:.*]] = OpConstantFunctionPointerINTEL %[[TyPtrFunCodeSection]] %[[DefFunFp:.*]] ; CHECK-DAG: %[[TyPtrFun:.*]] = OpTypePointer Function %[[TyFun]] -; CHECK-DAG: %[[ConstFunFp:.*]] = OpConstantFunctionPointerINTEL %[[TyPtrFun]] %[[DefFunFp:.*]] ; CHECK-DAG: %[[TyPtrPtrFun:.*]] = OpTypePointer Function %[[TyPtrFun]] ; CHECK-DAG: %[[TyPtrInt8:.*]] = OpTypePointer Function %[[TyInt8]] ; CHECK-DAG: %[[TyPtrPtrInt8:.*]] = OpTypePointer Function %[[TyPtrInt8]]