Skip to content

Commit 21e0587

Browse files
StuartDBradysvenvh
authored andcommitted
Add new transcoding tests
This also includes an XFAILed SPIR-V test for OpGroupIAdd, which has incorrect name mangling as it maps to _Z21work_group_reduce_addi, which is liable to use "no signed wrap" addition, rather than _Z21work_group_reduce_addj, which should be tolerant of overflow.
1 parent 7a53bfb commit 21e0587

File tree

6 files changed

+637
-0
lines changed

6 files changed

+637
-0
lines changed

test/OpGroupIAdd.spt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
119734787 65536 393230 13 0
2+
2 Capability Addresses
3+
2 Capability Kernel
4+
2 Capability Groups
5+
5 ExtInstImport 1 "OpenCL.std"
6+
3 MemoryModel 1 2
7+
10 EntryPoint 6 6 "testWorkGroupIAddUnsigned"
8+
3 Source 3 200000
9+
3 Name 7 "a"
10+
4 Decorate 8 FuncParamAttr 5
11+
4 TypeInt 3 32 0
12+
4 Constant 3 11 2
13+
2 TypeVoid 2
14+
4 TypePointer 4 5 3
15+
5 TypeFunction 5 2 3 4
16+
17+
18+
5 Function 2 6 0 5
19+
3 FunctionParameter 3 7
20+
3 FunctionParameter 4 8
21+
22+
2 Label 9
23+
6 GroupIAdd 3 10 11 0 7
24+
5 Store 8 10 2 4
25+
1 Return
26+
27+
1 FunctionEnd
28+
29+
; TODO: This currently maps to _Z21work_group_reduce_addi, but should map
30+
; to _Z21work_group_reduce_addj, instead. Remove this test and update
31+
; test/transcoding/group_ops.cl when fixing this.
32+
; XFAIL: *
33+
; RUN: llvm-spirv %s -to-binary -o %t.spv
34+
; RUN: spirv-val %t.spv
35+
; RUN: llvm-spirv -r %t.spv -o %t.bc
36+
; RUN: llvm-dis < %t.bc | FileCheck %s
37+
38+
; CHECK: call spir_func i32 @_Z21work_group_reduce_addj(i32 %a)

test/transcoding/DivRem.cl

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// RUN: %clang_cc1 -triple spir-unknown-unknown -O1 -cl-std=CL2.0 -finclude-default-header -emit-llvm-bc %s -o %t.bc
2+
// RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3+
// RUN: llvm-spirv %t.bc -o %t.spv
4+
// RUN: spirv-val %t.spv
5+
// RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
// RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
7+
8+
// CHECK-SPIRV-DAG: TypeInt [[int:[0-9]+]] 32 0
9+
// CHECK-SPIRV-DAG: TypeVector [[int2:[0-9]+]] [[int]] 2
10+
// CHECK-SPIRV-DAG: TypeFloat [[float:[0-9]+]] 32
11+
// CHECK-SPIRV-DAG: TypeVector [[float2:[0-9]+]] [[float]] 2
12+
13+
// CHECK-SPIRV-LABEL: 5 Function
14+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
15+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
16+
// CHECK-SPIRV: SDiv [[int2]] {{[0-9]+}} [[A]] [[B]]
17+
// CHECK-SPIRV: FunctionEnd
18+
19+
// CHECK-LLVM-LABEL: @testSDiv
20+
// CHECK-LLVM: sdiv <2 x i32> %a, %b
21+
22+
kernel void testSDiv(int2 a, int2 b, global int2 *res) {
23+
res[0] = a / b;
24+
}
25+
26+
// CHECK-SPIRV-LABEL: 5 Function
27+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
28+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
29+
// CHECK-SPIRV: UDiv [[int2]] {{[0-9]+}} [[A]] [[B]]
30+
// CHECK-SPIRV: FunctionEnd
31+
32+
// CHECK-LLVM-LABEL: @testUDiv
33+
// CHECK-LLVM: udiv <2 x i32> %a, %b
34+
35+
kernel void testUDiv(uint2 a, uint2 b, global uint2 *res) {
36+
res[0] = a / b;
37+
}
38+
39+
// CHECK-SPIRV-LABEL: 5 Function
40+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
41+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
42+
// CHECK-SPIRV: FDiv [[float2]] {{[0-9]+}} [[A]] [[B]]
43+
// CHECK-SPIRV: FunctionEnd
44+
45+
// CHECK-LLVM-LABEL: @testFDiv
46+
// CHECK-LLVM: fdiv <2 x float> %a, %b
47+
48+
kernel void testFDiv(float2 a, float2 b, global float2 *res) {
49+
res[0] = a / b;
50+
}
51+
52+
// CHECK-SPIRV-LABEL: 5 Function
53+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
54+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
55+
// CHECK-SPIRV: SRem [[int2]] {{[0-9]+}} [[A]] [[B]]
56+
// CHECK-SPIRV: FunctionEnd
57+
58+
// CHECK-LLVM-LABEL: @testSRem
59+
// CHECK-LLVM: srem <2 x i32> %a, %b
60+
61+
kernel void testSRem(int2 a, int2 b, global int2 *res) {
62+
res[0] = a % b;
63+
}
64+
65+
// CHECK-SPIRV-LABEL: 5 Function
66+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
67+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
68+
// CHECK-SPIRV: UMod [[int2]] {{[0-9]+}} [[A]] [[B]]
69+
// CHECK-SPIRV: FunctionEnd
70+
71+
// CHECK-LLVM-LABEL: @testUMod
72+
// CHECK-LLVM: urem <2 x i32> %a, %b
73+
74+
kernel void testUMod(uint2 a, uint2 b, global uint2 *res) {
75+
res[0] = a % b;
76+
}
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
// RUN: %clang_cc1 -triple spir-unknown-unknown -O1 -cl-std=CL2.0 -finclude-default-header -emit-llvm-bc %s -o %t.bc
2+
// RUN: llvm-spirv %t.bc -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3+
// RUN: llvm-spirv %t.bc -o %t.spv
4+
// RUN: spirv-val %t.spv
5+
// RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
// RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
7+
8+
// CHECK-SPIRV: TypeBool [[bool:[0-9]+]]
9+
// CHECK-SPIRV: TypeVector [[bool2:[0-9]+]] [[bool]] 2
10+
11+
// CHECK-SPIRV-LABEL: 5 Function
12+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
13+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
14+
// CHECK-SPIRV: UGreaterThan [[bool2]] {{[0-9]+}} [[A]] [[B]]
15+
// CHECK-SPIRV: FunctionEnd
16+
17+
// CHECK-LLVM-LABEL: @testUGreaterThan
18+
// CHECK-LLVM: icmp ugt <2 x i32> %a, %b
19+
20+
kernel void testUGreaterThan(uint2 a, uint2 b, global int2 *res) {
21+
res[0] = a > b;
22+
}
23+
24+
// CHECK-SPIRV-LABEL: 5 Function
25+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
26+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
27+
// CHECK-SPIRV: SGreaterThan [[bool2]] {{[0-9]+}} [[A]] [[B]]
28+
// CHECK-SPIRV: FunctionEnd
29+
30+
// CHECK-LLVM-LABEL: @testSGreaterThan
31+
// CHECK-LLVM: icmp sgt <2 x i32> %a, %b
32+
33+
kernel void testSGreaterThan(int2 a, int2 b, global int2 *res) {
34+
res[0] = a > b;
35+
}
36+
37+
// CHECK-SPIRV-LABEL: 5 Function
38+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
39+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
40+
// CHECK-SPIRV: UGreaterThanEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
41+
// CHECK-SPIRV: FunctionEnd
42+
43+
// CHECK-LLVM-LABEL: @testUGreaterThanEqual
44+
// CHECK-LLVM: icmp uge <2 x i32> %a, %b
45+
46+
kernel void testUGreaterThanEqual(uint2 a, uint2 b, global int2 *res) {
47+
res[0] = a >= b;
48+
}
49+
50+
// CHECK-SPIRV-LABEL: 5 Function
51+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
52+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
53+
// CHECK-SPIRV: SGreaterThanEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
54+
// CHECK-SPIRV: FunctionEnd
55+
56+
// CHECK-LLVM-LABEL: @testSGreaterThanEqual
57+
// CHECK-LLVM: icmp sge <2 x i32> %a, %b
58+
59+
kernel void testSGreaterThanEqual(int2 a, int2 b, global int2 *res) {
60+
res[0] = a >= b;
61+
}
62+
63+
// CHECK-SPIRV-LABEL: 5 Function
64+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
65+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
66+
// CHECK-SPIRV: ULessThan [[bool2]] {{[0-9]+}} [[A]] [[B]]
67+
// CHECK-SPIRV: FunctionEnd
68+
69+
// CHECK-LLVM-LABEL: @testULessThan
70+
// CHECK-LLVM: icmp ult <2 x i32> %a, %b
71+
72+
kernel void testULessThan(uint2 a, uint2 b, global int2 *res) {
73+
res[0] = a < b;
74+
}
75+
76+
// CHECK-SPIRV-LABEL: 5 Function
77+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
78+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
79+
// CHECK-SPIRV: SLessThan [[bool2]] {{[0-9]+}} [[A]] [[B]]
80+
// CHECK-SPIRV: FunctionEnd
81+
82+
// CHECK-LLVM-LABEL: @testSLessThan
83+
// CHECK-LLVM: icmp slt <2 x i32> %a, %b
84+
85+
kernel void testSLessThan(int2 a, int2 b, global int2 *res) {
86+
res[0] = a < b;
87+
}
88+
89+
// CHECK-SPIRV-LABEL: 5 Function
90+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
91+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
92+
// CHECK-SPIRV: ULessThanEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
93+
// CHECK-SPIRV: FunctionEnd
94+
95+
// CHECK-LLVM-LABEL: @testULessThanEqual
96+
// CHECK-LLVM: icmp ule <2 x i32> %a, %b
97+
98+
kernel void testULessThanEqual(uint2 a, uint2 b, global int2 *res) {
99+
res[0] = a <= b;
100+
}
101+
102+
// CHECK-SPIRV-LABEL: 5 Function
103+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
104+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
105+
// CHECK-SPIRV: SLessThanEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
106+
// CHECK-SPIRV: FunctionEnd
107+
108+
// CHECK-LLVM-LABEL: @testSLessThanEqual
109+
// CHECK-LLVM: icmp sle <2 x i32> %a, %b
110+
111+
kernel void testSLessThanEqual(int2 a, int2 b, global int2 *res) {
112+
res[0] = a <= b;
113+
}
114+
115+
// CHECK-SPIRV-LABEL: 5 Function
116+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
117+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
118+
// CHECK-SPIRV: FOrdEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
119+
// CHECK-SPIRV: FunctionEnd
120+
121+
// CHECK-LLVM-LABEL: @testFOrdEqual
122+
// CHECK-LLVM: fcmp oeq <2 x float> %a, %b
123+
124+
kernel void testFOrdEqual(float2 a, float2 b, global int2 *res) {
125+
res[0] = a == b;
126+
}
127+
128+
// CHECK-SPIRV-LABEL: 5 Function
129+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
130+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
131+
// CHECK-SPIRV: FUnordNotEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
132+
// CHECK-SPIRV: FunctionEnd
133+
134+
// CHECK-LLVM-LABEL: @testFUnordNotEqual
135+
// CHECK-LLVM: fcmp une <2 x float> %a, %b
136+
137+
kernel void testFUnordNotEqual(float2 a, float2 b, global int2 *res) {
138+
res[0] = a != b;
139+
}
140+
141+
// CHECK-SPIRV-LABEL: 5 Function
142+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
143+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
144+
// CHECK-SPIRV: FOrdGreaterThan [[bool2]] {{[0-9]+}} [[A]] [[B]]
145+
// CHECK-SPIRV: FunctionEnd
146+
147+
// CHECK-LLVM-LABEL: @testFOrdGreaterThan
148+
// CHECK-LLVM: fcmp ogt <2 x float> %a, %b
149+
150+
kernel void testFOrdGreaterThan(float2 a, float2 b, global int2 *res) {
151+
res[0] = a > b;
152+
}
153+
154+
// CHECK-SPIRV-LABEL: 5 Function
155+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
156+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
157+
// CHECK-SPIRV: FOrdGreaterThanEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
158+
// CHECK-SPIRV: FunctionEnd
159+
160+
// CHECK-LLVM-LABEL: @testFOrdGreaterThanEqual
161+
// CHECK-LLVM: fcmp oge <2 x float> %a, %b
162+
163+
kernel void testFOrdGreaterThanEqual(float2 a, float2 b, global int2 *res) {
164+
res[0] = a >= b;
165+
}
166+
167+
// CHECK-SPIRV-LABEL: 5 Function
168+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
169+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
170+
// CHECK-SPIRV: FOrdLessThan [[bool2]] {{[0-9]+}} [[A]] [[B]]
171+
// CHECK-SPIRV: FunctionEnd
172+
173+
// CHECK-LLVM-LABEL: @testFOrdLessThan
174+
// CHECK-LLVM: fcmp olt <2 x float> %a, %b
175+
176+
kernel void testFOrdLessThan(float2 a, float2 b, global int2 *res) {
177+
res[0] = a < b;
178+
}
179+
180+
// CHECK-SPIRV-LABEL: 5 Function
181+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
182+
// CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
183+
// CHECK-SPIRV: FOrdLessThanEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
184+
// CHECK-SPIRV: FunctionEnd
185+
186+
// CHECK-LLVM-LABEL: @testFOrdLessThanEqual
187+
// CHECK-LLVM: fcmp ole <2 x float> %a, %b
188+
189+
kernel void testFOrdLessThanEqual(float2 a, float2 b, global int2 *res) {
190+
res[0] = a <= b;
191+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-text -o %t.txt
3+
; RUN: FileCheck < %t.txt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc -o %t.spv
5+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
7+
8+
; CHECK-SPIRV: TypeBool [[bool:[0-9]+]]
9+
; CHECK-SPIRV: TypeVector [[bool2:[0-9]+]] [[bool]] 2
10+
11+
target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
12+
target triple = "spir-unknown-unknown"
13+
14+
; CHECK-SPIRV-LABEL: 5 Function
15+
; CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[A:[0-9]+]]
16+
; CHECK-SPIRV-NEXT: FunctionParameter {{[0-9]+}} [[B:[0-9]+]]
17+
; CHECK-SPIRV: 5 FOrdNotEqual [[bool2]] {{[0-9]+}} [[A]] [[B]]
18+
; CHECK-SPIRV: FunctionEnd
19+
20+
; CHECK-LLVM-LABEL: @testFOrdNotEqual
21+
; CHECK-LLVM: fcmp one <2 x float> %a, %b
22+
23+
; Function Attrs: nounwind
24+
define spir_kernel void @testFOrdNotEqual(<2 x float> %a, <2 x float> %b) #0 !kernel_arg_addr_space !2 !kernel_arg_access_qual !3 !kernel_arg_type !4 !kernel_arg_type_qual !5 !kernel_arg_base_type !4 {
25+
entry:
26+
%0 = fcmp one <2 x float> %a, %b
27+
ret void
28+
}
29+
30+
attributes #0 = { nounwind }
31+
32+
!opencl.enable.FP_CONTRACT = !{}
33+
!opencl.spir.version = !{!0}
34+
!opencl.ocl.version = !{!0}
35+
!opencl.used.extensions = !{!1}
36+
!opencl.used.optional.core.features = !{!1}
37+
38+
!0 = !{i32 2, i32 0}
39+
!1 = !{}
40+
!2 = !{i32 0, i32 0}
41+
!3 = !{!"none", !"none"}
42+
!4 = !{!"float2", !"float2"}
43+
!5 = !{!"", !""}

0 commit comments

Comments
 (0)