brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.1 KiB · cd8cfc8 Raw
395 lines · plain
1// RUN: mlir-opt -test-convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s2 3// CHECK-LABEL: @extract4//  CHECK-SAME: %[[ARG:.+]]: vector<2xf32>5//       CHECK:   spirv.CompositeExtract %[[ARG]][0 : i32] : vector<2xf32>6//       CHECK:   spirv.CompositeExtract %[[ARG]][1 : i32] : vector<2xf32>7func.func @extract(%arg0 : vector<2xf32>) -> (vector<1xf32>, f32) {8  %0 = "vector.extract"(%arg0) <{static_position = array<i64: 0>}> : (vector<2xf32>) -> vector<1xf32>9  %1 = "vector.extract"(%arg0) <{static_position = array<i64: 1>}> : (vector<2xf32>) -> f3210  return %0, %1: vector<1xf32>, f3211}12 13// -----14 15// CHECK-LABEL: @extract_size1_vector16//  CHECK-SAME: %[[ARG0:.+]]: f3217//       CHECK:   spirv.ReturnValue %[[ARG0]] : f3218func.func @extract_size1_vector(%arg0 : vector<1xf32>) -> f32 {19  %0 = vector.extract %arg0[0] : f32 from vector<1xf32>20  return %0: f3221}22 23// -----24 25// CHECK-LABEL: @insert26//  CHECK-SAME: %[[V:.*]]: vector<4xf32>, %[[S:.*]]: f3227//       CHECK:   spirv.CompositeInsert %[[S]], %[[V]][2 : i32] : f32 into vector<4xf32>28func.func @insert(%arg0 : vector<4xf32>, %arg1: f32) -> vector<4xf32> {29  %1 = vector.insert %arg1, %arg0[2] : f32 into vector<4xf32>30  return %1: vector<4xf32>31}32 33// -----34 35// CHECK-LABEL: @insert_index_vector36//       CHECK:   spirv.CompositeInsert %{{.+}}, %{{.+}}[2 : i32] : i32 into vector<4xi32>37func.func @insert_index_vector(%arg0 : vector<4xindex>, %arg1: index) -> vector<4xindex> {38  %1 = vector.insert %arg1, %arg0[2] : index into vector<4xindex>39  return %1: vector<4xindex>40}41 42// -----43 44// CHECK-LABEL: @insert_size1_vector45//  CHECK-SAME: %[[V:.*]]: f32, %[[S:.*]]: f3246//       CHECK:   spirv.ReturnValue %[[S]] : f3247func.func @insert_size1_vector(%arg0 : vector<1xf32>, %arg1: f32) -> vector<1xf32> {48  %1 = vector.insert %arg1, %arg0[0] : f32 into vector<1xf32>49  return %1 : vector<1xf32>50}51 52// -----53 54// CHECK-LABEL: @insert_size1_vector55//  CHECK-SAME: %[[SUB:.*]]: f32, %[[FULL:.*]]: vector<3xf32>56//       CHECK:   %[[RET:.*]] = spirv.CompositeInsert %[[SUB]], %[[FULL]][2 : i32] : f32 into vector<3xf32>57//       CHECK:   spirv.ReturnValue %[[RET]] : vector<3xf32>58func.func @insert_size1_vector(%arg0 : vector<1xf32>, %arg1: vector<3xf32>) -> vector<3xf32> {59  %1 = vector.insert_strided_slice %arg0, %arg1 {offsets = [2], strides = [1]} : vector<1xf32> into vector<3xf32>60  return %1 : vector<3xf32>61}62 63// -----64 65// CHECK-LABEL: @fma66//  CHECK-SAME: %[[A:.*]]: vector<4xf32>, %[[B:.*]]: vector<4xf32>, %[[C:.*]]: vector<4xf32>67//       CHECK:   spirv.GL.Fma %[[A]], %[[B]], %[[C]] : vector<4xf32>68func.func @fma(%a: vector<4xf32>, %b: vector<4xf32>, %c: vector<4xf32>) -> vector<4xf32> {69  %0 = vector.fma %a, %b, %c: vector<4xf32>70  return %0 : vector<4xf32>71}72 73// -----74 75// CHECK-LABEL: @fma_size1_vector76//       CHECK:   spirv.GL.Fma %{{.+}} : f3277func.func @fma_size1_vector(%a: vector<1xf32>, %b: vector<1xf32>, %c: vector<1xf32>) -> vector<1xf32> {78  %0 = vector.fma %a, %b, %c: vector<1xf32>79  return %0 : vector<1xf32>80}81 82// -----83 84// CHECK-LABEL: func @splat85//  CHECK-SAME: (%[[A:.+]]: f32)86//       CHECK:   %[[VAL:.+]] = spirv.CompositeConstruct %[[A]], %[[A]], %[[A]], %[[A]]87//       CHECK:   spirv.ReturnValue %[[VAL]] : vector<4xf32>88func.func @splat(%f : f32) -> vector<4xf32> {89  %splat = vector.broadcast %f : f32 to vector<4xf32>90  return %splat : vector<4xf32>91}92 93// -----94 95// CHECK-LABEL: func @splat_size1_vector96//  CHECK-SAME: (%[[A:.+]]: f32)97//       CHECK:   spirv.ReturnValue %[[A]] : f3298func.func @splat_size1_vector(%f : f32) -> vector<1xf32> {99  %bc = vector.broadcast %f : f32 to vector<1xf32>100  return %bc : vector<1xf32>101}102 103// -----104 105// CHECK-LABEL: func @scalar_broadcast106//  CHECK-SAME: (%[[A:.+]]: f32)107//       CHECK:   %[[VAL:.+]] = spirv.CompositeConstruct %[[A]], %[[A]], %[[A]], %[[A]]108//       CHECK:   spirv.ReturnValue %[[VAL]] : vector<4xf32>109func.func @scalar_broadcast(%f : f32) -> vector<4xf32> {110  %bc = vector.broadcast %f : f32 to vector<4xf32>111  return %bc : vector<4xf32>112}113 114// -----115 116// CHECK-LABEL: func @scalar_broadcast_size1_vector117//  CHECK-SAME: (%[[A:.+]]: f32)118//       CHECK:   spirv.ReturnValue %[[A]] : f32119func.func @scalar_broadcast_size1_vector(%f : f32) -> vector<1xf32> {120  %splat = vector.broadcast %f : f32 to vector<1xf32>121  return %splat : vector<1xf32>122}123 124// -----125 126// CHECK-LABEL:  func @shuffle127//  CHECK-SAME:  %[[ARG0:.+]]: f32, %[[ARG1:.+]]: f32128//       CHECK:    spirv.CompositeConstruct %[[ARG0]], %[[ARG1]], %[[ARG1]], %[[ARG0]] : (f32, f32, f32, f32) -> vector<4xf32>129func.func @shuffle(%v0 : vector<1xf32>, %v1: vector<1xf32>) -> vector<4xf32> {130  %shuffle = vector.shuffle %v0, %v1 [0, 1, 1, 0] : vector<1xf32>, vector<1xf32>131  return %shuffle : vector<4xf32>132}133 134// -----135 136// CHECK-LABEL:  func @shuffle137//  CHECK-SAME:  %[[V0:.+]]: vector<3xf32>, %[[V1:.+]]: vector<3xf32>138//       CHECK:    spirv.VectorShuffle [3 : i32, 2 : i32, 5 : i32, 1 : i32] %[[V0]], %[[V1]] : vector<3xf32>, vector<3xf32> -> vector<4xf32>139func.func @shuffle(%v0 : vector<3xf32>, %v1: vector<3xf32>) -> vector<4xf32> {140  %shuffle = vector.shuffle %v0, %v1 [3, 2, 5, 1] : vector<3xf32>, vector<3xf32>141  return %shuffle : vector<4xf32>142}143 144// -----145 146// CHECK-LABEL:  func @shuffle147//  CHECK-SAME:  %[[ARG0:.+]]: i32, %[[ARG1:.+]]: vector<3xi32>148//       CHECK:    %[[S1:.+]] = spirv.CompositeExtract %[[ARG1]][1 : i32] : vector<3xi32>149//       CHECK:    %[[S2:.+]] = spirv.CompositeExtract %[[ARG1]][2 : i32] : vector<3xi32>150//       CHECK:    %[[RES:.+]] = spirv.CompositeConstruct %[[ARG0]], %[[S1]], %[[S2]] : (i32, i32, i32) -> vector<3xi32>151//       CHECK:    spirv.ReturnValue %[[RES]]152func.func @shuffle(%v0 : vector<1xi32>, %v1: vector<3xi32>) -> vector<3xi32> {153  %shuffle = vector.shuffle %v0, %v1 [0, 2, 3] : vector<1xi32>, vector<3xi32>154  return %shuffle : vector<3xi32>155}156 157// -----158 159// CHECK-LABEL:  func @shuffle160//  CHECK-SAME:  %[[ARG0:.+]]: i32, %[[ARG1:.+]]: i32161//       CHECK:    %[[RES:.+]] = spirv.CompositeConstruct %[[ARG0]], %[[ARG1]] : (i32, i32) -> vector<2xi32>162//       CHECK:    spirv.ReturnValue %[[RES]]163func.func @shuffle(%v0 : vector<1xi32>, %v1: vector<1xi32>) -> vector<2xi32> {164  %shuffle = vector.shuffle %v0, %v1 [0, 1] : vector<1xi32>, vector<1xi32>165  return %shuffle : vector<2xi32>166}167 168// -----169 170// CHECK-LABEL: func @interleave171//  CHECK-SAME: (%[[ARG0:.+]]: vector<2xf32>, %[[ARG1:.+]]: vector<2xf32>)172//       CHECK: %[[SHUFFLE:.*]] = spirv.VectorShuffle [0 : i32, 2 : i32, 1 : i32, 3 : i32] %[[ARG0]], %[[ARG1]] : vector<2xf32>, vector<2xf32> -> vector<4xf32>173//       CHECK: spirv.ReturnValue %[[SHUFFLE]]174func.func @interleave(%a: vector<2xf32>, %b: vector<2xf32>) -> vector<4xf32> {175  %0 = vector.interleave %a, %b : vector<2xf32> -> vector<4xf32>176  return %0 : vector<4xf32>177}178 179// -----180 181// CHECK-LABEL: func @interleave_size1182// CHECK-SAME: (%[[ARG0:.+]]: f32, %[[ARG1:.+]]: f32)183//       CHECK: %[[RES:.*]] = spirv.CompositeConstruct %[[ARG0]], %[[ARG1]] : (f32, f32) -> vector<2xf32>184//       CHECK: spirv.ReturnValue %[[RES]]185func.func @interleave_size1(%a: vector<1xf32>, %b: vector<1xf32>) -> vector<2xf32> {186  %0 = vector.interleave %a, %b : vector<1xf32> -> vector<2xf32>187  return %0 : vector<2xf32>188}189 190// -----191 192// CHECK-LABEL: func @reduction_add193//  CHECK-SAME: (%[[V:.+]]: vector<4xi32>)194//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<4xi32>195//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<4xi32>196//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<4xi32>197//       CHECK:   %[[S3:.+]] = spirv.CompositeExtract %[[V]][3 : i32] : vector<4xi32>198//       CHECK:   %[[ADD0:.+]] = spirv.IAdd %[[S0]], %[[S1]]199//       CHECK:   %[[ADD1:.+]] = spirv.IAdd %[[ADD0]], %[[S2]]200//       CHECK:   %[[ADD2:.+]] = spirv.IAdd %[[ADD1]], %[[S3]]201//       CHECK:   spirv.ReturnValue %[[ADD2]]202func.func @reduction_add(%v : vector<4xi32>) -> i32 {203  %reduce = vector.reduction <add>, %v : vector<4xi32> into i32204  return %reduce : i32205}206 207// -----208 209// CHECK-LABEL: func @reduction_addf_one_elem210//  CHECK-SAME:  (%[[ARG0:.+]]: f32)211//  CHECK:       spirv.ReturnValue %[[ARG0]] : f32212func.func @reduction_addf_one_elem(%arg0: vector<1xf32>) -> f32 {213  %red = vector.reduction <add>, %arg0 : vector<1xf32> into f32214  return %red : f32215}216 217// -----218 219// CHECK-LABEL: func @reduction_addf_one_elem_acc220//  CHECK-SAME:  (%[[ARG0:.+]]: f32, %[[ACC:.+]]: f32)221//  CHECK:       %[[RES:.+]] = spirv.FAdd %[[ACC]], %[[ARG0]] : f32222//  CHECK:       spirv.ReturnValue %[[RES]] : f32223func.func @reduction_addf_one_elem_acc(%arg0: vector<1xf32>, %acc: f32) -> f32 {224  %red = vector.reduction <add>, %arg0, %acc : vector<1xf32> into f32225  return %red : f32226}227 228// -----229 230// CHECK-LABEL: func @reduction_mul231//  CHECK-SAME: (%[[V:.+]]: vector<3xf32>, %[[S:.+]]: f32)232//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xf32>233//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xf32>234//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xf32>235//       CHECK:   %[[MUL0:.+]] = spirv.FMul %[[S0]], %[[S1]]236//       CHECK:   %[[MUL1:.+]] = spirv.FMul %[[MUL0]], %[[S2]]237//       CHECK:   %[[MUL2:.+]] = spirv.FMul %[[MUL1]], %[[S]]238//       CHECK:   spirv.ReturnValue %[[MUL2]]239func.func @reduction_mul(%v : vector<3xf32>, %s: f32) -> f32 {240  %reduce = vector.reduction <mul>, %v, %s : vector<3xf32> into f32241  return %reduce : f32242}243 244// -----245 246// CHECK-LABEL: func @reduction_maximumf247//  CHECK-SAME: (%[[V:.+]]: vector<3xf32>, %[[S:.+]]: f32)248//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xf32>249//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xf32>250//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xf32>251//       CHECK:   %[[MAX0:.+]] = spirv.GL.FMax %[[S0]], %[[S1]]252//       CHECK:   %[[MAX1:.+]] = spirv.GL.FMax %[[MAX0]], %[[S2]]253//       CHECK:   %[[MAX2:.+]] = spirv.GL.FMax %[[MAX1]], %[[S]]254//       CHECK:   spirv.ReturnValue %[[MAX2]]255func.func @reduction_maximumf(%v : vector<3xf32>, %s: f32) -> f32 {256  %reduce = vector.reduction <maximumf>, %v, %s : vector<3xf32> into f32257  return %reduce : f32258}259 260// -----261 262// CHECK-LABEL: func @reduction_minimumf263//  CHECK-SAME: (%[[V:.+]]: vector<3xf32>, %[[S:.+]]: f32)264//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xf32>265//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xf32>266//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xf32>267//       CHECK:   %[[MIN0:.+]] = spirv.GL.FMin %[[S0]], %[[S1]]268//       CHECK:   %[[MIN1:.+]] = spirv.GL.FMin %[[MIN0]], %[[S2]]269//       CHECK:   %[[MIN2:.+]] = spirv.GL.FMin %[[MIN1]], %[[S]]270//       CHECK:   spirv.ReturnValue %[[MIN2]]271func.func @reduction_minimumf(%v : vector<3xf32>, %s: f32) -> f32 {272  %reduce = vector.reduction <minimumf>, %v, %s : vector<3xf32> into f32273  return %reduce : f32274}275 276// -----277 278// CHECK-LABEL:   spirv.func @reduction_minnumf(279// CHECK-SAME:      %[[V:.*]]: vector<3xf32>,280// CHECK-SAME:      %[[S:.*]]: f32) -> f32 "None" {281// CHECK:           %[[S0:.*]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xf32>282// CHECK:           %[[S1:.*]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xf32>283// CHECK:           %[[S2:.*]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xf32>284// CHECK:           %[[MIN0:.*]] = spirv.GL.FMin %[[S0]], %[[S1]] : f32285// CHECK:           %[[MIN1:.*]] = spirv.GL.FMin %[[MIN0]], %[[S2]] : f32286// CHECK:           %[[MIN2:.*]] = spirv.GL.FMin %[[MIN1]], %[[S]] : f32287// CHECK:           spirv.ReturnValue %[[MIN2]] : f32288// CHECK:         }289func.func @reduction_minnumf(%v : vector<3xf32>, %s: f32) -> f32 {290  %reduce = vector.reduction <minnumf>, %v, %s : vector<3xf32> into f32291  return %reduce : f32292}293 294// -----295 296// CHECK-LABEL:   spirv.func @reduction_maxnumf(297// CHECK-SAME:      %[[V:.*]]: vector<3xf32>,298// CHECK-SAME:      %[[S:.*]]: f32) -> f32 "None" {299// CHECK:           %[[S0:.*]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xf32>300// CHECK:           %[[S1:.*]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xf32>301// CHECK:           %[[S2:.*]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xf32>302// CHECK:           %[[MAX0:.*]] = spirv.GL.FMax %[[S0]], %[[S1]] : f32303// CHECK:           %[[MAX1:.*]] = spirv.GL.FMax %[[MAX0]], %[[S2]] : f32304// CHECK:           %[[MAX2:.*]] = spirv.GL.FMax %[[MAX1]], %[[S]] : f32305// CHECK:           spirv.ReturnValue %[[MAX2]] : f32306// CHECK:         }307func.func @reduction_maxnumf(%v : vector<3xf32>, %s: f32) -> f32 {308  %reduce = vector.reduction <maxnumf>, %v, %s : vector<3xf32> into f32309  return %reduce : f32310}311 312// -----313 314// CHECK-LABEL: func @reduction_maxsi315//  CHECK-SAME: (%[[V:.+]]: vector<3xi32>, %[[S:.+]]: i32)316//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xi32>317//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xi32>318//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xi32>319//       CHECK:   %[[MAX0:.+]] = spirv.GL.SMax %[[S0]], %[[S1]]320//       CHECK:   %[[MAX1:.+]] = spirv.GL.SMax %[[MAX0]], %[[S2]]321//       CHECK:   %[[MAX2:.+]] = spirv.GL.SMax %[[MAX1]], %[[S]]322//       CHECK:   spirv.ReturnValue %[[MAX2]]323func.func @reduction_maxsi(%v : vector<3xi32>, %s: i32) -> i32 {324  %reduce = vector.reduction <maxsi>, %v, %s : vector<3xi32> into i32325  return %reduce : i32326}327 328// -----329 330// CHECK-LABEL: func @reduction_minsi331//  CHECK-SAME: (%[[V:.+]]: vector<3xi32>, %[[S:.+]]: i32)332//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xi32>333//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xi32>334//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xi32>335//       CHECK:   %[[MIN0:.+]] = spirv.GL.SMin %[[S0]], %[[S1]]336//       CHECK:   %[[MIN1:.+]] = spirv.GL.SMin %[[MIN0]], %[[S2]]337//       CHECK:   %[[MIN2:.+]] = spirv.GL.SMin %[[MIN1]], %[[S]]338//       CHECK:   spirv.ReturnValue %[[MIN2]]339func.func @reduction_minsi(%v : vector<3xi32>, %s: i32) -> i32 {340  %reduce = vector.reduction <minsi>, %v, %s : vector<3xi32> into i32341  return %reduce : i32342}343 344// -----345 346// CHECK-LABEL: func @reduction_maxui347//  CHECK-SAME: (%[[V:.+]]: vector<3xi32>, %[[S:.+]]: i32)348//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xi32>349//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xi32>350//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xi32>351//       CHECK:   %[[MAX0:.+]] = spirv.GL.UMax %[[S0]], %[[S1]]352//       CHECK:   %[[MAX1:.+]] = spirv.GL.UMax %[[MAX0]], %[[S2]]353//       CHECK:   %[[MAX2:.+]] = spirv.GL.UMax %[[MAX1]], %[[S]]354//       CHECK:   spirv.ReturnValue %[[MAX2]]355func.func @reduction_maxui(%v : vector<3xi32>, %s: i32) -> i32 {356  %reduce = vector.reduction <maxui>, %v, %s : vector<3xi32> into i32357  return %reduce : i32358}359 360// -----361 362// CHECK-LABEL: func @reduction_minui363//  CHECK-SAME: (%[[V:.+]]: vector<3xi32>, %[[S:.+]]: i32)364//       CHECK:   %[[S0:.+]] = spirv.CompositeExtract %[[V]][0 : i32] : vector<3xi32>365//       CHECK:   %[[S1:.+]] = spirv.CompositeExtract %[[V]][1 : i32] : vector<3xi32>366//       CHECK:   %[[S2:.+]] = spirv.CompositeExtract %[[V]][2 : i32] : vector<3xi32>367//       CHECK:   %[[MIN0:.+]] = spirv.GL.UMin %[[S0]], %[[S1]]368//       CHECK:   %[[MIN1:.+]] = spirv.GL.UMin %[[MIN0]], %[[S2]]369//       CHECK:   %[[MIN2:.+]] = spirv.GL.UMin %[[MIN1]], %[[S]]370//       CHECK:   spirv.ReturnValue %[[MIN2]]371func.func @reduction_minui(%v : vector<3xi32>, %s: i32) -> i32 {372  %reduce = vector.reduction <minui>, %v, %s : vector<3xi32> into i32373  return %reduce : i32374}375 376// -----377 378// CHECK-LABEL: @shape_cast_same_type379//  CHECK-SAME: (%[[ARG0:.*]]: vector<2xf32>)380//       CHECK:   spirv.ReturnValue %[[ARG0]]381func.func @shape_cast_same_type(%arg0 : vector<2xf32>) -> vector<2xf32> {382  %1 = vector.shape_cast %arg0 : vector<2xf32> to vector<2xf32>383  return %arg0 : vector<2xf32>384}385 386// -----387 388// CHECK-LABEL: @shape_cast_size1_vector389//  CHECK-SAME: (%[[ARG0:.*]]: f32)390//       CHECK:   spirv.ReturnValue %[[ARG0]]391func.func @shape_cast_size1_vector(%arg0 : vector<f32>) -> vector<1xf32> {392  %1 = vector.shape_cast %arg0 : vector<f32> to vector<1xf32>393  return %1 : vector<1xf32>394}395