566 lines · plain
1// RUN: mlir-opt -split-input-file -spirv-unify-aliased-resource -verify-diagnostics %s | FileCheck %s2 3spirv.module Logical GLSL450 {4 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>5 spirv.GlobalVariable @var01v bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>6 7 spirv.func @load_store_scalar(%index: i32) -> f32 "None" {8 %c0 = spirv.Constant 0 : i329 %addr = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>10 %ac = spirv.AccessChain %addr[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>11 %value = spirv.Load "StorageBuffer" %ac : f3212 spirv.Store "StorageBuffer" %ac, %value : f3213 spirv.ReturnValue %value : f3214 }15}16 17// CHECK-LABEL: spirv.module18 19// CHECK-NOT: @var01s20// CHECK: spirv.GlobalVariable @var01v bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>21// CHECK-NOT: @var01s22 23// CHECK: spirv.func @load_store_scalar(%[[INDEX:.+]]: i32)24// CHECK-DAG: %[[C0:.+]] = spirv.Constant 0 : i3225// CHECK-DAG: %[[C4:.+]] = spirv.Constant 4 : i3226// CHECK-DAG: %[[ADDR:.+]] = spirv.mlir.addressof @var01v27// CHECK: %[[DIV:.+]] = spirv.SDiv %[[INDEX]], %[[C4]] : i3228// CHECK: %[[MOD:.+]] = spirv.SMod %[[INDEX]], %[[C4]] : i3229// CHECK: %[[AC:.+]] = spirv.AccessChain %[[ADDR]][%[[C0]], %[[DIV]], %[[MOD]]]30// CHECK: spirv.Load "StorageBuffer" %[[AC]]31// CHECK: spirv.Store "StorageBuffer" %[[AC]]32 33// -----34 35spirv.module Logical GLSL450 {36 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>37 spirv.GlobalVariable @var01v bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>38 39 spirv.func @load_store_scalar_64bit(%index: i64) -> f32 "None" {40 %c0 = spirv.Constant 0 : i6441 %addr = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>42 %ac = spirv.AccessChain %addr[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i64, i64 -> !spirv.ptr<f32, StorageBuffer>43 %value = spirv.Load "StorageBuffer" %ac : f3244 spirv.Store "StorageBuffer" %ac, %value : f3245 spirv.ReturnValue %value : f3246 }47}48 49// CHECK-LABEL: spirv.module50 51// CHECK-NOT: @var01s52// CHECK: spirv.GlobalVariable @var01v bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>53// CHECK-NOT: @var01s54 55// CHECK: spirv.func @load_store_scalar_64bit(%[[INDEX:.+]]: i64)56// CHECK-DAG: %[[C4:.+]] = spirv.Constant 4 : i6457// CHECK: spirv.SDiv %[[INDEX]], %[[C4]] : i6458// CHECK: spirv.SMod %[[INDEX]], %[[C4]] : i6459 60// -----61 62spirv.module Logical GLSL450 {63 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>64 spirv.GlobalVariable @var01v bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>65 66 spirv.func @multiple_uses(%i0: i32, %i1: i32) -> f32 "None" {67 %c0 = spirv.Constant 0 : i3268 %addr = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>69 %ac0 = spirv.AccessChain %addr[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>70 %val0 = spirv.Load "StorageBuffer" %ac0 : f3271 %ac1 = spirv.AccessChain %addr[%c0, %i1] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>72 %val1 = spirv.Load "StorageBuffer" %ac1 : f3273 %value = spirv.FAdd %val0, %val1 : f3274 spirv.ReturnValue %value : f3275 }76}77 78// CHECK-LABEL: spirv.module79 80// CHECK-NOT: @var01s81// CHECK: spirv.GlobalVariable @var01v bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>82// CHECK-NOT: @var01s83 84// CHECK: spirv.func @multiple_uses85// CHECK: %[[ADDR:.+]] = spirv.mlir.addressof @var01v86// CHECK: spirv.AccessChain %[[ADDR]][%{{.+}}, %{{.+}}, %{{.+}}]87// CHECK: spirv.AccessChain %[[ADDR]][%{{.+}}, %{{.+}}, %{{.+}}]88 89// -----90 91spirv.module Logical GLSL450 {92 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>93 spirv.GlobalVariable @var01v bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<3xf32>, stride=16> [0])>, StorageBuffer>94 95 spirv.func @vector3(%index: i32) -> f32 "None" {96 %c0 = spirv.Constant 0 : i3297 %addr = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>98 %ac = spirv.AccessChain %addr[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>99 %value = spirv.Load "StorageBuffer" %ac : f32100 spirv.ReturnValue %value : f32101 }102}103 104// CHECK-LABEL: spirv.module105 106// CHECK: spirv.GlobalVariable @var01s bind(0, 1) {aliased}107// CHECK: spirv.GlobalVariable @var01v bind(0, 1) {aliased}108// CHECK: spirv.func @vector3109 110// -----111 112spirv.module Logical GLSL450 {113 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>114 spirv.GlobalVariable @var01v bind(1, 0) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>115 116 spirv.func @not_aliased(%index: i32) -> f32 "None" {117 %c0 = spirv.Constant 0 : i32118 %addr = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>119 %ac = spirv.AccessChain %addr[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>120 %value = spirv.Load "StorageBuffer" %ac : f32121 spirv.Store "StorageBuffer" %ac, %value : f32122 spirv.ReturnValue %value : f32123 }124}125 126// CHECK-LABEL: spirv.module127 128// CHECK: spirv.GlobalVariable @var01s bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>129// CHECK: spirv.GlobalVariable @var01v bind(1, 0) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>130// CHECK: spirv.func @not_aliased131 132// -----133 134spirv.module Logical GLSL450 {135 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>136 spirv.GlobalVariable @var01s_1 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>137 spirv.GlobalVariable @var01v bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>138 spirv.GlobalVariable @var01v_1 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>139 140 spirv.func @multiple_aliases(%index: i32) -> f32 "None" {141 %c0 = spirv.Constant 0 : i32142 143 %addr0 = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>144 %ac0 = spirv.AccessChain %addr0[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>145 %val0 = spirv.Load "StorageBuffer" %ac0 : f32146 147 %addr1 = spirv.mlir.addressof @var01s_1 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>148 %ac1 = spirv.AccessChain %addr1[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>149 %val1 = spirv.Load "StorageBuffer" %ac1 : f32150 151 %addr2 = spirv.mlir.addressof @var01v_1 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>152 %ac2 = spirv.AccessChain %addr2[%c0, %index, %c0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>, i32, i32, i32 -> !spirv.ptr<f32, StorageBuffer>153 %val2 = spirv.Load "StorageBuffer" %ac2 : f32154 155 %add0 = spirv.FAdd %val0, %val1 : f32156 %add1 = spirv.FAdd %add0, %val2 : f32157 spirv.ReturnValue %add1 : f32158 }159}160 161// CHECK-LABEL: spirv.module162 163// CHECK-NOT: @var01s164// CHECK: spirv.GlobalVariable @var01v bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>165// CHECK-NOT: @var01v_1166 167// CHECK: spirv.func @multiple_aliases168// CHECK: %[[ADDR0:.+]] = spirv.mlir.addressof @var01v :169// CHECK: spirv.AccessChain %[[ADDR0]][%{{.+}}, %{{.+}}, %{{.+}}]170// CHECK: %[[ADDR1:.+]] = spirv.mlir.addressof @var01v :171// CHECK: spirv.AccessChain %[[ADDR1]][%{{.+}}, %{{.+}}, %{{.+}}]172// CHECK: %[[ADDR2:.+]] = spirv.mlir.addressof @var01v :173// CHECK: spirv.AccessChain %[[ADDR2]][%{{.+}}, %{{.+}}, %{{.+}}]174 175// -----176 177spirv.module Logical GLSL450 {178 spirv.GlobalVariable @var01s_i32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>179 spirv.GlobalVariable @var01s_f32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>180 181 spirv.func @different_scalar_type(%index: i32, %val1: f32) -> i32 "None" {182 %c0 = spirv.Constant 0 : i32183 184 %addr0 = spirv.mlir.addressof @var01s_i32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>185 %ac0 = spirv.AccessChain %addr0[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i32, StorageBuffer>186 %val0 = spirv.Load "StorageBuffer" %ac0 : i32187 188 %addr1 = spirv.mlir.addressof @var01s_f32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>189 %ac1 = spirv.AccessChain %addr1[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>190 spirv.Store "StorageBuffer" %ac1, %val1 : f32191 192 spirv.ReturnValue %val0 : i32193 }194}195 196// CHECK-LABEL: spirv.module197 198// CHECK-NOT: @var01s_f32199// CHECK: spirv.GlobalVariable @var01s_i32 bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>200// CHECK-NOT: @var01s_f32201 202// CHECK: spirv.func @different_scalar_type(%[[INDEX:.+]]: i32, %[[VAL1:.+]]: f32)203 204// CHECK: %[[IADDR:.+]] = spirv.mlir.addressof @var01s_i32205// CHECK: %[[IAC:.+]] = spirv.AccessChain %[[IADDR]][%{{.+}}, %[[INDEX]]]206// CHECK: spirv.Load "StorageBuffer" %[[IAC]] : i32207 208// CHECK: %[[FADDR:.+]] = spirv.mlir.addressof @var01s_i32209// CHECK: %[[FAC:.+]] = spirv.AccessChain %[[FADDR]][%cst0_i32, %[[INDEX]]]210// CHECK: %[[CAST:.+]] = spirv.Bitcast %[[VAL1]] : f32 to i32211// CHECK: spirv.Store "StorageBuffer" %[[FAC]], %[[CAST]] : i32212 213// -----214 215spirv.module Logical GLSL450 {216 spirv.GlobalVariable @var01s bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>217 spirv.GlobalVariable @var01v bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>218 219 spirv.func @different_primitive_type(%index: i32, %val0: i32) -> i32 "None" {220 %c0 = spirv.Constant 0 : i32221 %addr = spirv.mlir.addressof @var01s : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>222 %ac = spirv.AccessChain %addr[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i32, StorageBuffer>223 %val1 = spirv.Load "StorageBuffer" %ac : i32224 spirv.Store "StorageBuffer" %ac, %val0 : i32225 spirv.ReturnValue %val1 : i32226 }227}228 229// CHECK-LABEL: spirv.module230 231// CHECK-NOT: @var01s232// CHECK: spirv.GlobalVariable @var01v bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>233// CHECK-NOT: @var01s234 235// CHECK: spirv.func @different_primitive_type(%{{.+}}: i32, %[[VAL0:.+]]: i32)236// CHECK: %[[ADDR:.+]] = spirv.mlir.addressof @var01v237// CHECK: %[[AC:.+]] = spirv.AccessChain %[[ADDR]][%{{.+}}, %{{.+}}, %{{.+}}]238// CHECK: %[[VAL1:.+]] = spirv.Load "StorageBuffer" %[[AC]] : f32239// CHECK: %[[CAST1:.+]] = spirv.Bitcast %[[VAL1]] : f32 to i32240// CHECK: %[[CAST2:.+]] = spirv.Bitcast %[[VAL0]] : i32 to f32241// CHECK: spirv.Store "StorageBuffer" %[[AC]], %[[CAST2]] : f32242// CHECK: spirv.ReturnValue %[[CAST1]] : i32243 244// -----245 246spirv.module Logical GLSL450 {247 spirv.GlobalVariable @var01s_i64 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=4> [0])>, StorageBuffer>248 spirv.GlobalVariable @var01s_f32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>249 250 spirv.func @load_different_scalar_bitwidth(%index: i32) -> i64 "None" {251 %c0 = spirv.Constant 0 : i32252 253 %addr0 = spirv.mlir.addressof @var01s_i64 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=4> [0])>, StorageBuffer>254 %ac0 = spirv.AccessChain %addr0[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i64, StorageBuffer>255 %val0 = spirv.Load "StorageBuffer" %ac0 : i64256 257 spirv.ReturnValue %val0 : i64258 }259}260 261// CHECK-LABEL: spirv.module262 263// CHECK-NOT: @var01s_i64264// CHECK: spirv.GlobalVariable @var01s_f32 bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>265// CHECK-NOT: @var01s_i64266 267// CHECK: spirv.func @load_different_scalar_bitwidth(%[[INDEX:.+]]: i32)268// CHECK: %[[ZERO:.+]] = spirv.Constant 0 : i32269// CHECK: %[[ADDR:.+]] = spirv.mlir.addressof @var01s_f32270 271// CHECK: %[[TWO:.+]] = spirv.Constant 2 : i32272// CHECK: %[[BASE:.+]] = spirv.IMul %[[INDEX]], %[[TWO]] : i32273// CHECK: %[[AC0:.+]] = spirv.AccessChain %[[ADDR]][%[[ZERO]], %[[BASE]]]274// CHECK: %[[LOAD0:.+]] = spirv.Load "StorageBuffer" %[[AC0]] : f32275 276// CHECK: %[[ONE:.+]] = spirv.Constant 1 : i32277// CHECK: %[[ADD:.+]] = spirv.IAdd %[[BASE]], %[[ONE]] : i32278// CHECK: %[[AC1:.+]] = spirv.AccessChain %[[ADDR]][%[[ZERO]], %[[ADD]]]279// CHECK: %[[LOAD1:.+]] = spirv.Load "StorageBuffer" %[[AC1]] : f32280 281// CHECK: %[[CC:.+]] = spirv.CompositeConstruct %[[LOAD0]], %[[LOAD1]]282// CHECK: %[[CAST:.+]] = spirv.Bitcast %[[CC]] : vector<2xf32> to i64283// CHECK: spirv.ReturnValue %[[CAST]]284 285// -----286 287spirv.module Logical GLSL450 {288 spirv.GlobalVariable @var01s_i64 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=4> [0])>, StorageBuffer>289 spirv.GlobalVariable @var01s_f32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>290 291 spirv.func @store_different_scalar_bitwidth(%i0: i32, %i1: i32) "None" {292 %c0 = spirv.Constant 0 : i32293 294 %addr0 = spirv.mlir.addressof @var01s_f32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>295 %ac0 = spirv.AccessChain %addr0[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>296 %f32val = spirv.Load "StorageBuffer" %ac0 : f32297 %f64val = spirv.FConvert %f32val : f32 to f64298 %i64val = spirv.Bitcast %f64val : f64 to i64299 300 %addr1 = spirv.mlir.addressof @var01s_i64 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=4> [0])>, StorageBuffer>301 %ac1 = spirv.AccessChain %addr1[%c0, %i1] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i64, StorageBuffer>302 // expected-error@+1 {{failed to legalize operation 'spirv.Store'}}303 spirv.Store "StorageBuffer" %ac1, %i64val : i64304 305 spirv.Return306 }307}308 309// -----310 311spirv.module Logical GLSL450 {312 spirv.GlobalVariable @var01_scalar bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>313 spirv.GlobalVariable @var01_vec2 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf32>, stride=8> [0])>, StorageBuffer>314 spirv.GlobalVariable @var01_vec4 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>315 316 spirv.func @load_different_vector_sizes(%i0: i32) -> vector<4xf32> "None" {317 %c0 = spirv.Constant 0 : i32318 319 %addr0 = spirv.mlir.addressof @var01_vec4 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>320 %ac0 = spirv.AccessChain %addr0[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<vector<4xf32>, StorageBuffer>321 %vec4val = spirv.Load "StorageBuffer" %ac0 : vector<4xf32>322 323 %addr1 = spirv.mlir.addressof @var01_scalar : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>324 %ac1 = spirv.AccessChain %addr1[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>325 %scalarval = spirv.Load "StorageBuffer" %ac1 : f32326 327 %val = spirv.CompositeInsert %scalarval, %vec4val[0 : i32] : f32 into vector<4xf32>328 spirv.ReturnValue %val : vector<4xf32>329 }330}331 332// CHECK-LABEL: spirv.module333 334// CHECK-NOT: @var01_scalar335// CHECK-NOT: @var01_vec4336// CHECK: spirv.GlobalVariable @var01_vec2 bind(0, 1) : !spirv.ptr<{{.+}}>337// CHECK-NOT: @var01_scalar338// CHECK-NOT: @var01_vec4339 340// CHECK: spirv.func @load_different_vector_sizes(%[[IDX:.+]]: i32)341// CHECK: %[[ZERO:.+]] = spirv.Constant 0 : i32342// CHECK: %[[ADDR:.+]] = spirv.mlir.addressof @var01_vec2343// CHECK: %[[TWO:.+]] = spirv.Constant 2 : i32344// CHECK: %[[IDX0:.+]] = spirv.IMul %[[IDX]], %[[TWO]] : i32345// CHECK: %[[AC0:.+]] = spirv.AccessChain %[[ADDR]][%[[ZERO]], %[[IDX0]]]346// CHECK: %[[LD0:.+]] = spirv.Load "StorageBuffer" %[[AC0]] : vector<2xf32>347// CHECK: %[[ONE:.+]] = spirv.Constant 1 : i32348// CHECK: %[[IDX1:.+]] = spirv.IAdd %0, %[[ONE]] : i32349// CHECK: %[[AC1:.+]] = spirv.AccessChain %[[ADDR]][%[[ZERO]], %[[IDX1]]]350// CHECK: %[[LD1:.+]] = spirv.Load "StorageBuffer" %[[AC1]] : vector<2xf32>351// CHECK: spirv.CompositeConstruct %[[LD0]], %[[LD1]] : (vector<2xf32>, vector<2xf32>) -> vector<4xf32>352 353// CHECK: %[[ADDR:.+]] = spirv.mlir.addressof @var01_vec2354// CHECK: %[[TWO:.+]] = spirv.Constant 2 : i32355// CHECK: %[[DIV:.+]] = spirv.SDiv %[[IDX]], %[[TWO]] : i32356// CHECK: %[[MOD:.+]] = spirv.SMod %[[IDX]], %[[TWO]] : i32357// CHECK: %[[AC:.+]] = spirv.AccessChain %[[ADDR]][%[[ZERO]], %[[DIV]], %[[MOD]]]358// CHECK: %[[LD:.+]] = spirv.Load "StorageBuffer" %[[AC]] : f32359 360// -----361 362spirv.module Logical GLSL450 {363 spirv.GlobalVariable @var01_v4f32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>364 spirv.GlobalVariable @var01_f32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>365 spirv.GlobalVariable @var01_i64 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=8> [0])>, StorageBuffer>366 367 spirv.func @load_mixed_scalar_vector_primitive_types(%i0: i32) -> vector<4xf32> "None" {368 %c0 = spirv.Constant 0 : i32369 370 %addr0 = spirv.mlir.addressof @var01_v4f32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>371 %ac0 = spirv.AccessChain %addr0[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<vector<4xf32>, StorageBuffer>372 %vec4val = spirv.Load "StorageBuffer" %ac0 : vector<4xf32>373 374 %addr1 = spirv.mlir.addressof @var01_f32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>375 %ac1 = spirv.AccessChain %addr1[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>376 %f32val = spirv.Load "StorageBuffer" %ac1 : f32377 378 %addr2 = spirv.mlir.addressof @var01_i64 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=8> [0])>, StorageBuffer>379 %ac2 = spirv.AccessChain %addr2[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=8> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i64, StorageBuffer>380 %i64val = spirv.Load "StorageBuffer" %ac2 : i64381 %i32val = spirv.SConvert %i64val : i64 to i32382 %castval = spirv.Bitcast %i32val : i32 to f32383 384 %val1 = spirv.CompositeInsert %f32val, %vec4val[0 : i32] : f32 into vector<4xf32>385 %val2 = spirv.CompositeInsert %castval, %val1[1 : i32] : f32 into vector<4xf32>386 spirv.ReturnValue %val2 : vector<4xf32>387 }388}389 390// CHECK-LABEL: spirv.module391 392// CHECK-NOT: @var01_f32393// CHECK-NOT: @var01_i64394// CHECK: spirv.GlobalVariable @var01_v4f32 bind(0, 1) : !spirv.ptr<{{.+}}>395// CHECK-NOT: @var01_f32396// CHECK-NOT: @var01_i64397 398// CHECK: spirv.func @load_mixed_scalar_vector_primitive_types(%[[IDX:.+]]: i32)399 400// CHECK: %[[ZERO:.+]] = spirv.Constant 0 : i32401// CHECK: %[[ADDR0:.+]] = spirv.mlir.addressof @var01_v4f32402// CHECK: %[[AC0:.+]] = spirv.AccessChain %[[ADDR0]][%[[ZERO]], %[[IDX]]]403// CHECK: spirv.Load "StorageBuffer" %[[AC0]] : vector<4xf32>404 405// CHECK: %[[ADDR1:.+]] = spirv.mlir.addressof @var01_v4f32406// CHECK: %[[FOUR:.+]] = spirv.Constant 4 : i32407// CHECK: %[[DIV:.+]] = spirv.SDiv %[[IDX]], %[[FOUR]] : i32408// CHECK: %[[MOD:.+]] = spirv.SMod %[[IDX]], %[[FOUR]] : i32409// CHECK: %[[AC1:.+]] = spirv.AccessChain %[[ADDR1]][%[[ZERO]], %[[DIV]], %[[MOD]]]410// CHECK: spirv.Load "StorageBuffer" %[[AC1]] : f32411 412// CHECK: %[[ADDR2:.+]] = spirv.mlir.addressof @var01_v4f32413// CHECK: %[[TWO:.+]] = spirv.Constant 2 : i32414// CHECK: %[[DIV0:.+]] = spirv.SDiv %[[IDX]], %[[TWO]] : i32415// CHECK: %[[MOD0:.+]] = spirv.SMod %[[IDX]], %[[TWO]] : i32416// CHECK: %[[AC2:.+]] = spirv.AccessChain %[[ADDR2]][%[[ZERO]], %[[DIV0]], %[[MOD0]]]417// CHECK: %[[LD0:.+]] = spirv.Load "StorageBuffer" %[[AC2]] : f32418 419// CHECK: %[[ONE:.+]] = spirv.Constant 1 : i32420// CHECK: %[[MOD1:.+]] = spirv.IAdd %[[MOD0]], %[[ONE]]421// CHECK: %[[AC3:.+]] = spirv.AccessChain %[[ADDR2]][%[[ZERO]], %[[DIV0]], %[[MOD1]]]422// CHECK: %[[LD1:.+]] = spirv.Load "StorageBuffer" %[[AC3]] : f32423// CHECK: %[[CC:.+]] = spirv.CompositeConstruct %[[LD0]], %[[LD1]]424// CHECK: %[[BC:.+]] = spirv.Bitcast %[[CC]] : vector<2xf32> to i64425 426// -----427 428spirv.module Logical GLSL450 {429 spirv.GlobalVariable @var01_v2f2 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf32>, stride=16> [0])>, StorageBuffer>430 spirv.GlobalVariable @var01_i64 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=8> [0])>, StorageBuffer>431 432 spirv.func @load_mixed_scalar_vector_primitive_types(%i0: i32) -> i64 "None" {433 %c0 = spirv.Constant 0 : i32434 435 %addr = spirv.mlir.addressof @var01_i64 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=8> [0])>, StorageBuffer>436 %ac = spirv.AccessChain %addr[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i64, stride=8> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i64, StorageBuffer>437 %val = spirv.Load "StorageBuffer" %ac : i64438 439 spirv.ReturnValue %val : i64440 }441}442 443// CHECK-LABEL: spirv.module444 445// CHECK: spirv.func @load_mixed_scalar_vector_primitive_types(%[[IDX:.+]]: i32)446 447// CHECK: %[[ADDR:.+]] = spirv.mlir.addressof @var01_v2f2448// CHECK: %[[ONE:.+]] = spirv.Constant 1 : i32449// CHECK: %[[DIV:.+]] = spirv.SDiv %[[IDX]], %[[ONE]] : i32450// CHECK: %[[MOD:.+]] = spirv.SMod %[[IDX]], %[[ONE]] : i32451// CHECK: spirv.AccessChain %[[ADDR]][%{{.+}}, %[[DIV]], %[[MOD]]]452// CHECK: spirv.Load453// CHECK: spirv.Load454 455// -----456 457spirv.module Logical GLSL450 {458 spirv.GlobalVariable @var01_v2f2 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf32>, stride=16> [0])>, StorageBuffer>459 spirv.GlobalVariable @var01_i16 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i16, stride=2> [0])>, StorageBuffer>460 461 spirv.func @scalar_type_bitwidth_smaller_than_vector(%i0: i32) -> i16 "None" {462 %c0 = spirv.Constant 0 : i32463 464 %addr = spirv.mlir.addressof @var01_i16 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i16, stride=2> [0])>, StorageBuffer>465 %ac = spirv.AccessChain %addr[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<i16, stride=2> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<i16, StorageBuffer>466 %val = spirv.Load "StorageBuffer" %ac : i16467 468 spirv.ReturnValue %val : i16469 }470}471 472// CHECK-LABEL: spirv.module473 474// CHECK: spirv.GlobalVariable @var01_v2f2 bind(0, 1) {aliased}475// CHECK: spirv.GlobalVariable @var01_i16 bind(0, 1) {aliased}476 477// CHECK: spirv.func @scalar_type_bitwidth_smaller_than_vector478 479// -----480 481spirv.module Logical GLSL450 {482 spirv.GlobalVariable @var00_v4f32 bind(0, 0) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>483 spirv.GlobalVariable @var00_v4f16 bind(0, 0) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf16>, stride=8> [0])>, StorageBuffer>484 485 spirv.func @vector_type_same_size_different_element_type(%i0: i32) -> vector<4xf32> "None" {486 %c0 = spirv.Constant 0 : i32487 488 %addr = spirv.mlir.addressof @var00_v4f32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>489 %ac = spirv.AccessChain %addr[%c0, %i0] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf32>, stride=16> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<vector<4xf32>, StorageBuffer>490 %val = spirv.Load "StorageBuffer" %ac : vector<4xf32>491 492 spirv.ReturnValue %val : vector<4xf32>493 }494}495 496// CHECK-LABEL: spirv.module497 498// CHECK: spirv.GlobalVariable @var00_v4f16 bind(0, 0) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<4xf16>, stride=8> [0])>, StorageBuffer>499 500// CHECK: spirv.func @vector_type_same_size_different_element_type501 502// CHECK: %[[LD0:.+]] = spirv.Load "StorageBuffer" %{{.+}} : vector<4xf16>503// CHECK: %[[LD1:.+]] = spirv.Load "StorageBuffer" %{{.+}} : vector<4xf16>504// CHECK: %[[BC0:.+]] = spirv.Bitcast %[[LD0]] : vector<4xf16> to vector<2xf32>505// CHECK: %[[BC1:.+]] = spirv.Bitcast %[[LD1]] : vector<4xf16> to vector<2xf32>506// CHECK: %[[CC:.+]] = spirv.CompositeConstruct %[[BC0]], %[[BC1]] : (vector<2xf32>, vector<2xf32>) -> vector<4xf32>507// CHECK: spirv.ReturnValue %[[CC]]508 509// -----510 511spirv.module Logical GLSL450 {512 spirv.GlobalVariable @var01_v2f16 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf16>, stride=4> [0])>, StorageBuffer>513 spirv.GlobalVariable @var01_v2f32 bind(0, 1) {aliased} : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf32>, stride=8> [0])>, StorageBuffer>514 515 spirv.func @aliased(%index: i32) -> vector<3xf32> "None" {516 %c0 = spirv.Constant 0 : i32517 %v0 = spirv.Constant dense<0.0> : vector<3xf32>518 %addr0 = spirv.mlir.addressof @var01_v2f16 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf16>, stride=4> [0])>, StorageBuffer>519 %ac0 = spirv.AccessChain %addr0[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf16>, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<vector<2xf16>, StorageBuffer>520 %value0 = spirv.Load "StorageBuffer" %ac0 : vector<2xf16>521 522 %addr1 = spirv.mlir.addressof @var01_v2f32 : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf32>, stride=8> [0])>, StorageBuffer>523 %ac1 = spirv.AccessChain %addr1[%c0, %index] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf32>, stride=8> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<vector<2xf32>, StorageBuffer>524 %value1 = spirv.Load "StorageBuffer" %ac1 : vector<2xf32>525 526 %val0_as_f32 = spirv.Bitcast %value0 : vector<2xf16> to f32527 528 %res = spirv.CompositeConstruct %val0_as_f32, %value1 : (f32, vector<2xf32>) -> vector<3xf32>529 530 spirv.ReturnValue %res : vector<3xf32>531 }532}533 534// CHECK-LABEL: spirv.module535 536// CHECK: spirv.GlobalVariable @var01_v2f16 bind(0, 1) : !spirv.ptr<!spirv.struct<(!spirv.rtarray<vector<2xf16>, stride=4> [0])>, StorageBuffer>537// CHECK: spirv.func @aliased538 539// CHECK: %[[LD0:.+]] = spirv.Load "StorageBuffer" %{{.+}} : vector<2xf16>540// CHECK: %[[LD1:.+]] = spirv.Load "StorageBuffer" %{{.+}} : vector<2xf16>541// CHECK: %[[LD2:.+]] = spirv.Load "StorageBuffer" %{{.+}} : vector<2xf16>542 543// CHECK-DAG: %[[ELEM0:.+]] = spirv.Bitcast %[[LD0]] : vector<2xf16> to f32544// CHECK-DAG: %[[ELEM1:.+]] = spirv.Bitcast %[[LD1]] : vector<2xf16> to f32545// CHECK-DAG: %[[ELEM2:.+]] = spirv.Bitcast %[[LD2]] : vector<2xf16> to f32546 547// CHECK: %[[RES:.+]] = spirv.CompositeConstruct %[[ELEM0]], %{{.+}} : (f32, vector<2xf32>) -> vector<3xf32>548// CHECK: spirv.ReturnValue %[[RES]] : vector<3xf32>549 550// -----551 552// Make sure we do not crash on function arguments.553 554spirv.module Logical GLSL450 {555 spirv.func @main(%arg0: !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>) "None" {556 %cst0_i32 = spirv.Constant 0 : i32557 %0 = spirv.AccessChain %arg0[%cst0_i32, %cst0_i32] : !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>558 spirv.Return559 }560}561 562// CHECK-LABEL: spirv.module563// CHECK-LABEL: spirv.func @main564// CHECK-SAME: (%{{.+}}: !spirv.ptr<!spirv.struct<(!spirv.rtarray<f32, stride=4> [0])>, StorageBuffer>) "None"565// CHECK: spirv.Return566