brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.6 KiB · 4838d3c Raw
317 lines · plain
1// RUN: mlir-translate --no-implicit-module --test-spirv-roundtrip %s | FileCheck %s2// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv %s | spirv-val %}3 4// Note: Since the output of this test (optionally) gets validated by spirv-val,5// we cannot use splits.6 7spirv.module Logical Vulkan requires #spirv.vce<v1.3,8             [VulkanMemoryModel, Shader, Int64, Int16, Int8, Float64, Float16, CooperativeMatrixKHR, TensorsARM, Linkage],9             [SPV_KHR_vulkan_memory_model, SPV_KHR_cooperative_matrix, SPV_ARM_tensors]> {10  // CHECK-LABEL: @bool_const11  spirv.func @bool_const() -> () "None" {12    // CHECK: spirv.Constant true13    %0 = spirv.Constant true14    // CHECK: spirv.Constant false15    %1 = spirv.Constant false16 17    %2 = spirv.Variable init(%0): !spirv.ptr<i1, Function>18    %3 = spirv.Variable init(%1): !spirv.ptr<i1, Function>19    spirv.Return20  }21 22  // CHECK-LABEL: @i32_const23  spirv.func @i32_const() -> () "None" {24    // CHECK: spirv.Constant 0 : i3225    %0 = spirv.Constant  0 : i3226    // CHECK: spirv.Constant 10 : i3227    %1 = spirv.Constant 10 : i3228    // CHECK: spirv.Constant -5 : i3229    %2 = spirv.Constant -5 : i3230 31    %3 = spirv.IAdd %0, %1 : i3232    %4 = spirv.IAdd %2, %3 : i3233    spirv.Return34  }35 36  // CHECK-LABEL: @si32_const37  spirv.func @si32_const() -> () "None" {38    // CHECK: spirv.Constant 0 : si3239    %0 = spirv.Constant  0 : si3240    // CHECK: spirv.Constant 10 : si3241    %1 = spirv.Constant 10 : si3242    // CHECK: spirv.Constant -5 : si3243    %2 = spirv.Constant -5 : si3244 45    %3 = spirv.IAdd %0, %1 : si3246    %4 = spirv.IAdd %2, %3 : si3247    spirv.Return48  }49 50  // CHECK-LABEL: @ui32_const51  // We cannot differentiate signless vs. unsigned integers in SPIR-V blob52  // because they all use 1 as the signedness bit. So we always treat them53  // as signless integers.54  spirv.func @ui32_const() -> () "None" {55    // CHECK: spirv.Constant 0 : i3256    %0 = spirv.Constant  0 : ui3257    // CHECK: spirv.Constant 10 : i3258    %1 = spirv.Constant 10 : ui3259    // CHECK: spirv.Constant -5 : i3260    %2 = spirv.Constant 4294967291 : ui3261 62    %3 = spirv.IAdd %0, %1 : ui3263    %4 = spirv.IAdd %2, %3 : ui3264    spirv.Return65  }66 67  // CHECK-LABEL: @i64_const68  spirv.func @i64_const() -> () "None" {69    // CHECK: spirv.Constant 4294967296 : i6470    %0 = spirv.Constant           4294967296 : i64 //  2^3271    // CHECK: spirv.Constant -4294967296 : i6472    %1 = spirv.Constant          -4294967296 : i64 // -2^3273    // CHECK: spirv.Constant 9223372036854775807 : i6474    %2 = spirv.Constant  9223372036854775807 : i64 //  2^63 - 175    // CHECK: spirv.Constant -9223372036854775808 : i6476    %3 = spirv.Constant -9223372036854775808 : i64 // -2^6377 78    %4 = spirv.IAdd %0, %1 : i6479    %5 = spirv.IAdd %2, %3 : i6480    spirv.Return81  }82 83  // CHECK-LABEL: @i16_const84  spirv.func @i16_const() -> () "None" {85    // CHECK: spirv.Constant -32768 : i1686    %0 = spirv.Constant -32768 : i16 // -2^1587    // CHECK: spirv.Constant 32767 : i1688    %1 = spirv.Constant 32767 : i16 //  2^15 - 189 90    %2 = spirv.IAdd %0, %1 : i1691    spirv.Return92  }93 94  // CHECK-LABEL: @i8_const95  spirv.func @i8_const() -> () "None" {96    // CHECK: spirv.Constant 0 : i897    %0 = spirv.Constant 0 : i898    // CHECK: spirv.Constant -1 : i899    %1 = spirv.Constant 255 : i8100 101    // CHECK: spirv.Constant 0 : si8102    %2 = spirv.Constant 0 : si8103    // CHECK: spirv.Constant 127 : si8104    %3 = spirv.Constant 127 : si8105    // CHECK: spirv.Constant -128 : si8106    %4 = spirv.Constant -128 : si8107 108    // CHECK: spirv.Constant 0 : i8109    %5 = spirv.Constant 0 : ui8110    // CHECK: spirv.Constant -1 : i8111    %6 = spirv.Constant 255 : ui8112 113    %10 = spirv.IAdd %0, %1: i8114    %11 = spirv.IAdd %2, %3: si8115    %12 = spirv.IAdd %3, %4: si8116    %13 = spirv.IAdd %5, %6: ui8117    spirv.Return118  }119 120  // CHECK-LABEL: @float_const121  spirv.func @float_const() -> () "None" {122    // CHECK: spirv.Constant 0.000000e+00 : f32123    %0 = spirv.Constant 0. : f32124    // CHECK: spirv.Constant 1.000000e+00 : f32125    %1 = spirv.Constant 1. : f32126    // CHECK: spirv.Constant -0.000000e+00 : f32127    %2 = spirv.Constant -0. : f32128    // CHECK: spirv.Constant -1.000000e+00 : f32129    %3 = spirv.Constant -1. : f32130    // CHECK: spirv.Constant 7.500000e-01 : f32131    %4 = spirv.Constant 0.75 : f32132    // CHECK: spirv.Constant -2.500000e-01 : f32133    %5 = spirv.Constant -0.25 : f32134 135    %6 = spirv.FAdd %0, %1 : f32136    %7 = spirv.FAdd %2, %3 : f32137    %8 = spirv.FAdd %4, %5 : f32138    spirv.Return139  }140 141  // CHECK-LABEL: @double_const142  spirv.func @double_const() -> () "None" {143    // TODO: test range boundary values144    // CHECK: spirv.Constant 1.024000e+03 : f64145    %0 = spirv.Constant 1024. : f64146    // CHECK: spirv.Constant -1.024000e+03 : f64147    %1 = spirv.Constant -1024. : f64148 149    %2 = spirv.FAdd %0, %1 : f64150    spirv.Return151  }152 153  // CHECK-LABEL: @half_const154  spirv.func @half_const() -> () "None" {155    // CHECK: spirv.Constant 5.120000e+02 : f16156    %0 = spirv.Constant 512. : f16157    // CHECK: spirv.Constant -5.120000e+02 : f16158    %1 = spirv.Constant -512. : f16159 160    %2 = spirv.FAdd %0, %1 : f16161    spirv.Return162  }163 164  // CHECK-LABEL: @bool_vector_const165  spirv.func @bool_vector_const() -> () "None" {166    // CHECK: spirv.Constant dense<false> : vector<2xi1>167    %0 = spirv.Constant dense<false> : vector<2xi1>168    // CHECK: spirv.Constant dense<true> : vector<3xi1>169    %1 = spirv.Constant dense<true> : vector<3xi1>170    // CHECK: spirv.Constant dense<[false, true]> : vector<2xi1>171    %2 = spirv.Constant dense<[false, true]> : vector<2xi1>172 173    %3 = spirv.Variable init(%0): !spirv.ptr<vector<2xi1>, Function>174    %4 = spirv.Variable init(%1): !spirv.ptr<vector<3xi1>, Function>175    %5 = spirv.Variable init(%2): !spirv.ptr<vector<2xi1>, Function>176    spirv.Return177  }178 179  // CHECK-LABEL: @int_vector_const180  spirv.func @int_vector_const() -> () "None" {181    // CHECK: spirv.Constant dense<0> : vector<3xi32>182    %0 = spirv.Constant dense<0> : vector<3xi32>183    // CHECK: spirv.Constant dense<1> : vector<3xi32>184    %1 = spirv.Constant dense<1> : vector<3xi32>185    // CHECK: spirv.Constant dense<[2, -3, 4]> : vector<3xi32>186    %2 = spirv.Constant dense<[2, -3, 4]> : vector<3xi32>187 188    %3 = spirv.IAdd %0, %1 : vector<3xi32>189    %4 = spirv.IAdd %2, %3 : vector<3xi32>190    spirv.Return191  }192 193  // CHECK-LABEL: @fp_vector_const194  spirv.func @fp_vector_const() -> () "None" {195    // CHECK: spirv.Constant dense<0.000000e+00> : vector<4xf32>196    %0 = spirv.Constant dense<0.> : vector<4xf32>197    // CHECK: spirv.Constant dense<-1.500000e+01> : vector<4xf32>198    %1 = spirv.Constant dense<-15.> : vector<4xf32>199    // CHECK: spirv.Constant dense<[7.500000e-01, -2.500000e-01, 1.000000e+01, 4.200000e+01]> : vector<4xf32>200    %2 = spirv.Constant dense<[0.75, -0.25, 10., 42.]> : vector<4xf32>201 202    %3 = spirv.FAdd %0, %1 : vector<4xf32>203    %4 = spirv.FAdd %2, %3 : vector<4xf32>204    spirv.Return205  }206 207  // CHECK-LABEL: @ui64_array_const208  spirv.func @ui64_array_const() -> (!spirv.array<3xui64>) "None" {209    // CHECK: spirv.Constant [5, 6, 7] : !spirv.array<3 x i64>210    %0 = spirv.Constant [5 : ui64, 6 : ui64, 7 : ui64] : !spirv.array<3 x ui64>211 212    spirv.ReturnValue %0: !spirv.array<3xui64>213  }214 215  // CHECK-LABEL: @si32_array_const216  spirv.func @si32_array_const() -> (!spirv.array<3xsi32>) "None" {217    // CHECK: spirv.Constant [5 : si32, 6 : si32, 7 : si32] : !spirv.array<3 x si32>218    %0 = spirv.Constant [5 : si32, 6 : si32, 7 : si32] : !spirv.array<3 x si32>219 220    spirv.ReturnValue %0 : !spirv.array<3xsi32>221  }222  // CHECK-LABEL: @float_array_const223  spirv.func @float_array_const() -> (!spirv.array<2 x vector<2xf32>>) "None" {224    // CHECK: spirv.Constant [dense<3.000000e+00> : vector<2xf32>, dense<[4.000000e+00, 5.000000e+00]> : vector<2xf32>] : !spirv.array<2 x vector<2xf32>>225    %0 = spirv.Constant [dense<3.0> : vector<2xf32>, dense<[4., 5.]> : vector<2xf32>] : !spirv.array<2 x vector<2xf32>>226 227    spirv.ReturnValue %0 : !spirv.array<2 x vector<2xf32>>228  }229 230  // CHECK-LABEL: @ignore_not_used_const231  spirv.func @ignore_not_used_const() -> () "None" {232    %0 = spirv.Constant false233    // CHECK-NEXT: spirv.Return234    spirv.Return235  }236 237  // CHECK-LABEL: @materialize_const_at_each_use238  spirv.func @materialize_const_at_each_use() -> (i32) "None" {239    // CHECK: %[[USE1:.*]] = spirv.Constant 42 : i32240    // CHECK: %[[USE2:.*]] = spirv.Constant 42 : i32241    // CHECK: spirv.IAdd %[[USE1]], %[[USE2]]242    %0 = spirv.Constant 42 : i32243    %1 = spirv.IAdd %0, %0 : i32244    spirv.ReturnValue %1 : i32245  }246 247  // CHECK-LABEL: @const_variable248  spirv.func @const_variable(%arg0 : i32, %arg1 : i32) -> () "None" {249    // CHECK: %[[CONST:.*]] = spirv.Constant 5 : i32250    // CHECK: spirv.Variable init(%[[CONST]]) : !spirv.ptr<i32, Function>251    // CHECK: spirv.IAdd %arg0, %arg1252    %0 = spirv.IAdd %arg0, %arg1 : i32253    %1 = spirv.Constant 5 : i32254    %2 = spirv.Variable init(%1) : !spirv.ptr<i32, Function>255    %3 = spirv.Load "Function" %2 : i32256    %4 = spirv.IAdd %0, %3 : i32257    spirv.Return258  }259 260  // CHECK-LABEL: @multi_dimensions_const261  spirv.func @multi_dimensions_const() -> (!spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>) "None" {262    // CHECK: spirv.Constant {{\[}}{{\[}}[1 : i32, 2 : i32, 3 : i32], [4 : i32, 5 : i32, 6 : i32]], {{\[}}[7 : i32, 8 : i32, 9 : i32], [10 : i32, 11 : i32, 12 : i32]]] : !spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>263    %0 = spirv.Constant dense<[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]> : tensor<2x2x3xi32> : !spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>264    spirv.ReturnValue %0 : !spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>265  }266 267  // CHECK-LABEL: @multi_dimensions_splat_const268  spirv.func @multi_dimensions_splat_const() -> (!spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>) "None" {269    // CHECK: spirv.Constant {{\[}}{{\[}}[1 : i32, 1 : i32, 1 : i32], [1 : i32, 1 : i32, 1 : i32]], {{\[}}[1 : i32, 1 : i32, 1 : i32], [1 : i32, 1 : i32, 1 : i32]]] : !spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>270    %0 = spirv.Constant dense<1> : tensor<2x2x3xi32> : !spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>271    spirv.ReturnValue %0 : !spirv.array<2 x !spirv.array<2 x !spirv.array<3 x i32, stride=4>, stride=12>, stride=24>272  }273 274  // CHECK-LABEL: @signless_int_const_bit_extension275  spirv.func @signless_int_const_bit_extension() -> (i16) "None" {276    // CHECK: spirv.Constant -1 : i16277    %signless_minus_one = spirv.Constant -1 : i16278    spirv.ReturnValue %signless_minus_one : i16279  }280  // CHECK-LABEL: @signed_int_const_bit_extension281  spirv.func @signed_int_const_bit_extension() -> (si16) "None" {282    // CHECK: spirv.Constant -1 : si16283    %signed_minus_one = spirv.Constant -1 : si16284    spirv.ReturnValue %signed_minus_one : si16285  }286 287  // CHECK-LABEL: @coop_matrix_const_zero_f32288  spirv.func @coop_matrix_const_zero_f32() -> (!spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>) "None" {289    // CHECK: {{%.*}} = spirv.Constant dense<0.000000e+00> : !spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>290    %coop = spirv.Constant dense<0.000000e+00> : !spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>291    spirv.ReturnValue %coop : !spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>292  }293 294  // CHECK-LABEL: @coop_matrix_const_non_zero_f32295  spirv.func @coop_matrix_const_non_zero_f32() -> (!spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>) "None" {296    // CHECK: {{%.*}} = spirv.Constant dense<4.200000e+00> : !spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>297    %coop = spirv.Constant dense<4.200000e+00> : !spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>298    spirv.ReturnValue %coop : !spirv.coopmatrix<16x16xf32, Subgroup, MatrixAcc>299  }300 301  // CHECK-LABEL: @coop_matrix_const_zero_i8302  spirv.func @coop_matrix_const_zero_i8() -> (!spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>) "None" {303    // CHECK: {{%.*}} = spirv.Constant dense<0> : !spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>304    %coop = spirv.Constant dense<0> : !spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>305    spirv.ReturnValue %coop : !spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>306  }307 308  // CHECK-LABEL: @coop_matrix_const_non_zero_i8309  spirv.func @coop_matrix_const_non_zero_i8() -> (!spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>) "None" {310    // CHECK: {{%.*}} = spirv.Constant dense<4> : !spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>311    %coop = spirv.Constant dense<4> : !spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>312    spirv.ReturnValue %coop : !spirv.coopmatrix<16x16xi8, Subgroup, MatrixAcc>313  }314 315  spirv.EntryPoint "GLCompute" @bool_const316}317