565 lines · plain
1// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// spirv.FAdd5//===----------------------------------------------------------------------===//6 7func.func @fadd_scalar(%arg: f32) -> f32 {8 // CHECK: spirv.FAdd9 %0 = spirv.FAdd %arg, %arg : f3210 return %0 : f3211}12 13// -----14 15func.func @fadd_bf16_scalar(%arg: bf16) -> bf16 {16 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}17 %0 = spirv.FAdd %arg, %arg : bf1618 return %0 : bf1619}20 21// -----22 23//===----------------------------------------------------------------------===//24// spirv.FDiv25//===----------------------------------------------------------------------===//26 27func.func @fdiv_scalar(%arg: f32) -> f32 {28 // CHECK: spirv.FDiv29 %0 = spirv.FDiv %arg, %arg : f3230 return %0 : f3231}32 33// -----34 35func.func @fdiv_bf16_scalar(%arg: bf16) -> bf16 {36 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}37 %0 = spirv.FDiv %arg, %arg : bf1638 return %0 : bf1639}40 41// -----42 43//===----------------------------------------------------------------------===//44// spirv.FMod45//===----------------------------------------------------------------------===//46 47func.func @fmod_scalar(%arg: f32) -> f32 {48 // CHECK: spirv.FMod49 %0 = spirv.FMod %arg, %arg : f3250 return %0 : f3251}52 53// -----54 55func.func @fmod_bf16_scalar(%arg: bf16) -> bf16 {56 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}57 %0 = spirv.FMod %arg, %arg : bf1658 return %0 : bf1659}60 61// -----62 63//===----------------------------------------------------------------------===//64// spirv.FMul65//===----------------------------------------------------------------------===//66 67func.func @fmul_scalar(%arg: f32) -> f32 {68 // CHECK: spirv.FMul69 %0 = spirv.FMul %arg, %arg : f3270 return %0 : f3271}72 73func.func @fmul_vector(%arg: vector<4xf32>) -> vector<4xf32> {74 // CHECK: spirv.FMul75 %0 = spirv.FMul %arg, %arg : vector<4xf32>76 return %0 : vector<4xf32>77}78 79// -----80 81func.func @fmul_i32(%arg: i32) -> i32 {82 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}83 %0 = spirv.FMul %arg, %arg : i3284 return %0 : i3285}86 87// -----88 89func.func @fmul_bf16(%arg: bf16) -> bf16 {90 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}91 %0 = spirv.FMul %arg, %arg : bf1692 return %0 : bf1693}94 95// -----96 97func.func @fmul_bf16_vector(%arg: vector<4xbf16>) -> vector<4xbf16> {98 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}99 %0 = spirv.FMul %arg, %arg : vector<4xbf16>100 return %0 : vector<4xbf16>101}102 103// -----104 105func.func @fmul_tensor(%arg: tensor<4xf32>) -> tensor<4xf32> {106 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}107 %0 = spirv.FMul %arg, %arg : tensor<4xf32>108 return %0 : tensor<4xf32>109}110 111// -----112 113//===----------------------------------------------------------------------===//114// spirv.FNegate115//===----------------------------------------------------------------------===//116 117func.func @fnegate_scalar(%arg: f32) -> f32 {118 // CHECK: spirv.FNegate119 %0 = spirv.FNegate %arg : f32120 return %0 : f32121}122 123// -----124 125func.func @fnegate_bf16_scalar(%arg: bf16) -> bf16 {126 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}127 %0 = spirv.FNegate %arg : bf16128 return %0 : bf16129}130 131// -----132 133//===----------------------------------------------------------------------===//134// spirv.FRem135//===----------------------------------------------------------------------===//136 137func.func @frem_scalar(%arg: f32) -> f32 {138 // CHECK: spirv.FRem139 %0 = spirv.FRem %arg, %arg : f32140 return %0 : f32141}142 143// -----144 145func.func @frem_bf16_scalar(%arg: bf16) -> bf16 {146 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}147 %0 = spirv.FRem %arg, %arg : bf16148 return %0 : bf16149}150 151// -----152 153//===----------------------------------------------------------------------===//154// spirv.FSub155//===----------------------------------------------------------------------===//156 157func.func @fsub_scalar(%arg: f32) -> f32 {158 // CHECK: spirv.FSub159 %0 = spirv.FSub %arg, %arg : f32160 return %0 : f32161}162 163// -----164 165func.func @fsub_bf16_scalar(%arg: bf16) -> bf16 {166 // expected-error @+1 {{operand #0 must be 16/32/64-bit float or fixed-length vector of 16/32/64-bit float values}}167 %0 = spirv.FSub %arg, %arg : bf16168 return %0 : bf16169}170 171// -----172 173//===----------------------------------------------------------------------===//174// spirv.IAdd175//===----------------------------------------------------------------------===//176 177func.func @iadd_scalar(%arg: i32) -> i32 {178 // CHECK: spirv.IAdd179 %0 = spirv.IAdd %arg, %arg : i32180 return %0 : i32181}182 183// -----184 185//===----------------------------------------------------------------------===//186// spirv.IMul187//===----------------------------------------------------------------------===//188 189func.func @imul_scalar(%arg: i32) -> i32 {190 // CHECK: spirv.IMul191 %0 = spirv.IMul %arg, %arg : i32192 return %0 : i32193}194 195// -----196 197//===----------------------------------------------------------------------===//198// spirv.ISub199//===----------------------------------------------------------------------===//200 201func.func @isub_scalar(%arg: i32) -> i32 {202 // CHECK: spirv.ISub203 %0 = spirv.ISub %arg, %arg : i32204 return %0 : i32205}206 207// -----208 209//===----------------------------------------------------------------------===//210// spirv.IAddCarry211//===----------------------------------------------------------------------===//212 213// CHECK-LABEL: @iadd_carry_scalar214func.func @iadd_carry_scalar(%arg: i32) -> !spirv.struct<(i32, i32)> {215 // CHECK: spirv.IAddCarry %{{.+}}, %{{.+}} : !spirv.struct<(i32, i32)>216 %0 = spirv.IAddCarry %arg, %arg : !spirv.struct<(i32, i32)>217 return %0 : !spirv.struct<(i32, i32)>218}219 220// CHECK-LABEL: @iadd_carry_vector221func.func @iadd_carry_vector(%arg: vector<3xi32>) -> !spirv.struct<(vector<3xi32>, vector<3xi32>)> {222 // CHECK: spirv.IAddCarry %{{.+}}, %{{.+}} : !spirv.struct<(vector<3xi32>, vector<3xi32>)>223 %0 = spirv.IAddCarry %arg, %arg : !spirv.struct<(vector<3xi32>, vector<3xi32>)>224 return %0 : !spirv.struct<(vector<3xi32>, vector<3xi32>)>225}226 227// -----228 229func.func @iadd_carry(%arg: i32) -> !spirv.struct<(i32, i32, i32)> {230 // expected-error @+1 {{expected spirv.struct type with two members}}231 %0 = spirv.IAddCarry %arg, %arg : !spirv.struct<(i32, i32, i32)>232 return %0 : !spirv.struct<(i32, i32, i32)>233}234 235// -----236 237func.func @iadd_carry(%arg: i32) -> !spirv.struct<(i32)> {238 // expected-error @+1 {{expected result struct type containing two members}}239 %0 = "spirv.IAddCarry"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32)>240 return %0 : !spirv.struct<(i32)>241}242 243// -----244 245func.func @iadd_carry(%arg: i32) -> !spirv.struct<(i32, i64)> {246 // expected-error @+1 {{expected all operand types and struct member types are the same}}247 %0 = "spirv.IAddCarry"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32, i64)>248 return %0 : !spirv.struct<(i32, i64)>249}250 251// -----252 253func.func @iadd_carry(%arg: i64) -> !spirv.struct<(i32, i32)> {254 // expected-error @+1 {{expected all operand types and struct member types are the same}}255 %0 = "spirv.IAddCarry"(%arg, %arg): (i64, i64) -> !spirv.struct<(i32, i32)>256 return %0 : !spirv.struct<(i32, i32)>257}258 259// -----260 261//===----------------------------------------------------------------------===//262// spirv.ISubBorrow263//===----------------------------------------------------------------------===//264 265// CHECK-LABEL: @isub_borrow_scalar266func.func @isub_borrow_scalar(%arg: i32) -> !spirv.struct<(i32, i32)> {267 // CHECK: spirv.ISubBorrow %{{.+}}, %{{.+}} : !spirv.struct<(i32, i32)>268 %0 = spirv.ISubBorrow %arg, %arg : !spirv.struct<(i32, i32)>269 return %0 : !spirv.struct<(i32, i32)>270}271 272// CHECK-LABEL: @isub_borrow_vector273func.func @isub_borrow_vector(%arg: vector<3xi32>) -> !spirv.struct<(vector<3xi32>, vector<3xi32>)> {274 // CHECK: spirv.ISubBorrow %{{.+}}, %{{.+}} : !spirv.struct<(vector<3xi32>, vector<3xi32>)>275 %0 = spirv.ISubBorrow %arg, %arg : !spirv.struct<(vector<3xi32>, vector<3xi32>)>276 return %0 : !spirv.struct<(vector<3xi32>, vector<3xi32>)>277}278 279// -----280 281func.func @isub_borrow(%arg: i32) -> !spirv.struct<(i32, i32, i32)> {282 // expected-error @+1 {{expected spirv.struct type with two members}}283 %0 = spirv.ISubBorrow %arg, %arg : !spirv.struct<(i32, i32, i32)>284 return %0 : !spirv.struct<(i32, i32, i32)>285}286 287// -----288 289func.func @isub_borrow(%arg: i32) -> !spirv.struct<(i32)> {290 // expected-error @+1 {{expected result struct type containing two members}}291 %0 = "spirv.ISubBorrow"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32)>292 return %0 : !spirv.struct<(i32)>293}294 295// -----296 297func.func @isub_borrow(%arg: i32) -> !spirv.struct<(i32, i64)> {298 // expected-error @+1 {{expected all operand types and struct member types are the same}}299 %0 = "spirv.ISubBorrow"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32, i64)>300 return %0 : !spirv.struct<(i32, i64)>301}302 303// -----304 305func.func @isub_borrow(%arg: i64) -> !spirv.struct<(i32, i32)> {306 // expected-error @+1 {{expected all operand types and struct member types are the same}}307 %0 = "spirv.ISubBorrow"(%arg, %arg): (i64, i64) -> !spirv.struct<(i32, i32)>308 return %0 : !spirv.struct<(i32, i32)>309}310 311// -----312 313//===----------------------------------------------------------------------===//314// spirv.Dot315//===----------------------------------------------------------------------===//316 317func.func @dot(%arg0: vector<4xf32>, %arg1: vector<4xf32>) -> f32 {318 %0 = spirv.Dot %arg0, %arg1 : vector<4xf32> -> f32319 return %0 : f32320}321 322// -----323 324// CHECK-LABEL: @dot_bf16325func.func @dot_bf16(%arg0: vector<4xbf16>, %arg1: vector<4xbf16>) -> bf16 {326 // CHECK: spirv.Dot %{{.+}}, %{{.+}} : vector<4xbf16> -> bf16327 %0 = spirv.Dot %arg0, %arg1 : vector<4xbf16> -> bf16328 return %0 : bf16329}330 331// -----332 333// expected-note @+1 {{prior use here}}334func.func @dot(%arg0: vector<4xf32>, %arg1: vector<3xf32>) -> f32 {335 // expected-error @+1 {{use of value '%arg1' expects different type than prior uses}}336 %0 = spirv.Dot %arg0, %arg1 : vector<4xf32> -> f32337 return %0 : f32338}339 340// -----341 342func.func @dot(%arg0: vector<4xf32>, %arg1: vector<4xf32>) -> f16 {343 // expected-error @+1 {{'spirv.Dot' op failed to verify that all of {vector1, result} have same element type}}344 %0 = spirv.Dot %arg0, %arg1 : vector<4xf32> -> f16345 return %0 : f16346}347 348// -----349 350func.func @dot(%arg0: vector<4xi32>, %arg1: vector<4xi32>) -> i32 {351 // expected-error @+1 {{'spirv.Dot' op operand #0 must be fixed-length vector of 16/32/64-bit float or BFloat16 values of length 2/3/4/8/16}}352 %0 = spirv.Dot %arg0, %arg1 : vector<4xi32> -> i32353 return %0 : i32354}355 356// -----357 358//===----------------------------------------------------------------------===//359// spirv.SMulExtended360//===----------------------------------------------------------------------===//361 362// CHECK-LABEL: @smul_extended_scalar363func.func @smul_extended_scalar(%arg: i32) -> !spirv.struct<(i32, i32)> {364 // CHECK: spirv.SMulExtended %{{.+}}, %{{.+}} : !spirv.struct<(i32, i32)>365 %0 = spirv.SMulExtended %arg, %arg : !spirv.struct<(i32, i32)>366 return %0 : !spirv.struct<(i32, i32)>367}368 369// CHECK-LABEL: @smul_extended_vector370func.func @smul_extended_vector(%arg: vector<3xi32>) -> !spirv.struct<(vector<3xi32>, vector<3xi32>)> {371 // CHECK: spirv.SMulExtended %{{.+}}, %{{.+}} : !spirv.struct<(vector<3xi32>, vector<3xi32>)>372 %0 = spirv.SMulExtended %arg, %arg : !spirv.struct<(vector<3xi32>, vector<3xi32>)>373 return %0 : !spirv.struct<(vector<3xi32>, vector<3xi32>)>374}375 376// -----377 378func.func @smul_extended(%arg: i32) -> !spirv.struct<(i32, i32, i32)> {379 // expected-error @+1 {{expected spirv.struct type with two members}}380 %0 = spirv.SMulExtended %arg, %arg : !spirv.struct<(i32, i32, i32)>381 return %0 : !spirv.struct<(i32, i32, i32)>382}383 384// -----385 386func.func @smul_extended(%arg: i32) -> !spirv.struct<(i32)> {387 // expected-error @+1 {{expected result struct type containing two members}}388 %0 = "spirv.SMulExtended"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32)>389 return %0 : !spirv.struct<(i32)>390}391 392// -----393 394func.func @smul_extended(%arg: i32) -> !spirv.struct<(i32, i64)> {395 // expected-error @+1 {{expected all operand types and struct member types are the same}}396 %0 = "spirv.SMulExtended"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32, i64)>397 return %0 : !spirv.struct<(i32, i64)>398}399 400// -----401 402func.func @smul_extended(%arg: i64) -> !spirv.struct<(i32, i32)> {403 // expected-error @+1 {{expected all operand types and struct member types are the same}}404 %0 = "spirv.SMulExtended"(%arg, %arg): (i64, i64) -> !spirv.struct<(i32, i32)>405 return %0 : !spirv.struct<(i32, i32)>406}407 408// -----409 410//===----------------------------------------------------------------------===//411// spirv.UMulExtended412//===----------------------------------------------------------------------===//413 414// CHECK-LABEL: @umul_extended_scalar415func.func @umul_extended_scalar(%arg: i32) -> !spirv.struct<(i32, i32)> {416 // CHECK: spirv.UMulExtended %{{.+}}, %{{.+}} : !spirv.struct<(i32, i32)>417 %0 = spirv.UMulExtended %arg, %arg : !spirv.struct<(i32, i32)>418 return %0 : !spirv.struct<(i32, i32)>419}420 421// CHECK-LABEL: @umul_extended_vector422func.func @umul_extended_vector(%arg: vector<3xi32>) -> !spirv.struct<(vector<3xi32>, vector<3xi32>)> {423 // CHECK: spirv.UMulExtended %{{.+}}, %{{.+}} : !spirv.struct<(vector<3xi32>, vector<3xi32>)>424 %0 = spirv.UMulExtended %arg, %arg : !spirv.struct<(vector<3xi32>, vector<3xi32>)>425 return %0 : !spirv.struct<(vector<3xi32>, vector<3xi32>)>426}427 428// -----429 430func.func @umul_extended(%arg: i32) -> !spirv.struct<(i32, i32, i32)> {431 // expected-error @+1 {{expected spirv.struct type with two members}}432 %0 = spirv.UMulExtended %arg, %arg : !spirv.struct<(i32, i32, i32)>433 return %0 : !spirv.struct<(i32, i32, i32)>434}435 436// -----437 438func.func @umul_extended(%arg: i32) -> !spirv.struct<(i32)> {439 // expected-error @+1 {{expected result struct type containing two members}}440 %0 = "spirv.UMulExtended"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32)>441 return %0 : !spirv.struct<(i32)>442}443 444// -----445 446func.func @umul_extended(%arg: i32) -> !spirv.struct<(i32, i64)> {447 // expected-error @+1 {{expected all operand types and struct member types are the same}}448 %0 = "spirv.UMulExtended"(%arg, %arg): (i32, i32) -> !spirv.struct<(i32, i64)>449 return %0 : !spirv.struct<(i32, i64)>450}451 452// -----453 454func.func @umul_extended(%arg: i64) -> !spirv.struct<(i32, i32)> {455 // expected-error @+1 {{expected all operand types and struct member types are the same}}456 %0 = "spirv.UMulExtended"(%arg, %arg): (i64, i64) -> !spirv.struct<(i32, i32)>457 return %0 : !spirv.struct<(i32, i32)>458}459 460// -----461 462//===----------------------------------------------------------------------===//463// spirv.SDiv464//===----------------------------------------------------------------------===//465 466func.func @sdiv_scalar(%arg: i32) -> i32 {467 // CHECK: spirv.SDiv468 %0 = spirv.SDiv %arg, %arg : i32469 return %0 : i32470}471 472// -----473 474//===----------------------------------------------------------------------===//475// spirv.SMod476//===----------------------------------------------------------------------===//477 478func.func @smod_scalar(%arg: i32) -> i32 {479 // CHECK: spirv.SMod480 %0 = spirv.SMod %arg, %arg : i32481 return %0 : i32482}483 484// -----485 486//===----------------------------------------------------------------------===//487// spirv.SNegate488//===----------------------------------------------------------------------===//489 490func.func @snegate_scalar(%arg: i32) -> i32 {491 // CHECK: spirv.SNegate492 %0 = spirv.SNegate %arg : i32493 return %0 : i32494}495 496// -----497//===----------------------------------------------------------------------===//498// spirv.SRem499//===----------------------------------------------------------------------===//500 501func.func @srem_scalar(%arg: i32) -> i32 {502 // CHECK: spirv.SRem503 %0 = spirv.SRem %arg, %arg : i32504 return %0 : i32505}506 507// -----508 509//===----------------------------------------------------------------------===//510// spirv.UDiv511//===----------------------------------------------------------------------===//512 513func.func @udiv_scalar(%arg: i32) -> i32 {514 // CHECK: spirv.UDiv515 %0 = spirv.UDiv %arg, %arg : i32516 return %0 : i32517}518 519// -----520 521//===----------------------------------------------------------------------===//522// spirv.UMod523//===----------------------------------------------------------------------===//524 525func.func @umod_scalar(%arg: i32) -> i32 {526 // CHECK: spirv.UMod527 %0 = spirv.UMod %arg, %arg : i32528 return %0 : i32529}530 531// -----532//===----------------------------------------------------------------------===//533// spirv.VectorTimesScalar534//===----------------------------------------------------------------------===//535 536func.func @vector_times_scalar(%vector: vector<4xf32>, %scalar: f32) -> vector<4xf32> {537 // CHECK: spirv.VectorTimesScalar %{{.+}}, %{{.+}} : (vector<4xf32>, f32) -> vector<4xf32>538 %0 = spirv.VectorTimesScalar %vector, %scalar : (vector<4xf32>, f32) -> vector<4xf32>539 return %0 : vector<4xf32>540}541 542// -----543 544func.func @vector_times_scalar(%vector: vector<4xf32>, %scalar: f16) -> vector<4xf32> {545 // expected-error @+1 {{scalar operand and result element type match}}546 %0 = spirv.VectorTimesScalar %vector, %scalar : (vector<4xf32>, f16) -> vector<4xf32>547 return %0 : vector<4xf32>548}549 550// -----551 552func.func @vector_times_scalar(%vector: vector<4xf32>, %scalar: f32) -> vector<3xf32> {553 // expected-error @+1 {{vector operand and result type mismatch}}554 %0 = spirv.VectorTimesScalar %vector, %scalar : (vector<4xf32>, f32) -> vector<3xf32>555 return %0 : vector<3xf32>556}557 558// -----559 560func.func @vector_bf16_times_scalar_bf16(%vector: vector<4xbf16>, %scalar: bf16) -> vector<4xbf16> {561 // expected-error @+1 {{operand #0 must be vector of 16/32/64-bit float values of length 2/3/4}}562 %0 = spirv.VectorTimesScalar %vector, %scalar : (vector<4xbf16>, bf16) -> vector<4xbf16>563 return %0 : vector<4xbf16>564}565