Skip to content

Commit 5f99eb9

Browse files
authored
[SPIR-V] Fixup storage class for global private (#118318)
Re-land of #116636 Adds a new address spaces: hlsl_private. Variables with such address space will be emitted with a Private storage class. This is useful for variables global to a SPIR-V module, since up to now, they were still emitted with a Function storage class, which is wrong. --------- Signed-off-by: Nathan Gauër <[email protected]>
1 parent 8075445 commit 5f99eb9

File tree

7 files changed

+86
-23
lines changed

7 files changed

+86
-23
lines changed

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,16 @@ bool SPIRVInstructionSelector::selectAddrSpaceCast(Register ResVReg,
14601460
.addUse(SrcPtr)
14611461
.constrainAllUses(TII, TRI, RBI);
14621462

1463+
if ((SrcSC == SPIRV::StorageClass::Function &&
1464+
DstSC == SPIRV::StorageClass::Private) ||
1465+
(DstSC == SPIRV::StorageClass::Function &&
1466+
SrcSC == SPIRV::StorageClass::Private)) {
1467+
return BuildMI(BB, I, DL, TII.get(TargetOpcode::COPY))
1468+
.addDef(ResVReg)
1469+
.addUse(SrcPtr)
1470+
.constrainAllUses(TII, TRI, RBI);
1471+
}
1472+
14631473
// Casting from an eligible pointer to Generic.
14641474
if (DstSC == SPIRV::StorageClass::Generic && isGenericCastablePtr(SrcSC))
14651475
return selectUnOp(ResVReg, ResType, I, SPIRV::OpPtrCastToGeneric);
@@ -3461,11 +3471,7 @@ bool SPIRVInstructionSelector::selectGlobalValue(
34613471
if (HasInit && !Init)
34623472
return true;
34633473

3464-
unsigned AddrSpace = GV->getAddressSpace();
3465-
SPIRV::StorageClass::StorageClass Storage =
3466-
addressSpaceToStorageClass(AddrSpace, STI);
3467-
bool HasLnkTy = GV->getLinkage() != GlobalValue::InternalLinkage &&
3468-
Storage != SPIRV::StorageClass::Function;
3474+
bool HasLnkTy = GV->getLinkage() != GlobalValue::InternalLinkage;
34693475
SPIRV::LinkageType::LinkageType LnkType =
34703476
(GV->isDeclaration() || GV->hasAvailableExternallyLinkage())
34713477
? SPIRV::LinkageType::Import
@@ -3474,12 +3480,14 @@ bool SPIRVInstructionSelector::selectGlobalValue(
34743480
? SPIRV::LinkageType::LinkOnceODR
34753481
: SPIRV::LinkageType::Export);
34763482

3477-
SPIRVType *ResType = GR.getOrCreateSPIRVPointerType(
3478-
PointerBaseType, I, TII,
3479-
addressSpaceToStorageClass(GV->getAddressSpace(), STI));
3480-
Register Reg = GR.buildGlobalVariable(ResVReg, ResType, GlobalIdent, GV,
3481-
Storage, Init, GlobalVar->isConstant(),
3482-
HasLnkTy, LnkType, MIRBuilder, true);
3483+
const unsigned AddrSpace = GV->getAddressSpace();
3484+
SPIRV::StorageClass::StorageClass StorageClass =
3485+
addressSpaceToStorageClass(AddrSpace, STI);
3486+
SPIRVType *ResType =
3487+
GR.getOrCreateSPIRVPointerType(PointerBaseType, I, TII, StorageClass);
3488+
Register Reg = GR.buildGlobalVariable(
3489+
ResVReg, ResType, GlobalIdent, GV, StorageClass, Init,
3490+
GlobalVar->isConstant(), HasLnkTy, LnkType, MIRBuilder, true);
34833491
return Reg.isValid();
34843492
}
34853493

llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,16 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
112112
const LLT p5 =
113113
LLT::pointer(5, PSize); // Input, SPV_INTEL_usm_storage_classes (Device)
114114
const LLT p6 = LLT::pointer(6, PSize); // SPV_INTEL_usm_storage_classes (Host)
115+
const LLT p7 = LLT::pointer(7, PSize); // Input
116+
const LLT p8 = LLT::pointer(8, PSize); // Output
117+
const LLT p10 = LLT::pointer(10, PSize); // Private
115118

116119
// TODO: remove copy-pasting here by using concatenation in some way.
117120
auto allPtrsScalarsAndVectors = {
118-
p0, p1, p2, p3, p4, p5, p6, s1, s8, s16,
119-
s32, s64, v2s1, v2s8, v2s16, v2s32, v2s64, v3s1, v3s8, v3s16,
120-
v3s32, v3s64, v4s1, v4s8, v4s16, v4s32, v4s64, v8s1, v8s8, v8s16,
121-
v8s32, v8s64, v16s1, v16s8, v16s16, v16s32, v16s64};
121+
p0, p1, p2, p3, p4, p5, p6, p7, p8, p10,
122+
s1, s8, s16, s32, s64, v2s1, v2s8, v2s16, v2s32, v2s64,
123+
v3s1, v3s8, v3s16, v3s32, v3s64, v4s1, v4s8, v4s16, v4s32, v4s64,
124+
v8s1, v8s8, v8s16, v8s32, v8s64, v16s1, v16s8, v16s16, v16s32, v16s64};
122125

123126
auto allVectors = {v2s1, v2s8, v2s16, v2s32, v2s64, v3s1, v3s8,
124127
v3s16, v3s32, v3s64, v4s1, v4s8, v4s16, v4s32,
@@ -145,10 +148,10 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
145148
s16, s32, s64, v2s16, v2s32, v2s64, v3s16, v3s32, v3s64,
146149
v4s16, v4s32, v4s64, v8s16, v8s32, v8s64, v16s16, v16s32, v16s64};
147150

148-
auto allFloatAndIntScalarsAndPtrs = {s8, s16, s32, s64, p0, p1,
149-
p2, p3, p4, p5, p6};
151+
auto allFloatAndIntScalarsAndPtrs = {s8, s16, s32, s64, p0, p1, p2,
152+
p3, p4, p5, p6, p7, p8, p10};
150153

151-
auto allPtrs = {p0, p1, p2, p3, p4, p5, p6};
154+
auto allPtrs = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p10};
152155

153156
bool IsExtendedInts =
154157
ST.canUseExtension(

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,12 @@ addressSpaceToStorageClass(unsigned AddrSpace, const SPIRVSubtarget &STI) {
207207
: SPIRV::StorageClass::CrossWorkgroup;
208208
case 7:
209209
return SPIRV::StorageClass::Input;
210+
case 8:
211+
return SPIRV::StorageClass::Output;
210212
case 9:
211213
return SPIRV::StorageClass::CodeSectionINTEL;
214+
case 10:
215+
return SPIRV::StorageClass::Private;
212216
default:
213217
report_fatal_error("Unknown address space");
214218
}

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,12 @@ storageClassToAddressSpace(SPIRV::StorageClass::StorageClass SC) {
170170
return 6;
171171
case SPIRV::StorageClass::Input:
172172
return 7;
173+
case SPIRV::StorageClass::Output:
174+
return 8;
173175
case SPIRV::StorageClass::CodeSectionINTEL:
174176
return 9;
177+
case SPIRV::StorageClass::Private:
178+
return 10;
175179
default:
176180
report_fatal_error("Unable to get address space id");
177181
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3+
4+
@PrivInternal = internal addrspace(10) global i32 456
5+
; CHECK-DAG: %[[#type:]] = OpTypeInt 32 0
6+
; CHECK-DAG: %[[#ptrty:]] = OpTypePointer Private %[[#type]]
7+
; CHECK-DAG: %[[#value:]] = OpConstant %[[#type]] 456
8+
; CHECK-DAG: %[[#var:]] = OpVariable %[[#ptrty]] Private %[[#value]]
9+
10+
define spir_kernel void @Foo() {
11+
%p = addrspacecast ptr addrspace(10) @PrivInternal to ptr
12+
%v = load i32, ptr %p, align 4
13+
ret void
14+
; CHECK: OpLabel
15+
; CHECK-NEXT: OpLoad %[[#type]] %[[#var]] Aligned 4
16+
; CHECK-Next: OpReturn
17+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK-DAG: %[[#U32:]] = OpTypeInt 32 0
5+
6+
; CHECK-DAG: %[[#VAL:]] = OpConstant %[[#U32]] 456
7+
; CHECK-DAG: %[[#VTYPE:]] = OpTypePointer Private %[[#U32]]
8+
; CHECK-DAG: %[[#VAR:]] = OpVariable %[[#VTYPE]] Private %[[#VAL]]
9+
; CHECK-NOT: OpDecorate %[[#VAR]] LinkageAttributes
10+
@PrivInternal = internal addrspace(10) global i32 456
11+
12+
define void @main() {
13+
%l = load i32, ptr addrspace(10) @PrivInternal
14+
ret void
15+
}

llvm/test/CodeGen/SPIRV/pointers/variables-storage-class.ll

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,29 @@
11
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
22
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
33

4+
; CHECK-DAG: %[[#U8:]] = OpTypeInt 8 0
5+
; CHECK-DAG: %[[#U32:]] = OpTypeInt 32 0
6+
7+
; CHECK-DAG: %[[#TYPE:]] = OpTypePointer CrossWorkgroup %[[#U8]]
8+
; CHECK-DAG: %[[#VAL:]] = OpConstantNull %[[#TYPE]]
9+
; CHECK-DAG: %[[#VTYPE:]] = OpTypePointer CrossWorkgroup %[[#TYPE]]
10+
; CHECK-DAG: %[[#PTR:]] = OpVariable %[[#VTYPE]] CrossWorkgroup %[[#VAL]]
411
@Ptr = addrspace(1) global ptr addrspace(1) null
5-
@Init = private addrspace(2) constant i32 123
612

7-
; CHECK-DAG: %[[#PTR:]] = OpVariable %[[#]] UniformConstant %[[#]]
8-
; CHECK-DAG: %[[#INIT:]] = OpVariable %[[#]] CrossWorkgroup %[[#]]
13+
; CHECK-DAG: %[[#VAL:]] = OpConstant %[[#U32]] 123
14+
; CHECK-DAG: %[[#VTYPE:]] = OpTypePointer UniformConstant %[[#U32]]
15+
; CHECK-DAG: %[[#INIT:]] = OpVariable %[[#VTYPE]] UniformConstant %[[#VAL]]
16+
@Init = private addrspace(2) constant i32 123
917

10-
; CHECK: %[[#]] = OpLoad %[[#]] %[[#INIT]] Aligned 8
11-
; CHECK: OpCopyMemorySized %[[#]] %[[#PTR]] %[[#]] Aligned 4
18+
; CHECK-DAG: %[[#VAL:]] = OpConstant %[[#U32]] 456
19+
; CHECK-DAG: %[[#VTYPE:]] = OpTypePointer Private %[[#U32]]
20+
; CHECK-DAG: %[[#]] = OpVariable %[[#VTYPE]] Private %[[#VAL]]
21+
@PrivInternal = internal addrspace(10) global i32 456
1222

1323
define spir_kernel void @Foo() {
24+
; CHECK: %[[#]] = OpLoad %[[#]] %[[#PTR]] Aligned 8
1425
%l = load ptr addrspace(1), ptr addrspace(1) @Ptr, align 8
26+
; CHECK: OpCopyMemorySized %[[#]] %[[#INIT]] %[[#]] Aligned 4
1527
call void @llvm.memcpy.p1.p2.i64(ptr addrspace(1) align 4 %l, ptr addrspace(2) align 1 @Init, i64 4, i1 false)
1628
ret void
1729
}

0 commit comments

Comments
 (0)