brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.9 KiB · c703274 Raw
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