Skip to content

Commit 86b69c3

Browse files
[SPIR-V] Fix SPIR-V extension SPV_INTEL_function_pointers: introduce CodeSectionINTEL (#117250)
This PR fixes generation of OpConstantFunctionPointerINTEL instruction for the SPIR-V extension SPV_INTEL_function_pointers. Result type of OpConstantFunctionPointerINTEL must be OpTypePointer with Storage Class operand equal to CodeSectionINTEL. See also #116636 CC: @MrSidims
1 parent 676a1e6 commit 86b69c3

File tree

4 files changed

+13
-4
lines changed

4 files changed

+13
-4
lines changed

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3316,9 +3316,6 @@ bool SPIRVInstructionSelector::selectGlobalValue(
33163316
PointerBaseType = GR.getOrCreateSPIRVType(
33173317
GVType, MIRBuilder, SPIRV::AccessQualifier::ReadWrite, false);
33183318
}
3319-
SPIRVType *ResType = GR.getOrCreateSPIRVPointerType(
3320-
PointerBaseType, I, TII,
3321-
addressSpaceToStorageClass(GV->getAddressSpace(), STI));
33223319

33233320
std::string GlobalIdent;
33243321
if (!GV->hasName()) {
@@ -3351,6 +3348,10 @@ bool SPIRVInstructionSelector::selectGlobalValue(
33513348
STI.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers)
33523349
? dyn_cast<Function>(GV)
33533350
: nullptr;
3351+
SPIRVType *ResType = GR.getOrCreateSPIRVPointerType(
3352+
PointerBaseType, I, TII,
3353+
GVFun ? SPIRV::StorageClass::CodeSectionINTEL
3354+
: addressSpaceToStorageClass(GV->getAddressSpace(), STI));
33543355
if (GVFun) {
33553356
// References to a function via function pointers generate virtual
33563357
// registers without a definition. We will resolve it later, during
@@ -3402,6 +3403,9 @@ bool SPIRVInstructionSelector::selectGlobalValue(
34023403
? SPIRV::LinkageType::LinkOnceODR
34033404
: SPIRV::LinkageType::Export);
34043405

3406+
SPIRVType *ResType = GR.getOrCreateSPIRVPointerType(
3407+
PointerBaseType, I, TII,
3408+
addressSpaceToStorageClass(GV->getAddressSpace(), STI));
34053409
Register Reg = GR.buildGlobalVariable(ResVReg, ResType, GlobalIdent, GV,
34063410
Storage, Init, GlobalVar->isConstant(),
34073411
HasLnkTy, LnkType, MIRBuilder, true);

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ addressSpaceToStorageClass(unsigned AddrSpace, const SPIRVSubtarget &STI) {
205205
: SPIRV::StorageClass::CrossWorkgroup;
206206
case 7:
207207
return SPIRV::StorageClass::Input;
208+
case 9:
209+
return SPIRV::StorageClass::CodeSectionINTEL;
208210
default:
209211
report_fatal_error("Unknown address space");
210212
}

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ storageClassToAddressSpace(SPIRV::StorageClass::StorageClass SC) {
166166
return 6;
167167
case SPIRV::StorageClass::Input:
168168
return 7;
169+
case SPIRV::StorageClass::CodeSectionINTEL:
170+
return 9;
169171
default:
170172
report_fatal_error("Unable to get address space id");
171173
}

llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_function_pointers/fp_const.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
; CHECK-DAG: %[[TyInt64:.*]] = OpTypeInt 64 0
1111
; CHECK-DAG: %[[TyFun:.*]] = OpTypeFunction %[[TyInt64]] %[[TyInt64]]
1212
; CHECK-DAG: %[[TyInt8:.*]] = OpTypeInt 8 0
13+
; CHECK-DAG: %[[TyPtrFunCodeSection:.*]] = OpTypePointer CodeSectionINTEL %[[TyFun]]
14+
; CHECK-DAG: %[[ConstFunFp:.*]] = OpConstantFunctionPointerINTEL %[[TyPtrFunCodeSection]] %[[DefFunFp:.*]]
1315
; CHECK-DAG: %[[TyPtrFun:.*]] = OpTypePointer Function %[[TyFun]]
14-
; CHECK-DAG: %[[ConstFunFp:.*]] = OpConstantFunctionPointerINTEL %[[TyPtrFun]] %[[DefFunFp:.*]]
1516
; CHECK-DAG: %[[TyPtrPtrFun:.*]] = OpTypePointer Function %[[TyPtrFun]]
1617
; CHECK-DAG: %[[TyPtrInt8:.*]] = OpTypePointer Function %[[TyInt8]]
1718
; CHECK-DAG: %[[TyPtrPtrInt8:.*]] = OpTypePointer Function %[[TyPtrInt8]]

0 commit comments

Comments
 (0)