xref: /llvm-project/llvm/test/CodeGen/SPIRV/llvm-intrinsics/llvm-vector-reduce/and.ll (revision 67d3ef74b31e1517d4f679e754cc2b3041c95901)
1*67d3ef74SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s
2*67d3ef74SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3540d2551SVyacheslav Levytskyy
4*67d3ef74SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s
5*67d3ef74SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
6540d2551SVyacheslav Levytskyy
7540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Char:.*]] = OpTypeInt 8 0
8540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[CharVec2:.*]] = OpTypeVector %[[Char]] 2
9540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[CharVec3:.*]] = OpTypeVector %[[Char]] 3
10540d2551SVyacheslav Levytskyy
11540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Short:.*]] = OpTypeInt 16 0
12540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[ShortVec2:.*]] = OpTypeVector %[[Short]] 2
13540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[ShortVec3:.*]] = OpTypeVector %[[Short]] 3
14540d2551SVyacheslav Levytskyy
15540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Int:.*]] = OpTypeInt 32 0
16540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[IntVec2:.*]] = OpTypeVector %[[Int]] 2
17540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[IntVec3:.*]] = OpTypeVector %[[Int]] 3
18540d2551SVyacheslav Levytskyy
19540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Long:.*]] = OpTypeInt 64 0
20540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[LongVec2:.*]] = OpTypeVector %[[Long]] 2
21540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[LongVec3:.*]] = OpTypeVector %[[Long]] 3
22540d2551SVyacheslav Levytskyy
23540d2551SVyacheslav Levytskyy; CHECK: OpFunction
24540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[CharVec2]] %[[#]] %[[#]] 1 -1
25540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[CharVec2]] %[[#]] %[[#]]
26540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2CharR:.*]] = OpCompositeExtract %[[Char]] %[[Added1]] 0
27540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2CharR]]
28540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
29540d2551SVyacheslav Levytskyy
30540d2551SVyacheslav Levytskyy; CHECK: OpFunction
31540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Char:.*]] = OpFunctionParameter %[[CharVec3]]
32540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharItem0:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 0
33540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharItem1:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 1
34540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharItem2:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 2
35540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharR1:.*]] = OpBitwiseAnd %[[Char]] %[[Vec3CharItem0]] %[[Vec3CharItem1]]
36540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharR2:.*]] = OpBitwiseAnd %[[Char]] %[[Vec3CharR1]] %[[Vec3CharItem2]]
37540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3CharR2]]
38540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
39540d2551SVyacheslav Levytskyy
40540d2551SVyacheslav Levytskyy; CHECK: OpFunction
41540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[ShortVec2]] %[[#]] %[[#]] 1 -1
42540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[ShortVec2]] %[[#]] %[[#]]
43540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2ShortR:.*]] = OpCompositeExtract %[[Short]] %[[Added1]] 0
44540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2ShortR]]
45540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
46540d2551SVyacheslav Levytskyy
47540d2551SVyacheslav Levytskyy; CHECK: OpFunction
48540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Short:.*]] = OpFunctionParameter %[[ShortVec3]]
49540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortItem0:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 0
50540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortItem1:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 1
51540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortItem2:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 2
52540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortR1:.*]] = OpBitwiseAnd %[[Short]] %[[Vec3ShortItem0]] %[[Vec3ShortItem1]]
53540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortR2:.*]] = OpBitwiseAnd %[[Short]] %[[Vec3ShortR1]] %[[Vec3ShortItem2]]
54540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3ShortR2]]
55540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
56540d2551SVyacheslav Levytskyy
57540d2551SVyacheslav Levytskyy; CHECK: OpFunction
58540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[IntVec2]] %[[#]] %[[#]] 1 -1
59540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[IntVec2]] %[[#]] %[[#]]
60540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2IntR:.*]] = OpCompositeExtract %[[Int]] %[[Added1]] 0
61540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2IntR]]
62540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
63540d2551SVyacheslav Levytskyy
64540d2551SVyacheslav Levytskyy; CHECK: OpFunction
65540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Int:.*]] = OpFunctionParameter %[[IntVec3]]
66540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntItem0:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 0
67540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntItem1:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 1
68540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntItem2:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 2
69540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntR1:.*]] = OpBitwiseAnd %[[Int]] %[[Vec3IntItem0]] %[[Vec3IntItem1]]
70540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntR2:.*]] = OpBitwiseAnd %[[Int]] %[[Vec3IntR1]] %[[Vec3IntItem2]]
71540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3IntR2]]
72540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
73540d2551SVyacheslav Levytskyy
74540d2551SVyacheslav Levytskyy; CHECK: OpFunction
75540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[LongVec2]] %[[#]] %[[#]] 1 -1
76540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[LongVec2]] %[[#]] %[[#]]
77540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2LongR:.*]] = OpCompositeExtract %[[Long]] %[[Added1]] 0
78540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2LongR]]
79540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
80540d2551SVyacheslav Levytskyy
81540d2551SVyacheslav Levytskyy; CHECK: OpFunction
82540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Long:.*]] = OpFunctionParameter %[[LongVec3]]
83540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongItem0:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 0
84540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongItem1:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 1
85540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongItem2:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 2
86540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongR1:.*]] = OpBitwiseAnd %[[Long]] %[[Vec3LongItem0]] %[[Vec3LongItem1]]
87540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongR2:.*]] = OpBitwiseAnd %[[Long]] %[[Vec3LongR1]] %[[Vec3LongItem2]]
88540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3LongR2]]
89540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd
90540d2551SVyacheslav Levytskyy
91540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v2i8(<2 x i8> %v) {
92540d2551SVyacheslav Levytskyyentry:
93540d2551SVyacheslav Levytskyy  %res = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %v)
94540d2551SVyacheslav Levytskyy  ret i8 %res
95540d2551SVyacheslav Levytskyy}
96540d2551SVyacheslav Levytskyy
97540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v3i8(<3 x i8> %v) {
98540d2551SVyacheslav Levytskyyentry:
99540d2551SVyacheslav Levytskyy  %res = call i8 @llvm.vector.reduce.and.v3i8(<3 x i8> %v)
100540d2551SVyacheslav Levytskyy  ret i8 %res
101540d2551SVyacheslav Levytskyy}
102540d2551SVyacheslav Levytskyy
103540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v4i8(<4 x i8> %v) {
104540d2551SVyacheslav Levytskyyentry:
105540d2551SVyacheslav Levytskyy  %res = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %v)
106540d2551SVyacheslav Levytskyy  ret i8 %res
107540d2551SVyacheslav Levytskyy}
108540d2551SVyacheslav Levytskyy
109540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v8i8(<8 x i8> %v) {
110540d2551SVyacheslav Levytskyyentry:
111540d2551SVyacheslav Levytskyy  %res = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %v)
112540d2551SVyacheslav Levytskyy  ret i8 %res
113540d2551SVyacheslav Levytskyy}
114540d2551SVyacheslav Levytskyy
115540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v16i8(<16 x i8> %v) {
116540d2551SVyacheslav Levytskyyentry:
117540d2551SVyacheslav Levytskyy  %res = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %v)
118540d2551SVyacheslav Levytskyy  ret i8 %res
119540d2551SVyacheslav Levytskyy}
120540d2551SVyacheslav Levytskyy
121540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v2i16(<2 x i16> %v) {
122540d2551SVyacheslav Levytskyyentry:
123540d2551SVyacheslav Levytskyy  %res = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %v)
124540d2551SVyacheslav Levytskyy  ret i16 %res
125540d2551SVyacheslav Levytskyy}
126540d2551SVyacheslav Levytskyy
127540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v3i16(<3 x i16> %v) {
128540d2551SVyacheslav Levytskyyentry:
129540d2551SVyacheslav Levytskyy  %res = call i16 @llvm.vector.reduce.and.v3i16(<3 x i16> %v)
130540d2551SVyacheslav Levytskyy  ret i16 %res
131540d2551SVyacheslav Levytskyy}
132540d2551SVyacheslav Levytskyy
133540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v4i16(<4 x i16> %v) {
134540d2551SVyacheslav Levytskyyentry:
135540d2551SVyacheslav Levytskyy  %res = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %v)
136540d2551SVyacheslav Levytskyy  ret i16 %res
137540d2551SVyacheslav Levytskyy}
138540d2551SVyacheslav Levytskyy
139540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v8i16(<8 x i16> %v) {
140540d2551SVyacheslav Levytskyyentry:
141540d2551SVyacheslav Levytskyy  %res = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %v)
142540d2551SVyacheslav Levytskyy  ret i16 %res
143540d2551SVyacheslav Levytskyy}
144540d2551SVyacheslav Levytskyy
145540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v16i16(<16 x i16> %v) {
146540d2551SVyacheslav Levytskyyentry:
147540d2551SVyacheslav Levytskyy  %res = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %v)
148540d2551SVyacheslav Levytskyy  ret i16 %res
149540d2551SVyacheslav Levytskyy}
150540d2551SVyacheslav Levytskyy
151540d2551SVyacheslav Levytskyy
152540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v2i32(<2 x i32> %v) {
153540d2551SVyacheslav Levytskyyentry:
154540d2551SVyacheslav Levytskyy  %res = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %v)
155540d2551SVyacheslav Levytskyy  ret i32 %res
156540d2551SVyacheslav Levytskyy}
157540d2551SVyacheslav Levytskyy
158540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v3i32(<3 x i32> %v) {
159540d2551SVyacheslav Levytskyyentry:
160540d2551SVyacheslav Levytskyy  %res = call i32 @llvm.vector.reduce.and.v3i32(<3 x i32> %v)
161540d2551SVyacheslav Levytskyy  ret i32 %res
162540d2551SVyacheslav Levytskyy}
163540d2551SVyacheslav Levytskyy
164540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v4i32(<4 x i32> %v) {
165540d2551SVyacheslav Levytskyyentry:
166540d2551SVyacheslav Levytskyy  %res = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %v)
167540d2551SVyacheslav Levytskyy  ret i32 %res
168540d2551SVyacheslav Levytskyy}
169540d2551SVyacheslav Levytskyy
170540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v8i32(<8 x i32> %v) {
171540d2551SVyacheslav Levytskyyentry:
172540d2551SVyacheslav Levytskyy  %res = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %v)
173540d2551SVyacheslav Levytskyy  ret i32 %res
174540d2551SVyacheslav Levytskyy}
175540d2551SVyacheslav Levytskyy
176540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v16i32(<16 x i32> %v) {
177540d2551SVyacheslav Levytskyyentry:
178540d2551SVyacheslav Levytskyy  %res = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %v)
179540d2551SVyacheslav Levytskyy  ret i32 %res
180540d2551SVyacheslav Levytskyy}
181540d2551SVyacheslav Levytskyy
182540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v2i64(<2 x i64> %v) {
183540d2551SVyacheslav Levytskyyentry:
184540d2551SVyacheslav Levytskyy  %res = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %v)
185540d2551SVyacheslav Levytskyy  ret i64 %res
186540d2551SVyacheslav Levytskyy}
187540d2551SVyacheslav Levytskyy
188540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v3i64(<3 x i64> %v) {
189540d2551SVyacheslav Levytskyyentry:
190540d2551SVyacheslav Levytskyy  %res = call i64 @llvm.vector.reduce.and.v3i64(<3 x i64> %v)
191540d2551SVyacheslav Levytskyy  ret i64 %res
192540d2551SVyacheslav Levytskyy}
193540d2551SVyacheslav Levytskyy
194540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v4i64(<4 x i64> %v) {
195540d2551SVyacheslav Levytskyyentry:
196540d2551SVyacheslav Levytskyy  %res = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %v)
197540d2551SVyacheslav Levytskyy  ret i64 %res
198540d2551SVyacheslav Levytskyy}
199540d2551SVyacheslav Levytskyy
200540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v8i64(<8 x i64> %v) {
201540d2551SVyacheslav Levytskyyentry:
202540d2551SVyacheslav Levytskyy  %res = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %v)
203540d2551SVyacheslav Levytskyy  ret i64 %res
204540d2551SVyacheslav Levytskyy}
205540d2551SVyacheslav Levytskyy
206540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v16i64(<16 x i64> %v) {
207540d2551SVyacheslav Levytskyyentry:
208540d2551SVyacheslav Levytskyy  %res = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %v)
209540d2551SVyacheslav Levytskyy  ret i64 %res
210540d2551SVyacheslav Levytskyy}
211540d2551SVyacheslav Levytskyy
212540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v2i8(<2 x i8>)
213540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v3i8(<3 x i8>)
214540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>)
215540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>)
216540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>)
217540d2551SVyacheslav Levytskyy
218540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>)
219540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v3i16(<3 x i16>)
220540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>)
221540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>)
222540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>)
223540d2551SVyacheslav Levytskyy
224540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>)
225540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v3i32(<3 x i32>)
226540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>)
227540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>)
228540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>)
229540d2551SVyacheslav Levytskyy
230540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>)
231540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v3i64(<3 x i64>)
232540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>)
233540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>)
234540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>)
235