Skip to content

Commit 728895e

Browse files
[SPIR-V] Explicitly emit vector element count for OpenCL vloadn calls
1 parent 49ee2ff commit 728895e

File tree

4 files changed

+53
-100
lines changed

4 files changed

+53
-100
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ struct VectorLoadStoreBuiltin {
114114
StringRef Name;
115115
InstructionSet::InstructionSet Set;
116116
uint32_t Number;
117+
uint32_t ElementCount;
117118
bool IsRounded;
118119
FPRoundingMode::FPRoundingMode RoundingMode;
119120
};
@@ -1851,6 +1852,7 @@ static bool generateVectorLoadStoreInst(const SPIRV::IncomingCall *Call,
18511852
.addImm(Builtin->Number);
18521853
for (auto Argument : Call->Arguments)
18531854
MIB.addUse(Argument);
1855+
MIB.addImm(Builtin->ElementCount);
18541856

18551857
// Rounding mode should be passed as a last argument in the MI for builtins
18561858
// like "vstorea_halfn_r".

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,18 +1046,24 @@ class VectorLoadStoreBuiltin<string name, InstructionSet set, int number> {
10461046
string Name = name;
10471047
InstructionSet Set = set;
10481048
bits<32> Number = number;
1049+
bits<32> ElementCount = !cond(!not(!eq(!find(name, "2"), -1)) : 2,
1050+
!not(!eq(!find(name, "3"), -1)) : 3,
1051+
!not(!eq(!find(name, "4"), -1)) : 4,
1052+
!not(!eq(!find(name, "8"), -1)) : 8,
1053+
!not(!eq(!find(name, "16"), -1)) : 16,
1054+
true : 1);
10491055
bit IsRounded = !not(!eq(!find(name, "_rt"), -1));
10501056
FPRoundingMode RoundingMode = !cond(!not(!eq(!find(name, "_rte"), -1)) : RTE,
1051-
!not(!eq(!find(name, "_rtz"), -1)) : RTZ,
1052-
!not(!eq(!find(name, "_rtp"), -1)) : RTP,
1053-
!not(!eq(!find(name, "_rtn"), -1)) : RTN,
1054-
true : RTE);
1057+
!not(!eq(!find(name, "_rtz"), -1)) : RTZ,
1058+
!not(!eq(!find(name, "_rtp"), -1)) : RTP,
1059+
!not(!eq(!find(name, "_rtn"), -1)) : RTN,
1060+
true : RTE);
10551061
}
10561062

10571063
// Table gathering all the vector data load/store builtins.
10581064
def VectorLoadStoreBuiltins : GenericTable {
10591065
let FilterClass = "VectorLoadStoreBuiltin";
1060-
let Fields = ["Name", "Set", "Number", "IsRounded", "RoundingMode"];
1066+
let Fields = ["Name", "Set", "Number", "ElementCount", "IsRounded", "RoundingMode"];
10611067
string TypeOf_Set = "InstructionSet";
10621068
string TypeOf_RoundingMode = "FPRoundingMode";
10631069
}

llvm/test/CodeGen/SPIRV/opencl/basic/vstore_private.ll

Lines changed: 0 additions & 95 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2+
; This test only itends to check the vloadn builtin lowering.
3+
; The calls to the OpenCL builtins are not valid and will not pass SPIR-V validation.
4+
5+
; CHECK-DAG: %[[#IMPORT:]] = OpExtInstImport "OpenCL.std"
6+
7+
; CHECK-DAG: %[[#INT8:]] = OpTypeInt 8 0
8+
; CHECK-DAG: %[[#INT16:]] = OpTypeInt 16 0
9+
; CHECK-DAG: %[[#INT32:]] = OpTypeInt 32 0
10+
; CHECK-DAG: %[[#INT64:]] = OpTypeInt 64 0
11+
; CHECK-DAG: %[[#FLOAT:]] = OpTypeFloat 32
12+
; CHECK-DAG: %[[#VINT8:]] = OpTypeVector %[[#INT8]] 2
13+
; CHECK-DAG: %[[#VINT16:]] = OpTypeVector %[[#INT16]] 2
14+
; CHECK-DAG: %[[#VINT32:]] = OpTypeVector %[[#INT32]] 2
15+
; CHECK-DAG: %[[#VINT64:]] = OpTypeVector %[[#INT64]] 2
16+
; CHECK-DAG: %[[#VFLOAT:]] = OpTypeVector %[[#FLOAT]] 2
17+
; CHECK-DAG: %[[#PTRINT8:]] = OpTypePointer CrossWorkgroup %[[#INT8]]
18+
19+
; CHECK: %[[#OFFSET:]] = OpFunctionParameter %[[#INT64]]
20+
; CHECK: %[[#ADDRESS:]] = OpFunctionParameter %[[#PTRINT8]]
21+
22+
define spir_kernel void @test_fn(i64 %offset, ptr addrspace(1) %address) {
23+
; CHECK: %[[#]] = OpExtInst %[[#VINT8]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#ADDRESS]] 2
24+
%call1 = call spir_func <2 x i8> @_Z6vload2mPU3AS1Kc(i64 %offset, ptr addrspace(1) %address)
25+
; CHECK: %[[#]] = OpExtInst %[[#VINT16]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#ADDRESS]] 2
26+
%call2 = call spir_func <2 x i16> @_Z6vload2mPU3AS1Ks(i64 %offset, ptr addrspace(1) %address)
27+
; CHECK: %[[#]] = OpExtInst %[[#VINT32]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#ADDRESS]] 2
28+
%call3 = call spir_func <2 x i32> @_Z6vload2mPU3AS1Ki(i64 %offset, ptr addrspace(1) %address)
29+
; CHECK: %[[#]] = OpExtInst %[[#VINT64]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#ADDRESS]] 2
30+
%call4 = call spir_func <2 x i64> @_Z6vload2mPU3AS1Kl(i64 %offset, ptr addrspace(1) %address)
31+
; CHECK: %[[#]] = OpExtInst %[[#VFLOAT]] %[[#IMPORT]] vloadn %[[#OFFSET]] %[[#ADDRESS]] 2
32+
%call5 = call spir_func <2 x float> @_Z6vload2mPU3AS1Kf(i64 %offset, ptr addrspace(1) %address)
33+
ret void
34+
}
35+
36+
declare spir_func <2 x i8> @_Z6vload2mPU3AS1Kc(i64, ptr addrspace(1))
37+
declare spir_func <2 x i16> @_Z6vload2mPU3AS1Ks(i64, ptr addrspace(1))
38+
declare spir_func <2 x i32> @_Z6vload2mPU3AS1Ki(i64, ptr addrspace(1))
39+
declare spir_func <2 x i64> @_Z6vload2mPU3AS1Kl(i64, ptr addrspace(1))
40+
declare spir_func <2 x float> @_Z6vload2mPU3AS1Kf(i64, ptr addrspace(1))

0 commit comments

Comments
 (0)