blob: 8926d7c9838dd075ce8c4d1536b1a03591b1a37f [file] [log] [blame]
Mogballa54f4ea2021-10-12 23:14:571// RUN: mlir-opt -split-input-file -convert-std-to-spirv -verify-diagnostics %s | FileCheck %s
Lei Zhangffd45832020-03-18 13:56:382
3//===----------------------------------------------------------------------===//
River Riddledec8af72022-01-31 20:44:354// arith.select
Lei Zhangffd45832020-03-18 13:56:385//===----------------------------------------------------------------------===//
Mahesh Ravishankard3a601c2019-06-11 17:47:066
Lei Zhang67e86902020-03-18 13:55:277module attributes {
8 spv.target_env = #spv.target_env<
Butygin75a1bee2021-10-28 16:04:359 #spv.vce<v1.0, [Int8, Int16, Int64, Float16, Float64, Shader], []>, {}>
Lei Zhang67e86902020-03-18 13:55:2710} {
11
Lei Zhangffd45832020-03-18 13:56:3812// Check integer operation conversions.
13// CHECK-LABEL: @int32_scalar
14func @int32_scalar(%lhs: i32, %rhs: i32) {
15 // CHECK: spv.IAdd %{{.*}}, %{{.*}}: i32
Mogballa54f4ea2021-10-12 23:14:5716 %0 = arith.addi %lhs, %rhs: i32
Lei Zhangffd45832020-03-18 13:56:3817 // CHECK: spv.ISub %{{.*}}, %{{.*}}: i32
Mogballa54f4ea2021-10-12 23:14:5718 %1 = arith.subi %lhs, %rhs: i32
Lei Zhangffd45832020-03-18 13:56:3819 // CHECK: spv.IMul %{{.*}}, %{{.*}}: i32
Mogballa54f4ea2021-10-12 23:14:5720 %2 = arith.muli %lhs, %rhs: i32
Lei Zhangffd45832020-03-18 13:56:3821 // CHECK: spv.SDiv %{{.*}}, %{{.*}}: i32
Mogballa54f4ea2021-10-12 23:14:5722 %3 = arith.divsi %lhs, %rhs: i32
Lei Zhangffd45832020-03-18 13:56:3823 // CHECK: spv.UDiv %{{.*}}, %{{.*}}: i32
Mogballa54f4ea2021-10-12 23:14:5724 %4 = arith.divui %lhs, %rhs: i32
Lei Zhangffd45832020-03-18 13:56:3825 // CHECK: spv.UMod %{{.*}}, %{{.*}}: i32
Mogballa54f4ea2021-10-12 23:14:5726 %5 = arith.remui %lhs, %rhs: i32
Lei Zhang7a894442021-10-05 17:56:2027 // CHECK: spv.GLSL.SMax %{{.*}}, %{{.*}}: i32
Alexander Belyaev9b1d90e2021-11-15 11:52:3728 %6 = arith.maxsi %lhs, %rhs : i32
Lei Zhang7a894442021-10-05 17:56:2029 // CHECK: spv.GLSL.UMax %{{.*}}, %{{.*}}: i32
Alexander Belyaev9b1d90e2021-11-15 11:52:3730 %7 = arith.maxui %lhs, %rhs : i32
Lei Zhang7a894442021-10-05 17:56:2031 // CHECK: spv.GLSL.SMin %{{.*}}, %{{.*}}: i32
Alexander Belyaev9b1d90e2021-11-15 11:52:3732 %8 = arith.minsi %lhs, %rhs : i32
Lei Zhang7a894442021-10-05 17:56:2033 // CHECK: spv.GLSL.UMin %{{.*}}, %{{.*}}: i32
Alexander Belyaev9b1d90e2021-11-15 11:52:3734 %9 = arith.minui %lhs, %rhs : i32
Lei Zhang4ba45a72020-07-12 17:03:2335 return
36}
37
38// CHECK-LABEL: @scalar_srem
39// CHECK-SAME: (%[[LHS:.+]]: i32, %[[RHS:.+]]: i32)
40func @scalar_srem(%lhs: i32, %rhs: i32) {
41 // CHECK: %[[LABS:.+]] = spv.GLSL.SAbs %[[LHS]] : i32
42 // CHECK: %[[RABS:.+]] = spv.GLSL.SAbs %[[RHS]] : i32
43 // CHECK: %[[ABS:.+]] = spv.UMod %[[LABS]], %[[RABS]] : i32
44 // CHECK: %[[POS:.+]] = spv.IEqual %[[LHS]], %[[LABS]] : i32
45 // CHECK: %[[NEG:.+]] = spv.SNegate %[[ABS]] : i32
46 // CHECK: %{{.+}} = spv.Select %[[POS]], %[[ABS]], %[[NEG]] : i1, i32
Mogballa54f4ea2021-10-12 23:14:5747 %0 = arith.remsi %lhs, %rhs: i32
Lei Zhangaaafeac2019-11-23 14:03:4048 return
49}
50
Hanhan Wang58cdb8b2020-03-24 13:15:5451// Check float unary operation conversions.
52// CHECK-LABEL: @float32_unary_scalar
53func @float32_unary_scalar(%arg0: f32) {
54 // CHECK: spv.GLSL.FAbs %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5755 %0 = math.abs %arg0 : f32
Hanhan Wang58cdb8b2020-03-24 13:15:5456 // CHECK: spv.GLSL.Ceil %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5757 %1 = math.ceil %arg0 : f32
Hanhan Wang58cdb8b2020-03-24 13:15:5458 // CHECK: spv.FNegate %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5759 %5 = arith.negf %arg0 : f32
Rob Suderman55565752020-08-13 21:59:5860 // CHECK: spv.GLSL.Floor %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5761 %10 = math.floor %arg0 : f32
Hanhan Wang58cdb8b2020-03-24 13:15:5462 return
63}
64
65// Check float binary operation conversions.
66// CHECK-LABEL: @float32_binary_scalar
67func @float32_binary_scalar(%lhs: f32, %rhs: f32) {
Lei Zhangffd45832020-03-18 13:56:3868 // CHECK: spv.FAdd %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5769 %0 = arith.addf %lhs, %rhs: f32
Lei Zhangffd45832020-03-18 13:56:3870 // CHECK: spv.FSub %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5771 %1 = arith.subf %lhs, %rhs: f32
Lei Zhangffd45832020-03-18 13:56:3872 // CHECK: spv.FMul %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5773 %2 = arith.mulf %lhs, %rhs: f32
Lei Zhangffd45832020-03-18 13:56:3874 // CHECK: spv.FDiv %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5775 %3 = arith.divf %lhs, %rhs: f32
Lei Zhangffd45832020-03-18 13:56:3876 // CHECK: spv.FRem %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:5777 %4 = arith.remf %lhs, %rhs: f32
Lei Zhang7a894442021-10-05 17:56:2078 // CHECK: spv.GLSL.FMax %{{.*}}, %{{.*}}: f32
Alexander Belyaev9b1d90e2021-11-15 11:52:3779 %5 = arith.maxf %lhs, %rhs: f32
Lei Zhang7a894442021-10-05 17:56:2080 // CHECK: spv.GLSL.FMin %{{.*}}, %{{.*}}: f32
Alexander Belyaev9b1d90e2021-11-15 11:52:3781 %6 = arith.minf %lhs, %rhs: f32
Lei Zhangd3e78162020-02-07 16:30:1982 return
Denis Khalikovd968f962019-12-11 19:17:0383}
84
Lei Zhangffd45832020-03-18 13:56:3885// Check int vector types.
86// CHECK-LABEL: @int_vector234
Lei Zhang4ba45a72020-07-12 17:03:2387func @int_vector234(%arg0: vector<2xi8>, %arg1: vector<4xi64>) {
Lei Zhangffd45832020-03-18 13:56:3888 // CHECK: spv.SDiv %{{.*}}, %{{.*}}: vector<2xi8>
Mogballa54f4ea2021-10-12 23:14:5789 %0 = arith.divsi %arg0, %arg0: vector<2xi8>
Lei Zhangffd45832020-03-18 13:56:3890 // CHECK: spv.UDiv %{{.*}}, %{{.*}}: vector<4xi64>
Mogballa54f4ea2021-10-12 23:14:5791 %1 = arith.divui %arg1, %arg1: vector<4xi64>
Lei Zhang4ba45a72020-07-12 17:03:2392 return
93}
94
95// CHECK-LABEL: @vector_srem
96// CHECK-SAME: (%[[LHS:.+]]: vector<3xi16>, %[[RHS:.+]]: vector<3xi16>)
97func @vector_srem(%arg0: vector<3xi16>, %arg1: vector<3xi16>) {
98 // CHECK: %[[LABS:.+]] = spv.GLSL.SAbs %[[LHS]] : vector<3xi16>
99 // CHECK: %[[RABS:.+]] = spv.GLSL.SAbs %[[RHS]] : vector<3xi16>
100 // CHECK: %[[ABS:.+]] = spv.UMod %[[LABS]], %[[RABS]] : vector<3xi16>
101 // CHECK: %[[POS:.+]] = spv.IEqual %[[LHS]], %[[LABS]] : vector<3xi16>
102 // CHECK: %[[NEG:.+]] = spv.SNegate %[[ABS]] : vector<3xi16>
103 // CHECK: %{{.+}} = spv.Select %[[POS]], %[[ABS]], %[[NEG]] : vector<3xi1>, vector<3xi16>
Mogballa54f4ea2021-10-12 23:14:57104 %0 = arith.remsi %arg0, %arg1: vector<3xi16>
Lei Zhangd3e78162020-02-07 16:30:19105 return
Denis Khalikovd968f962019-12-11 19:17:03106}
107
Lei Zhangffd45832020-03-18 13:56:38108// Check float vector types.
109// CHECK-LABEL: @float_vector234
110func @float_vector234(%arg0: vector<2xf16>, %arg1: vector<3xf64>) {
111 // CHECK: spv.FAdd %{{.*}}, %{{.*}}: vector<2xf16>
Mogballa54f4ea2021-10-12 23:14:57112 %0 = arith.addf %arg0, %arg0: vector<2xf16>
Lei Zhangffd45832020-03-18 13:56:38113 // CHECK: spv.FMul %{{.*}}, %{{.*}}: vector<3xf64>
Mogballa54f4ea2021-10-12 23:14:57114 %1 = arith.mulf %arg1, %arg1: vector<3xf64>
Lei Zhangd3e78162020-02-07 16:30:19115 return
Mahesh Ravishankard3a601c2019-06-11 17:47:06116}
117
Lei Zhang9f622b32021-02-05 14:03:48118// CHECK-LABEL: @one_elem_vector
119func @one_elem_vector(%arg0: vector<1xi32>) {
120 // CHECK: spv.IAdd %{{.+}}, %{{.+}}: i32
Mogballa54f4ea2021-10-12 23:14:57121 %0 = arith.addi %arg0, %arg0: vector<1xi32>
Lei Zhangd3e78162020-02-07 16:30:19122 return
Mahesh Ravishankard3a601c2019-06-11 17:47:06123}
124
Lei Zhangffd45832020-03-18 13:56:38125// CHECK-LABEL: @unsupported_5elem_vector
126func @unsupported_5elem_vector(%arg0: vector<5xi32>) {
127 // CHECK: subi
Mogballa54f4ea2021-10-12 23:14:57128 %1 = arith.subi %arg0, %arg0: vector<5xi32>
Lei Zhangd3e78162020-02-07 16:30:19129 return
Mahesh Ravishankard3a601c2019-06-11 17:47:06130}
131
Lei Zhangffd45832020-03-18 13:56:38132// CHECK-LABEL: @unsupported_2x2elem_vector
133func @unsupported_2x2elem_vector(%arg0: vector<2x2xi32>) {
134 // CHECK: muli
Mogballa54f4ea2021-10-12 23:14:57135 %2 = arith.muli %arg0, %arg0: vector<2x2xi32>
Lei Zhangd3e78162020-02-07 16:30:19136 return
Mahesh Ravishankard3a601c2019-06-11 17:47:06137}
138
Lei Zhangffd45832020-03-18 13:56:38139} // end module
140
141// -----
142
143// Check that types are converted to 32-bit when no special capabilities.
144module attributes {
Lei Zhang8d420fb2020-09-03 17:29:14145 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
Lei Zhangffd45832020-03-18 13:56:38146} {
147
Hanhan Wang520a5702020-05-19 17:55:17148// CHECK-LABEL: @int_vector23
149func @int_vector23(%arg0: vector<2xi8>, %arg1: vector<3xi16>) {
Lei Zhangffd45832020-03-18 13:56:38150 // CHECK: spv.SDiv %{{.*}}, %{{.*}}: vector<2xi32>
Mogballa54f4ea2021-10-12 23:14:57151 %0 = arith.divsi %arg0, %arg0: vector<2xi8>
Lei Zhang4ba45a72020-07-12 17:03:23152 // CHECK: spv.SDiv %{{.*}}, %{{.*}}: vector<3xi32>
Mogballa54f4ea2021-10-12 23:14:57153 %1 = arith.divsi %arg1, %arg1: vector<3xi16>
Lei Zhangd3e78162020-02-07 16:30:19154 return
Mahesh Ravishankard3a601c2019-06-11 17:47:06155}
156
Lei Zhangffd45832020-03-18 13:56:38157// CHECK-LABEL: @float_scalar
158func @float_scalar(%arg0: f16, %arg1: f64) {
159 // CHECK: spv.FAdd %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:57160 %0 = arith.addf %arg0, %arg0: f16
Lei Zhangffd45832020-03-18 13:56:38161 // CHECK: spv.FMul %{{.*}}, %{{.*}}: f32
Mogballa54f4ea2021-10-12 23:14:57162 %1 = arith.mulf %arg1, %arg1: f64
Lei Zhangd3e78162020-02-07 16:30:19163 return
Denis Khalikovd968f962019-12-11 19:17:03164}
165
Lei Zhangffd45832020-03-18 13:56:38166} // end module
Denis Khalikovd968f962019-12-11 19:17:03167
Lei Zhangffd45832020-03-18 13:56:38168// -----
Mahesh Ravishankar2be53602019-11-12 21:19:33169
Hanhan Wang520a5702020-05-19 17:55:17170// Check that types are converted to 32-bit when no special capabilities that
171// are not supported.
172module attributes {
Lei Zhang8d420fb2020-09-03 17:29:14173 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
Hanhan Wang520a5702020-05-19 17:55:17174} {
175
River Riddle015192c2021-10-27 02:00:10176// expected-error@below {{failed to materialize conversion for block argument #0 that remained live after conversion}}
Hanhan Wang520a5702020-05-19 17:55:17177func @int_vector4_invalid(%arg0: vector<4xi64>) {
River Riddle015192c2021-10-27 02:00:10178 // expected-error@below {{bitwidth emulation is not implemented yet on unsigned op}}
179 // expected-note@below {{see existing live user here}}
Mogballa54f4ea2021-10-12 23:14:57180 %0 = arith.divui %arg0, %arg0: vector<4xi64>
Hanhan Wang520a5702020-05-19 17:55:17181 return
182}
183
184} // end module
185
186// -----
187
Lei Zhangaaafeac2019-11-23 14:03:40188//===----------------------------------------------------------------------===//
Denis Khalikov9883b142020-01-08 02:40:42189// std bit ops
190//===----------------------------------------------------------------------===//
191
Lei Zhangffd45832020-03-18 13:56:38192module attributes {
Lei Zhang8d420fb2020-09-03 17:29:14193 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
Lei Zhangffd45832020-03-18 13:56:38194} {
195
Denis Khalikov9883b142020-01-08 02:40:42196// CHECK-LABEL: @bitwise_scalar
197func @bitwise_scalar(%arg0 : i32, %arg1 : i32) {
198 // CHECK: spv.BitwiseAnd
Mogballa54f4ea2021-10-12 23:14:57199 %0 = arith.andi %arg0, %arg1 : i32
Denis Khalikov9883b142020-01-08 02:40:42200 // CHECK: spv.BitwiseOr
Mogballa54f4ea2021-10-12 23:14:57201 %1 = arith.ori %arg0, %arg1 : i32
Denis Khalikov9883b142020-01-08 02:40:42202 // CHECK: spv.BitwiseXor
Mogballa54f4ea2021-10-12 23:14:57203 %2 = arith.xori %arg0, %arg1 : i32
Denis Khalikov9883b142020-01-08 02:40:42204 return
205}
206
207// CHECK-LABEL: @bitwise_vector
208func @bitwise_vector(%arg0 : vector<4xi32>, %arg1 : vector<4xi32>) {
209 // CHECK: spv.BitwiseAnd
Mogballa54f4ea2021-10-12 23:14:57210 %0 = arith.andi %arg0, %arg1 : vector<4xi32>
Denis Khalikov9883b142020-01-08 02:40:42211 // CHECK: spv.BitwiseOr
Mogballa54f4ea2021-10-12 23:14:57212 %1 = arith.ori %arg0, %arg1 : vector<4xi32>
Denis Khalikov9883b142020-01-08 02:40:42213 // CHECK: spv.BitwiseXor
Mogballa54f4ea2021-10-12 23:14:57214 %2 = arith.xori %arg0, %arg1 : vector<4xi32>
Denis Khalikov9883b142020-01-08 02:40:42215 return
216}
217
Lei Zhangffd45832020-03-18 13:56:38218// CHECK-LABEL: @logical_scalar
219func @logical_scalar(%arg0 : i1, %arg1 : i1) {
220 // CHECK: spv.LogicalAnd
Mogballa54f4ea2021-10-12 23:14:57221 %0 = arith.andi %arg0, %arg1 : i1
Lei Zhangffd45832020-03-18 13:56:38222 // CHECK: spv.LogicalOr
Mogballa54f4ea2021-10-12 23:14:57223 %1 = arith.ori %arg0, %arg1 : i1
Hanhan Wang7b7df8e2021-04-20 14:34:32224 // CHECK: spv.LogicalNotEqual
Mogballa54f4ea2021-10-12 23:14:57225 %2 = arith.xori %arg0, %arg1 : i1
Lei Zhangffd45832020-03-18 13:56:38226 return
227}
228
229// CHECK-LABEL: @logical_vector
230func @logical_vector(%arg0 : vector<4xi1>, %arg1 : vector<4xi1>) {
231 // CHECK: spv.LogicalAnd
Mogballa54f4ea2021-10-12 23:14:57232 %0 = arith.andi %arg0, %arg1 : vector<4xi1>
Lei Zhangffd45832020-03-18 13:56:38233 // CHECK: spv.LogicalOr
Mogballa54f4ea2021-10-12 23:14:57234 %1 = arith.ori %arg0, %arg1 : vector<4xi1>
Hanhan Wang7b7df8e2021-04-20 14:34:32235 // CHECK: spv.LogicalNotEqual
Mogballa54f4ea2021-10-12 23:14:57236 %2 = arith.xori %arg0, %arg1 : vector<4xi1>
Lei Zhangffd45832020-03-18 13:56:38237 return
238}
239
Denis Khalikov9883b142020-01-08 02:40:42240// CHECK-LABEL: @shift_scalar
241func @shift_scalar(%arg0 : i32, %arg1 : i32) {
242 // CHECK: spv.ShiftLeftLogical
Mogballa54f4ea2021-10-12 23:14:57243 %0 = arith.shli %arg0, %arg1 : i32
Denis Khalikov9883b142020-01-08 02:40:42244 // CHECK: spv.ShiftRightArithmetic
Mogballa54f4ea2021-10-12 23:14:57245 %1 = arith.shrsi %arg0, %arg1 : i32
Denis Khalikov9883b142020-01-08 02:40:42246 // CHECK: spv.ShiftRightLogical
Mogballa54f4ea2021-10-12 23:14:57247 %2 = arith.shrui %arg0, %arg1 : i32
Denis Khalikov9883b142020-01-08 02:40:42248 return
249}
250
251// CHECK-LABEL: @shift_vector
252func @shift_vector(%arg0 : vector<4xi32>, %arg1 : vector<4xi32>) {
253 // CHECK: spv.ShiftLeftLogical
Mogballa54f4ea2021-10-12 23:14:57254 %0 = arith.shli %arg0, %arg1 : vector<4xi32>
Denis Khalikov9883b142020-01-08 02:40:42255 // CHECK: spv.ShiftRightArithmetic
Mogballa54f4ea2021-10-12 23:14:57256 %1 = arith.shrsi %arg0, %arg1 : vector<4xi32>
Denis Khalikov9883b142020-01-08 02:40:42257 // CHECK: spv.ShiftRightLogical
Mogballa54f4ea2021-10-12 23:14:57258 %2 = arith.shrui %arg0, %arg1 : vector<4xi32>
Denis Khalikov9883b142020-01-08 02:40:42259 return
260}
261
Lei Zhang167fb9b2021-01-22 18:03:59262} // end module
263
264// -----
265
Denis Khalikov9883b142020-01-08 02:40:42266//===----------------------------------------------------------------------===//
Denis Khalikovdd495e82020-01-08 02:47:49267// std.cmpf
268//===----------------------------------------------------------------------===//
269
Lei Zhang167fb9b2021-01-22 18:03:59270module attributes {
271 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
272} {
273
Denis Khalikovdd495e82020-01-08 02:47:49274// CHECK-LABEL: @cmpf
275func @cmpf(%arg0 : f32, %arg1 : f32) {
276 // CHECK: spv.FOrdEqual
Mogballa54f4ea2021-10-12 23:14:57277 %1 = arith.cmpf oeq, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49278 // CHECK: spv.FOrdGreaterThan
Mogballa54f4ea2021-10-12 23:14:57279 %2 = arith.cmpf ogt, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49280 // CHECK: spv.FOrdGreaterThanEqual
Mogballa54f4ea2021-10-12 23:14:57281 %3 = arith.cmpf oge, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49282 // CHECK: spv.FOrdLessThan
Mogballa54f4ea2021-10-12 23:14:57283 %4 = arith.cmpf olt, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49284 // CHECK: spv.FOrdLessThanEqual
Mogballa54f4ea2021-10-12 23:14:57285 %5 = arith.cmpf ole, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49286 // CHECK: spv.FOrdNotEqual
Mogballa54f4ea2021-10-12 23:14:57287 %6 = arith.cmpf one, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49288 // CHECK: spv.FUnordEqual
Mogballa54f4ea2021-10-12 23:14:57289 %7 = arith.cmpf ueq, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49290 // CHECK: spv.FUnordGreaterThan
Mogballa54f4ea2021-10-12 23:14:57291 %8 = arith.cmpf ugt, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49292 // CHECK: spv.FUnordGreaterThanEqual
Mogballa54f4ea2021-10-12 23:14:57293 %9 = arith.cmpf uge, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49294 // CHECK: spv.FUnordLessThan
Mogballa54f4ea2021-10-12 23:14:57295 %10 = arith.cmpf ult, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49296 // CHECK: FUnordLessThanEqual
Mogballa54f4ea2021-10-12 23:14:57297 %11 = arith.cmpf ule, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49298 // CHECK: spv.FUnordNotEqual
Mogballa54f4ea2021-10-12 23:14:57299 %12 = arith.cmpf une, %arg0, %arg1 : f32
Denis Khalikovdd495e82020-01-08 02:47:49300 return
301}
302
Lei Zhang167fb9b2021-01-22 18:03:59303} // end module
304
305// -----
306
Lei Zhange27197f2021-01-22 18:08:00307// With Kernel capability, we can convert NaN check to spv.Ordered/spv.Unordered.
Lei Zhang167fb9b2021-01-22 18:03:59308module attributes {
309 spv.target_env = #spv.target_env<#spv.vce<v1.0, [Kernel], []>, {}>
310} {
311
312// CHECK-LABEL: @cmpf
313func @cmpf(%arg0 : f32, %arg1 : f32) {
314 // CHECK: spv.Ordered
Mogballa54f4ea2021-10-12 23:14:57315 %0 = arith.cmpf ord, %arg0, %arg1 : f32
Lei Zhang167fb9b2021-01-22 18:03:59316 // CHECK: spv.Unordered
Mogballa54f4ea2021-10-12 23:14:57317 %1 = arith.cmpf uno, %arg0, %arg1 : f32
Lei Zhang167fb9b2021-01-22 18:03:59318 return
319}
320
321} // end module
322
323// -----
324
Lei Zhange27197f2021-01-22 18:08:00325// Without Kernel capability, we need to convert NaN check to spv.IsNan.
326module attributes {
327 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
328} {
329
330// CHECK-LABEL: @cmpf
331// CHECK-SAME: %[[LHS:.+]]: f32, %[[RHS:.+]]: f32
332func @cmpf(%arg0 : f32, %arg1 : f32) {
333 // CHECK: %[[LHS_NAN:.+]] = spv.IsNan %[[LHS]] : f32
334 // CHECK-NEXT: %[[RHS_NAN:.+]] = spv.IsNan %[[RHS]] : f32
335 // CHECK-NEXT: %[[OR:.+]] = spv.LogicalOr %[[LHS_NAN]], %[[RHS_NAN]] : i1
336 // CHECK-NEXT: %{{.+}} = spv.LogicalNot %[[OR]] : i1
Mogballa54f4ea2021-10-12 23:14:57337 %0 = arith.cmpf ord, %arg0, %arg1 : f32
Lei Zhange27197f2021-01-22 18:08:00338
339 // CHECK-NEXT: %[[LHS_NAN:.+]] = spv.IsNan %[[LHS]] : f32
340 // CHECK-NEXT: %[[RHS_NAN:.+]] = spv.IsNan %[[RHS]] : f32
341 // CHECK-NEXT: %{{.+}} = spv.LogicalOr %[[LHS_NAN]], %[[RHS_NAN]] : i1
Mogballa54f4ea2021-10-12 23:14:57342 %1 = arith.cmpf uno, %arg0, %arg1 : f32
Lei Zhange27197f2021-01-22 18:08:00343 return
344}
345
346} // end module
347
348// -----
349
Denis Khalikovdd495e82020-01-08 02:47:49350//===----------------------------------------------------------------------===//
Lei Zhangaaafeac2019-11-23 14:03:40351// std.cmpi
352//===----------------------------------------------------------------------===//
353
Lei Zhang167fb9b2021-01-22 18:03:59354module attributes {
355 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
356} {
357
Lei Zhangaaafeac2019-11-23 14:03:40358// CHECK-LABEL: @cmpi
359func @cmpi(%arg0 : i32, %arg1 : i32) {
Mahesh Ravishankar2be53602019-11-12 21:19:33360 // CHECK: spv.IEqual
Mogballa54f4ea2021-10-12 23:14:57361 %0 = arith.cmpi eq, %arg0, %arg1 : i32
Mahesh Ravishankar2be53602019-11-12 21:19:33362 // CHECK: spv.INotEqual
Mogballa54f4ea2021-10-12 23:14:57363 %1 = arith.cmpi ne, %arg0, %arg1 : i32
Mahesh Ravishankar2be53602019-11-12 21:19:33364 // CHECK: spv.SLessThan
Mogballa54f4ea2021-10-12 23:14:57365 %2 = arith.cmpi slt, %arg0, %arg1 : i32
Mahesh Ravishankar2be53602019-11-12 21:19:33366 // CHECK: spv.SLessThanEqual
Mogballa54f4ea2021-10-12 23:14:57367 %3 = arith.cmpi sle, %arg0, %arg1 : i32
Mahesh Ravishankar2be53602019-11-12 21:19:33368 // CHECK: spv.SGreaterThan
Mogballa54f4ea2021-10-12 23:14:57369 %4 = arith.cmpi sgt, %arg0, %arg1 : i32
Mahesh Ravishankar2be53602019-11-12 21:19:33370 // CHECK: spv.SGreaterThanEqual
Mogballa54f4ea2021-10-12 23:14:57371 %5 = arith.cmpi sge, %arg0, %arg1 : i32
Denis Khalikovdd495e82020-01-08 02:47:49372 // CHECK: spv.ULessThan
Mogballa54f4ea2021-10-12 23:14:57373 %6 = arith.cmpi ult, %arg0, %arg1 : i32
Denis Khalikovdd495e82020-01-08 02:47:49374 // CHECK: spv.ULessThanEqual
Mogballa54f4ea2021-10-12 23:14:57375 %7 = arith.cmpi ule, %arg0, %arg1 : i32
Denis Khalikovdd495e82020-01-08 02:47:49376 // CHECK: spv.UGreaterThan
Mogballa54f4ea2021-10-12 23:14:57377 %8 = arith.cmpi ugt, %arg0, %arg1 : i32
Denis Khalikovdd495e82020-01-08 02:47:49378 // CHECK: spv.UGreaterThanEqual
Mogballa54f4ea2021-10-12 23:14:57379 %9 = arith.cmpi uge, %arg0, %arg1 : i32
Mahesh Ravishankar2be53602019-11-12 21:19:33380 return
381}
382
MaheshRavishankar1c12a952020-04-29 16:57:31383// CHECK-LABEL: @boolcmpi
384func @boolcmpi(%arg0 : i1, %arg1 : i1) {
385 // CHECK: spv.LogicalEqual
Mogballa54f4ea2021-10-12 23:14:57386 %0 = arith.cmpi eq, %arg0, %arg1 : i1
MaheshRavishankar1c12a952020-04-29 16:57:31387 // CHECK: spv.LogicalNotEqual
Mogballa54f4ea2021-10-12 23:14:57388 %1 = arith.cmpi ne, %arg0, %arg1 : i1
MaheshRavishankar1c12a952020-04-29 16:57:31389 return
390}
391
Hanhan Wang47fd19f2020-11-16 14:50:45392// CHECK-LABEL: @vecboolcmpi
393func @vecboolcmpi(%arg0 : vector<4xi1>, %arg1 : vector<4xi1>) {
394 // CHECK: spv.LogicalEqual
Mogballa54f4ea2021-10-12 23:14:57395 %0 = arith.cmpi eq, %arg0, %arg1 : vector<4xi1>
Hanhan Wang47fd19f2020-11-16 14:50:45396 // CHECK: spv.LogicalNotEqual
Mogballa54f4ea2021-10-12 23:14:57397 %1 = arith.cmpi ne, %arg0, %arg1 : vector<4xi1>
Hanhan Wang47fd19f2020-11-16 14:50:45398 return
399}
400
Lei Zhangffd45832020-03-18 13:56:38401} // end module
402
403// -----
404
Lei Zhangaaafeac2019-11-23 14:03:40405//===----------------------------------------------------------------------===//
Mogballa54f4ea2021-10-12 23:14:57406// arith.constant
Lei Zhangaaafeac2019-11-23 14:03:40407//===----------------------------------------------------------------------===//
408
Lei Zhangffd45832020-03-18 13:56:38409module attributes {
410 spv.target_env = #spv.target_env<
Lei Zhang8d420fb2020-09-03 17:29:14411 #spv.vce<v1.0, [Int8, Int16, Int64, Float16, Float64], []>, {}>
Lei Zhangffd45832020-03-18 13:56:38412} {
413
Lei Zhangaaafeac2019-11-23 14:03:40414// CHECK-LABEL: @constant
415func @constant() {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46416 // CHECK: spv.Constant true
Mogballa54f4ea2021-10-12 23:14:57417 %0 = arith.constant true
KareemErgawy-TomTom5abdca42021-03-04 21:15:46418 // CHECK: spv.Constant 42 : i32
Mogballa54f4ea2021-10-12 23:14:57419 %1 = arith.constant 42 : i32
KareemErgawy-TomTom5abdca42021-03-04 21:15:46420 // CHECK: spv.Constant 5.000000e-01 : f32
Mogballa54f4ea2021-10-12 23:14:57421 %2 = arith.constant 0.5 : f32
KareemErgawy-TomTom5abdca42021-03-04 21:15:46422 // CHECK: spv.Constant dense<[2, 3]> : vector<2xi32>
Mogballa54f4ea2021-10-12 23:14:57423 %3 = arith.constant dense<[2, 3]> : vector<2xi32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46424 // CHECK: spv.Constant 1 : i32
Mogballa54f4ea2021-10-12 23:14:57425 %4 = arith.constant 1 : index
KareemErgawy-TomTom5abdca42021-03-04 21:15:46426 // CHECK: spv.Constant dense<1> : tensor<6xi32> : !spv.array<6 x i32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57427 %5 = arith.constant dense<1> : tensor<2x3xi32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46428 // CHECK: spv.Constant dense<1.000000e+00> : tensor<6xf32> : !spv.array<6 x f32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57429 %6 = arith.constant dense<1.0> : tensor<2x3xf32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46430 // CHECK: spv.Constant dense<{{\[}}1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00, 5.000000e+00, 6.000000e+00]> : tensor<6xf32> : !spv.array<6 x f32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57431 %7 = arith.constant dense<[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]> : tensor<2x3xf32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46432 // CHECK: spv.Constant dense<{{\[}}1, 2, 3, 4, 5, 6]> : tensor<6xi32> : !spv.array<6 x i32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57433 %8 = arith.constant dense<[[1, 2, 3], [4, 5, 6]]> : tensor<2x3xi32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46434 // CHECK: spv.Constant dense<{{\[}}1, 2, 3, 4, 5, 6]> : tensor<6xi32> : !spv.array<6 x i32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57435 %9 = arith.constant dense<[[1, 2], [3, 4], [5, 6]]> : tensor<3x2xi32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46436 // CHECK: spv.Constant dense<{{\[}}1, 2, 3, 4, 5, 6]> : tensor<6xi32> : !spv.array<6 x i32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57437 %10 = arith.constant dense<[1, 2, 3, 4, 5, 6]> : tensor<6xi32>
Lei Zhangaaafeac2019-11-23 14:03:40438 return
439}
440
Lei Zhang73431a42020-03-18 13:56:51441// CHECK-LABEL: @constant_16bit
442func @constant_16bit() {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46443 // CHECK: spv.Constant 4 : i16
Mogballa54f4ea2021-10-12 23:14:57444 %0 = arith.constant 4 : i16
KareemErgawy-TomTom5abdca42021-03-04 21:15:46445 // CHECK: spv.Constant 5.000000e+00 : f16
Mogballa54f4ea2021-10-12 23:14:57446 %1 = arith.constant 5.0 : f16
KareemErgawy-TomTom5abdca42021-03-04 21:15:46447 // CHECK: spv.Constant dense<[2, 3]> : vector<2xi16>
Mogballa54f4ea2021-10-12 23:14:57448 %2 = arith.constant dense<[2, 3]> : vector<2xi16>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46449 // CHECK: spv.Constant dense<4.000000e+00> : tensor<5xf16> : !spv.array<5 x f16, stride=2>
Mogballa54f4ea2021-10-12 23:14:57450 %3 = arith.constant dense<4.0> : tensor<5xf16>
Lei Zhang73431a42020-03-18 13:56:51451 return
452}
453
454// CHECK-LABEL: @constant_64bit
455func @constant_64bit() {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46456 // CHECK: spv.Constant 4 : i64
Mogballa54f4ea2021-10-12 23:14:57457 %0 = arith.constant 4 : i64
KareemErgawy-TomTom5abdca42021-03-04 21:15:46458 // CHECK: spv.Constant 5.000000e+00 : f64
Mogballa54f4ea2021-10-12 23:14:57459 %1 = arith.constant 5.0 : f64
KareemErgawy-TomTom5abdca42021-03-04 21:15:46460 // CHECK: spv.Constant dense<[2, 3]> : vector<2xi64>
Mogballa54f4ea2021-10-12 23:14:57461 %2 = arith.constant dense<[2, 3]> : vector<2xi64>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46462 // CHECK: spv.Constant dense<4.000000e+00> : tensor<5xf64> : !spv.array<5 x f64, stride=8>
Mogballa54f4ea2021-10-12 23:14:57463 %3 = arith.constant dense<4.0> : tensor<5xf64>
Lei Zhang73431a42020-03-18 13:56:51464 return
465}
466
467} // end module
468
469// -----
470
471// Check that constants are converted to 32-bit when no special capability.
472module attributes {
Lei Zhang8d420fb2020-09-03 17:29:14473 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
Lei Zhang73431a42020-03-18 13:56:51474} {
475
476// CHECK-LABEL: @constant_16bit
477func @constant_16bit() {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46478 // CHECK: spv.Constant 4 : i32
Mogballa54f4ea2021-10-12 23:14:57479 %0 = arith.constant 4 : i16
KareemErgawy-TomTom5abdca42021-03-04 21:15:46480 // CHECK: spv.Constant 5.000000e+00 : f32
Mogballa54f4ea2021-10-12 23:14:57481 %1 = arith.constant 5.0 : f16
KareemErgawy-TomTom5abdca42021-03-04 21:15:46482 // CHECK: spv.Constant dense<[2, 3]> : vector<2xi32>
Mogballa54f4ea2021-10-12 23:14:57483 %2 = arith.constant dense<[2, 3]> : vector<2xi16>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46484 // CHECK: spv.Constant dense<4.000000e+00> : tensor<5xf32> : !spv.array<5 x f32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57485 %3 = arith.constant dense<4.0> : tensor<5xf16>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46486 // CHECK: spv.Constant dense<[1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00]> : tensor<4xf32> : !spv.array<4 x f32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57487 %4 = arith.constant dense<[[1.0, 2.0], [3.0, 4.0]]> : tensor<2x2xf16>
Lei Zhang73431a42020-03-18 13:56:51488 return
489}
490
491// CHECK-LABEL: @constant_64bit
492func @constant_64bit() {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46493 // CHECK: spv.Constant 4 : i32
Mogballa54f4ea2021-10-12 23:14:57494 %0 = arith.constant 4 : i64
KareemErgawy-TomTom5abdca42021-03-04 21:15:46495 // CHECK: spv.Constant 5.000000e+00 : f32
Mogballa54f4ea2021-10-12 23:14:57496 %1 = arith.constant 5.0 : f64
KareemErgawy-TomTom5abdca42021-03-04 21:15:46497 // CHECK: spv.Constant dense<[2, 3]> : vector<2xi32>
Mogballa54f4ea2021-10-12 23:14:57498 %2 = arith.constant dense<[2, 3]> : vector<2xi64>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46499 // CHECK: spv.Constant dense<4.000000e+00> : tensor<5xf32> : !spv.array<5 x f32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57500 %3 = arith.constant dense<4.0> : tensor<5xf64>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46501 // CHECK: spv.Constant dense<[1.000000e+00, 2.000000e+00, 3.000000e+00, 4.000000e+00]> : tensor<4xf32> : !spv.array<4 x f32, stride=4>
Mogballa54f4ea2021-10-12 23:14:57502 %4 = arith.constant dense<[[1.0, 2.0], [3.0, 4.0]]> : tensor<2x2xf16>
Lei Zhang73431a42020-03-18 13:56:51503 return
504}
505
506// CHECK-LABEL: @corner_cases
507func @corner_cases() {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46508 // CHECK: %{{.*}} = spv.Constant -1 : i32
Mogballa54f4ea2021-10-12 23:14:57509 %0 = arith.constant 4294967295 : i64 // 2^32 - 1
KareemErgawy-TomTom5abdca42021-03-04 21:15:46510 // CHECK: %{{.*}} = spv.Constant 2147483647 : i32
Mogballa54f4ea2021-10-12 23:14:57511 %1 = arith.constant 2147483647 : i64 // 2^31 - 1
KareemErgawy-TomTom5abdca42021-03-04 21:15:46512 // CHECK: %{{.*}} = spv.Constant -2147483648 : i32
Mogballa54f4ea2021-10-12 23:14:57513 %2 = arith.constant 2147483648 : i64 // 2^31
KareemErgawy-TomTom5abdca42021-03-04 21:15:46514 // CHECK: %{{.*}} = spv.Constant -2147483648 : i32
Mogballa54f4ea2021-10-12 23:14:57515 %3 = arith.constant -2147483648 : i64 // -2^31
Lei Zhang73431a42020-03-18 13:56:51516
KareemErgawy-TomTom5abdca42021-03-04 21:15:46517 // CHECK: %{{.*}} = spv.Constant -1 : i32
Mogballa54f4ea2021-10-12 23:14:57518 %5 = arith.constant -1 : i64
KareemErgawy-TomTom5abdca42021-03-04 21:15:46519 // CHECK: %{{.*}} = spv.Constant -2 : i32
Mogballa54f4ea2021-10-12 23:14:57520 %6 = arith.constant -2 : i64
KareemErgawy-TomTom5abdca42021-03-04 21:15:46521 // CHECK: %{{.*}} = spv.Constant -1 : i32
Mogballa54f4ea2021-10-12 23:14:57522 %7 = arith.constant -1 : index
KareemErgawy-TomTom5abdca42021-03-04 21:15:46523 // CHECK: %{{.*}} = spv.Constant -2 : i32
Mogballa54f4ea2021-10-12 23:14:57524 %8 = arith.constant -2 : index
Lei Zhang73431a42020-03-18 13:56:51525
526
KareemErgawy-TomTom5abdca42021-03-04 21:15:46527 // CHECK: spv.Constant false
Mogballa54f4ea2021-10-12 23:14:57528 %9 = arith.constant false
KareemErgawy-TomTom5abdca42021-03-04 21:15:46529 // CHECK: spv.Constant true
Mogballa54f4ea2021-10-12 23:14:57530 %10 = arith.constant true
Lei Zhang73431a42020-03-18 13:56:51531
532 return
533}
534
535// CHECK-LABEL: @unsupported_cases
536func @unsupported_cases() {
Mogballa54f4ea2021-10-12 23:14:57537 // CHECK: %{{.*}} = arith.constant 4294967296 : i64
538 %0 = arith.constant 4294967296 : i64 // 2^32
539 // CHECK: %{{.*}} = arith.constant -2147483649 : i64
540 %1 = arith.constant -2147483649 : i64 // -2^31 - 1
541 // CHECK: %{{.*}} = arith.constant 1.0000000000000002 : f64
542 %2 = arith.constant 0x3FF0000000000001 : f64 // smallest number > 1
Lei Zhang73431a42020-03-18 13:56:51543 return
544}
545
Lei Zhangffd45832020-03-18 13:56:38546} // end module
547
548// -----
549
Lei Zhangaaafeac2019-11-23 14:03:40550//===----------------------------------------------------------------------===//
Lei Zhangffd45832020-03-18 13:56:38551// std cast ops
MaheshRavishankarc3d35692019-12-26 00:29:17552//===----------------------------------------------------------------------===//
553
Lei Zhangffd45832020-03-18 13:56:38554module attributes {
555 spv.target_env = #spv.target_env<
Lei Zhang8d420fb2020-09-03 17:29:14556 #spv.vce<v1.0, [Int8, Int16, Int64, Float16, Float64], []>, {}>
Lei Zhangffd45832020-03-18 13:56:38557} {
558
Hanhan Wang756d69592020-05-11 22:41:12559// CHECK-LABEL: index_cast1
560func @index_cast1(%arg0: i16) {
561 // CHECK: spv.SConvert %{{.+}} : i16 to i32
Mogballa54f4ea2021-10-12 23:14:57562 %0 = arith.index_cast %arg0 : i16 to index
Hanhan Wang756d69592020-05-11 22:41:12563 return
564}
565
566// CHECK-LABEL: index_cast2
567func @index_cast2(%arg0: index) {
568 // CHECK: spv.SConvert %{{.+}} : i32 to i16
Mogballa54f4ea2021-10-12 23:14:57569 %0 = arith.index_cast %arg0 : index to i16
Hanhan Wang756d69592020-05-11 22:41:12570 return
571}
572
573// CHECK-LABEL: index_cast3
574func @index_cast3(%arg0: i32) {
575 // CHECK-NOT: spv.SConvert
Mogballa54f4ea2021-10-12 23:14:57576 %0 = arith.index_cast %arg0 : i32 to index
Hanhan Wang756d69592020-05-11 22:41:12577 return
578}
579
580// CHECK-LABEL: index_cast4
581func @index_cast4(%arg0: index) {
582 // CHECK-NOT: spv.SConvert
Mogballa54f4ea2021-10-12 23:14:57583 %0 = arith.index_cast %arg0 : index to i32
Hanhan Wang756d69592020-05-11 22:41:12584 return
585}
586
Lei Zhangffd45832020-03-18 13:56:38587// CHECK-LABEL: @fpext1
588func @fpext1(%arg0: f16) -> f64 {
589 // CHECK: spv.FConvert %{{.*}} : f16 to f64
Mogballa54f4ea2021-10-12 23:14:57590 %0 = arith.extf %arg0 : f16 to f64
Lei Zhangffd45832020-03-18 13:56:38591 return %0 : f64
MaheshRavishankarc3d35692019-12-26 00:29:17592}
593
Lei Zhangffd45832020-03-18 13:56:38594// CHECK-LABEL: @fpext2
595func @fpext2(%arg0 : f32) -> f64 {
596 // CHECK: spv.FConvert %{{.*}} : f32 to f64
Mogballa54f4ea2021-10-12 23:14:57597 %0 = arith.extf %arg0 : f32 to f64
Lei Zhangffd45832020-03-18 13:56:38598 return %0 : f64
Denis Khalikoveac01f62020-01-08 03:11:59599}
600
Lei Zhangffd45832020-03-18 13:56:38601// CHECK-LABEL: @fptrunc1
602func @fptrunc1(%arg0 : f64) -> f16 {
603 // CHECK: spv.FConvert %{{.*}} : f64 to f16
Mogballa54f4ea2021-10-12 23:14:57604 %0 = arith.truncf %arg0 : f64 to f16
Lei Zhangffd45832020-03-18 13:56:38605 return %0 : f16
Denis Khalikoveac01f62020-01-08 03:11:59606}
607
Lei Zhangffd45832020-03-18 13:56:38608// CHECK-LABEL: @fptrunc2
609func @fptrunc2(%arg0: f32) -> f16 {
610 // CHECK: spv.FConvert %{{.*}} : f32 to f16
Mogballa54f4ea2021-10-12 23:14:57611 %0 = arith.truncf %arg0 : f32 to f16
Lei Zhangffd45832020-03-18 13:56:38612 return %0 : f16
613}
614
615// CHECK-LABEL: @sitofp1
616func @sitofp1(%arg0 : i32) -> f32 {
617 // CHECK: spv.ConvertSToF %{{.*}} : i32 to f32
Mogballa54f4ea2021-10-12 23:14:57618 %0 = arith.sitofp %arg0 : i32 to f32
Lei Zhangffd45832020-03-18 13:56:38619 return %0 : f32
620}
621
622// CHECK-LABEL: @sitofp2
623func @sitofp2(%arg0 : i64) -> f64 {
624 // CHECK: spv.ConvertSToF %{{.*}} : i64 to f64
Mogballa54f4ea2021-10-12 23:14:57625 %0 = arith.sitofp %arg0 : i64 to f64
Lei Zhangffd45832020-03-18 13:56:38626 return %0 : f64
627}
628
Hanhan Wang2cb130f2021-01-22 06:20:18629// CHECK-LABEL: @uitofp_i16_f32
630func @uitofp_i16_f32(%arg0: i16) -> f32 {
631 // CHECK: spv.ConvertUToF %{{.*}} : i16 to f32
Mogballa54f4ea2021-10-12 23:14:57632 %0 = arith.uitofp %arg0 : i16 to f32
Hanhan Wang2cb130f2021-01-22 06:20:18633 return %0 : f32
634}
635
636// CHECK-LABEL: @uitofp_i32_f32
637func @uitofp_i32_f32(%arg0 : i32) -> f32 {
638 // CHECK: spv.ConvertUToF %{{.*}} : i32 to f32
Mogballa54f4ea2021-10-12 23:14:57639 %0 = arith.uitofp %arg0 : i32 to f32
Hanhan Wang2cb130f2021-01-22 06:20:18640 return %0 : f32
641}
642
643// CHECK-LABEL: @uitofp_i1_f32
644func @uitofp_i1_f32(%arg0 : i1) -> f32 {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46645 // CHECK: %[[ZERO:.+]] = spv.Constant 0.000000e+00 : f32
646 // CHECK: %[[ONE:.+]] = spv.Constant 1.000000e+00 : f32
Hanhan Wang2cb130f2021-01-22 06:20:18647 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : i1, f32
Mogballa54f4ea2021-10-12 23:14:57648 %0 = arith.uitofp %arg0 : i1 to f32
Hanhan Wang2cb130f2021-01-22 06:20:18649 return %0 : f32
650}
651
652// CHECK-LABEL: @uitofp_i1_f64
653func @uitofp_i1_f64(%arg0 : i1) -> f64 {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46654 // CHECK: %[[ZERO:.+]] = spv.Constant 0.000000e+00 : f64
655 // CHECK: %[[ONE:.+]] = spv.Constant 1.000000e+00 : f64
Hanhan Wang2cb130f2021-01-22 06:20:18656 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : i1, f64
Mogballa54f4ea2021-10-12 23:14:57657 %0 = arith.uitofp %arg0 : i1 to f64
Hanhan Wang2cb130f2021-01-22 06:20:18658 return %0 : f64
659}
660
661// CHECK-LABEL: @uitofp_vec_i1_f32
662func @uitofp_vec_i1_f32(%arg0 : vector<4xi1>) -> vector<4xf32> {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46663 // CHECK: %[[ZERO:.+]] = spv.Constant dense<0.000000e+00> : vector<4xf32>
664 // CHECK: %[[ONE:.+]] = spv.Constant dense<1.000000e+00> : vector<4xf32>
Hanhan Wang2cb130f2021-01-22 06:20:18665 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : vector<4xi1>, vector<4xf32>
Mogballa54f4ea2021-10-12 23:14:57666 %0 = arith.uitofp %arg0 : vector<4xi1> to vector<4xf32>
Hanhan Wang2cb130f2021-01-22 06:20:18667 return %0 : vector<4xf32>
668}
669
670// CHECK-LABEL: @uitofp_vec_i1_f64
671spv.func @uitofp_vec_i1_f64(%arg0: vector<4xi1>) -> vector<4xf64> "None" {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46672 // CHECK: %[[ZERO:.+]] = spv.Constant dense<0.000000e+00> : vector<4xf64>
673 // CHECK: %[[ONE:.+]] = spv.Constant dense<1.000000e+00> : vector<4xf64>
Hanhan Wang2cb130f2021-01-22 06:20:18674 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : vector<4xi1>, vector<4xf64>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46675 %0 = spv.Constant dense<0.000000e+00> : vector<4xf64>
676 %1 = spv.Constant dense<1.000000e+00> : vector<4xf64>
Hanhan Wang2cb130f2021-01-22 06:20:18677 %2 = spv.Select %arg0, %1, %0 : vector<4xi1>, vector<4xf64>
678 spv.ReturnValue %2 : vector<4xf64>
679}
680
Benjamin Kramer530d6ea2021-02-12 14:04:12681// CHECK-LABEL: @sexti1
682func @sexti1(%arg0: i16) -> i64 {
683 // CHECK: spv.SConvert %{{.*}} : i16 to i64
Mogballa54f4ea2021-10-12 23:14:57684 %0 = arith.extsi %arg0 : i16 to i64
Benjamin Kramer530d6ea2021-02-12 14:04:12685 return %0 : i64
686}
687
688// CHECK-LABEL: @sexti2
689func @sexti2(%arg0 : i32) -> i64 {
690 // CHECK: spv.SConvert %{{.*}} : i32 to i64
Mogballa54f4ea2021-10-12 23:14:57691 %0 = arith.extsi %arg0 : i32 to i64
Benjamin Kramer530d6ea2021-02-12 14:04:12692 return %0 : i64
693}
694
Hanhan Wangbe0ad5b2020-05-01 02:29:05695// CHECK-LABEL: @zexti1
696func @zexti1(%arg0: i16) -> i64 {
697 // CHECK: spv.UConvert %{{.*}} : i16 to i64
Mogballa54f4ea2021-10-12 23:14:57698 %0 = arith.extui %arg0 : i16 to i64
Hanhan Wangbe0ad5b2020-05-01 02:29:05699 return %0 : i64
700}
701
702// CHECK-LABEL: @zexti2
703func @zexti2(%arg0 : i32) -> i64 {
704 // CHECK: spv.UConvert %{{.*}} : i32 to i64
Mogballa54f4ea2021-10-12 23:14:57705 %0 = arith.extui %arg0 : i32 to i64
Hanhan Wangbe0ad5b2020-05-01 02:29:05706 return %0 : i64
707}
708
Hanhan Wang0b025d22020-06-03 22:00:33709// CHECK-LABEL: @zexti3
710func @zexti3(%arg0 : i1) -> i32 {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46711 // CHECK: %[[ZERO:.+]] = spv.Constant 0 : i32
712 // CHECK: %[[ONE:.+]] = spv.Constant 1 : i32
Hanhan Wang0b025d22020-06-03 22:00:33713 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : i1, i32
Mogballa54f4ea2021-10-12 23:14:57714 %0 = arith.extui %arg0 : i1 to i32
Hanhan Wang0b025d22020-06-03 22:00:33715 return %0 : i32
716}
717
Hanhan Wang1909b6a2020-09-18 14:07:10718// CHECK-LABEL: @zexti4
719func @zexti4(%arg0 : vector<4xi1>) -> vector<4xi32> {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46720 // CHECK: %[[ZERO:.+]] = spv.Constant dense<0> : vector<4xi32>
721 // CHECK: %[[ONE:.+]] = spv.Constant dense<1> : vector<4xi32>
Hanhan Wang1909b6a2020-09-18 14:07:10722 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : vector<4xi1>, vector<4xi32>
Mogballa54f4ea2021-10-12 23:14:57723 %0 = arith.extui %arg0 : vector<4xi1> to vector<4xi32>
Hanhan Wang1909b6a2020-09-18 14:07:10724 return %0 : vector<4xi32>
725}
726
Hanhan Wang2cb130f2021-01-22 06:20:18727// CHECK-LABEL: @zexti5
728func @zexti5(%arg0 : vector<4xi1>) -> vector<4xi64> {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46729 // CHECK: %[[ZERO:.+]] = spv.Constant dense<0> : vector<4xi64>
730 // CHECK: %[[ONE:.+]] = spv.Constant dense<1> : vector<4xi64>
Hanhan Wang2cb130f2021-01-22 06:20:18731 // CHECK: spv.Select %{{.*}}, %[[ONE]], %[[ZERO]] : vector<4xi1>, vector<4xi64>
Mogballa54f4ea2021-10-12 23:14:57732 %0 = arith.extui %arg0 : vector<4xi1> to vector<4xi64>
Hanhan Wang2cb130f2021-01-22 06:20:18733 return %0 : vector<4xi64>
734}
735
Hanhan Wangbe0ad5b2020-05-01 02:29:05736// CHECK-LABEL: @trunci1
737func @trunci1(%arg0 : i64) -> i16 {
738 // CHECK: spv.SConvert %{{.*}} : i64 to i16
Mogballa54f4ea2021-10-12 23:14:57739 %0 = arith.trunci %arg0 : i64 to i16
Hanhan Wangbe0ad5b2020-05-01 02:29:05740 return %0 : i16
741}
742
743// CHECK-LABEL: @trunci2
744func @trunci2(%arg0: i32) -> i16 {
745 // CHECK: spv.SConvert %{{.*}} : i32 to i16
Mogballa54f4ea2021-10-12 23:14:57746 %0 = arith.trunci %arg0 : i32 to i16
Hanhan Wangbe0ad5b2020-05-01 02:29:05747 return %0 : i16
748}
749
Hanhan Wangc80484e2021-02-17 14:55:10750// CHECK-LABEL: @trunc_to_i1
751func @trunc_to_i1(%arg0: i32) -> i1 {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46752 // CHECK: %[[MASK:.*]] = spv.Constant 1 : i32
Hanhan Wangc80484e2021-02-17 14:55:10753 // CHECK: %[[MASKED_SRC:.*]] = spv.BitwiseAnd %{{.*}}, %[[MASK]] : i32
754 // CHECK: %[[IS_ONE:.*]] = spv.IEqual %[[MASKED_SRC]], %[[MASK]] : i32
KareemErgawy-TomTom5abdca42021-03-04 21:15:46755 // CHECK-DAG: %[[TRUE:.*]] = spv.Constant true
756 // CHECK-DAG: %[[FALSE:.*]] = spv.Constant false
Hanhan Wangc80484e2021-02-17 14:55:10757 // CHECK: spv.Select %[[IS_ONE]], %[[TRUE]], %[[FALSE]] : i1, i1
Mogballa54f4ea2021-10-12 23:14:57758 %0 = arith.trunci %arg0 : i32 to i1
Hanhan Wangc80484e2021-02-17 14:55:10759 return %0 : i1
760}
761
762// CHECK-LABEL: @trunc_to_veci1
763func @trunc_to_veci1(%arg0: vector<4xi32>) -> vector<4xi1> {
KareemErgawy-TomTom5abdca42021-03-04 21:15:46764 // CHECK: %[[MASK:.*]] = spv.Constant dense<1> : vector<4xi32>
Hanhan Wangc80484e2021-02-17 14:55:10765 // CHECK: %[[MASKED_SRC:.*]] = spv.BitwiseAnd %{{.*}}, %[[MASK]] : vector<4xi32>
766 // CHECK: %[[IS_ONE:.*]] = spv.IEqual %[[MASKED_SRC]], %[[MASK]] : vector<4xi32>
KareemErgawy-TomTom5abdca42021-03-04 21:15:46767 // CHECK-DAG: %[[TRUE:.*]] = spv.Constant dense<true> : vector<4xi1>
768 // CHECK-DAG: %[[FALSE:.*]] = spv.Constant dense<false> : vector<4xi1>
Hanhan Wangc80484e2021-02-17 14:55:10769 // CHECK: spv.Select %[[IS_ONE]], %[[TRUE]], %[[FALSE]] : vector<4xi1>, vector<4xi1>
Mogballa54f4ea2021-10-12 23:14:57770 %0 = arith.trunci %arg0 : vector<4xi32> to vector<4xi1>
Hanhan Wangc80484e2021-02-17 14:55:10771 return %0 : vector<4xi1>
772}
773
Hanhan Wangac691c42020-05-11 08:26:57774// CHECK-LABEL: @fptosi1
775func @fptosi1(%arg0 : f32) -> i32 {
776 // CHECK: spv.ConvertFToS %{{.*}} : f32 to i32
Mogballa54f4ea2021-10-12 23:14:57777 %0 = arith.fptosi %arg0 : f32 to i32
Hanhan Wangac691c42020-05-11 08:26:57778 return %0 : i32
779}
780
781// CHECK-LABEL: @fptosi2
782func @fptosi2(%arg0 : f16) -> i16 {
783 // CHECK: spv.ConvertFToS %{{.*}} : f16 to i16
Mogballa54f4ea2021-10-12 23:14:57784 %0 = arith.fptosi %arg0 : f16 to i16
Hanhan Wangac691c42020-05-11 08:26:57785 return %0 : i16
786}
787
Lei Zhangffd45832020-03-18 13:56:38788} // end module
789
790// -----
791
Lei Zhang7c3ae482021-01-09 13:04:49792// Checks that cast types will be adjusted when missing special capabilities for
793// certain non-32-bit scalar types.
Lei Zhangffd45832020-03-18 13:56:38794module attributes {
Lei Zhang7c3ae482021-01-09 13:04:49795 spv.target_env = #spv.target_env<#spv.vce<v1.0, [Float64], []>, {}>
Lei Zhangffd45832020-03-18 13:56:38796} {
797
798// CHECK-LABEL: @fpext1
799// CHECK-SAME: %[[ARG:.*]]: f32
Lei Zhang7c3ae482021-01-09 13:04:49800func @fpext1(%arg0: f16) -> f64 {
801 // CHECK-NEXT: spv.FConvert %[[ARG]] : f32 to f64
Mogballa54f4ea2021-10-12 23:14:57802 %0 = arith.extf %arg0 : f16 to f64
Lei Zhang7c3ae482021-01-09 13:04:49803 return %0: f64
Lei Zhangffd45832020-03-18 13:56:38804}
805
806// CHECK-LABEL: @fpext2
807// CHECK-SAME: %[[ARG:.*]]: f32
Lei Zhang7c3ae482021-01-09 13:04:49808func @fpext2(%arg0 : f32) -> f64 {
809 // CHECK-NEXT: spv.FConvert %[[ARG]] : f32 to f64
Mogballa54f4ea2021-10-12 23:14:57810 %0 = arith.extf %arg0 : f32 to f64
Lei Zhang7c3ae482021-01-09 13:04:49811 return %0: f64
Lei Zhangffd45832020-03-18 13:56:38812}
813
Lei Zhang7c3ae482021-01-09 13:04:49814} // end module
815
816// -----
817
818// Checks that cast types will be adjusted when missing special capabilities for
819// certain non-32-bit scalar types.
820module attributes {
821 spv.target_env = #spv.target_env<#spv.vce<v1.0, [Float16], []>, {}>
822} {
823
Lei Zhangffd45832020-03-18 13:56:38824// CHECK-LABEL: @fptrunc1
825// CHECK-SAME: %[[ARG:.*]]: f32
Lei Zhang7c3ae482021-01-09 13:04:49826func @fptrunc1(%arg0 : f64) -> f16 {
827 // CHECK-NEXT: spv.FConvert %[[ARG]] : f32 to f16
Mogballa54f4ea2021-10-12 23:14:57828 %0 = arith.truncf %arg0 : f64 to f16
Lei Zhang7c3ae482021-01-09 13:04:49829 return %0: f16
Lei Zhangffd45832020-03-18 13:56:38830}
831
832// CHECK-LABEL: @fptrunc2
833// CHECK-SAME: %[[ARG:.*]]: f32
Lei Zhang7c3ae482021-01-09 13:04:49834func @fptrunc2(%arg0: f32) -> f16 {
835 // CHECK-NEXT: spv.FConvert %[[ARG]] : f32 to f16
Mogballa54f4ea2021-10-12 23:14:57836 %0 = arith.truncf %arg0 : f32 to f16
Lei Zhang7c3ae482021-01-09 13:04:49837 return %0: f16
Lei Zhangffd45832020-03-18 13:56:38838}
839
840// CHECK-LABEL: @sitofp
Lei Zhang7c3ae482021-01-09 13:04:49841func @sitofp(%arg0 : i64) -> f64 {
Lei Zhangffd45832020-03-18 13:56:38842 // CHECK: spv.ConvertSToF %{{.*}} : i32 to f32
Mogballa54f4ea2021-10-12 23:14:57843 %0 = arith.sitofp %arg0 : i64 to f64
Lei Zhang7c3ae482021-01-09 13:04:49844 return %0: f64
Lei Zhangffd45832020-03-18 13:56:38845}
846
847} // end module
848
849// -----
850
Lei Zhang42980a72020-12-23 18:21:57851//===----------------------------------------------------------------------===//
852// std.return
853//===----------------------------------------------------------------------===//
854
855module attributes {
856 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
857} {
858
859// CHECK-LABEL: spv.func @return_one_val
860// CHECK-SAME: (%[[ARG:.+]]: f32)
861func @return_one_val(%arg0: f32) -> f32 {
862 // CHECK: spv.ReturnValue %[[ARG]] : f32
863 return %arg0: f32
864}
865
866// Check that multiple-return functions are not converted.
867// CHECK-LABEL: func @return_multi_val
868func @return_multi_val(%arg0: f32) -> (f32, f32) {
869 // CHECK: return
870 return %arg0, %arg0: f32, f32
871}
872
873}
Lei Zhangbb6f5c82021-03-06 13:03:27874
875// -----
876
877//===----------------------------------------------------------------------===//
878// tensor.extract
879//===----------------------------------------------------------------------===//
880
881// CHECK-LABEL: func @tensor_extract_constant
882// CHECK-SAME: (%[[A:.+]]: i32, %[[B:.+]]: i32, %[[C:.+]]: i32)
883func @tensor_extract_constant(%a : index, %b: index, %c: index) -> i32 {
884 // CHECK: %[[CST:.+]] = spv.Constant dense<[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]>
Mogballa54f4ea2021-10-12 23:14:57885 %cst = arith.constant dense<[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]> : tensor<2x2x3xi32>
Lei Zhangbb6f5c82021-03-06 13:03:27886 // CHECK: %[[VAR:.+]] = spv.Variable init(%[[CST]]) : !spv.ptr<!spv.array<12 x i32, stride=4>, Function>
887 // CHECK: %[[C0:.+]] = spv.Constant 0 : i32
888 // CHECK: %[[C6:.+]] = spv.Constant 6 : i32
889 // CHECK: %[[MUL0:.+]] = spv.IMul %[[C6]], %[[A]] : i32
890 // CHECK: %[[ADD0:.+]] = spv.IAdd %[[C0]], %[[MUL0]] : i32
891 // CHECK: %[[C3:.+]] = spv.Constant 3 : i32
892 // CHECK: %[[MUL1:.+]] = spv.IMul %[[C3]], %[[B]] : i32
893 // CHECK: %[[ADD1:.+]] = spv.IAdd %[[ADD0]], %[[MUL1]] : i32
894 // CHECK: %[[C1:.+]] = spv.Constant 1 : i32
895 // CHECK: %[[MUL2:.+]] = spv.IMul %[[C1]], %[[C]] : i32
896 // CHECK: %[[ADD2:.+]] = spv.IAdd %[[ADD1]], %[[MUL2]] : i32
897 // CHECK: %[[AC:.+]] = spv.AccessChain %[[VAR]][%[[ADD2]]]
898 // CHECK: %[[VAL:.+]] = spv.Load "Function" %[[AC]] : i32
899 %extract = tensor.extract %cst[%a, %b, %c] : tensor<2x2x3xi32>
900 // CHECK: spv.ReturnValue %[[VAL]]
901 return %extract : i32
902}
thomasraouxd51275c2021-05-03 17:56:15903
904// -----
905
906//===----------------------------------------------------------------------===//
xndcn6e2c0e62021-10-29 14:45:18907// std.br, std.cond_br
908//===----------------------------------------------------------------------===//
909
910module attributes {
911 spv.target_env = #spv.target_env<#spv.vce<v1.0, [], []>, {}>
912} {
913
914// CHECK-LABEL: func @simple_loop
915func @simple_loop(index, index, index) {
916^bb0(%begin : index, %end : index, %step : index):
917// CHECK-NEXT: spv.Branch ^bb1
918 br ^bb1
919
920// CHECK-NEXT: ^bb1: // pred: ^bb0
921// CHECK-NEXT: spv.Branch ^bb2({{.*}} : i32)
922^bb1: // pred: ^bb0
923 br ^bb2(%begin : index)
924
925// CHECK: ^bb2({{.*}}: i32): // 2 preds: ^bb1, ^bb3
926// CHECK-NEXT: {{.*}} = spv.SLessThan {{.*}}, {{.*}} : i32
927// CHECK-NEXT: spv.BranchConditional {{.*}}, ^bb3, ^bb4
928^bb2(%0: index): // 2 preds: ^bb1, ^bb3
929 %1 = arith.cmpi slt, %0, %end : index
930 cond_br %1, ^bb3, ^bb4
931
932// CHECK: ^bb3: // pred: ^bb2
933// CHECK-NEXT: {{.*}} = spv.IAdd {{.*}}, {{.*}} : i32
934// CHECK-NEXT: spv.Branch ^bb2({{.*}} : i32)
935^bb3: // pred: ^bb2
936 %2 = arith.addi %0, %step : index
937 br ^bb2(%2 : index)
938
939// CHECK: ^bb4: // pred: ^bb2
940^bb4: // pred: ^bb2
941 return
942}
943
944}