brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · 8037222 Raw
230 lines · plain
1// RUN: mlir-opt -convert-spirv-to-llvm %s | FileCheck %s2 3//===----------------------------------------------------------------------===//4// spirv.AccessChain5//===----------------------------------------------------------------------===//6 7// CHECK-LABEL: @access_chain8spirv.func @access_chain() "None" {9  // CHECK: %[[ONE:.*]] = llvm.mlir.constant(1 : i32) : i3210  %0 = spirv.Constant 1: i3211  %1 = spirv.Variable : !spirv.ptr<!spirv.struct<(f32, !spirv.array<4xf32>)>, Function>12  // CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i3213  // CHECK: llvm.getelementptr %{{.*}}[%[[ZERO]], 1, %[[ONE]]] : (!llvm.ptr, i32, i32) -> !llvm.ptr, !llvm.struct<packed (f32, array<4 x f32>)>14  %2 = spirv.AccessChain %1[%0, %0] : !spirv.ptr<!spirv.struct<(f32, !spirv.array<4xf32>)>, Function>, i32, i32 -> !spirv.ptr<f32, Function>15  spirv.Return16}17 18// CHECK-LABEL: @access_chain_array19spirv.func @access_chain_array(%arg0 : i32) "None" {20  %0 = spirv.Variable : !spirv.ptr<!spirv.array<4x!spirv.array<4xf32>>, Function>21  // CHECK: %[[ZERO:.*]] = llvm.mlir.constant(0 : i32) : i3222  // CHECK: llvm.getelementptr %{{.*}}[%[[ZERO]], %{{.*}}] : (!llvm.ptr, i32, i32) -> !llvm.ptr, !llvm.array<4 x array<4 x f32>>23  %1 = spirv.AccessChain %0[%arg0] : !spirv.ptr<!spirv.array<4x!spirv.array<4xf32>>, Function>, i32 -> !spirv.ptr<!spirv.array<4xf32>, Function>24  %2 = spirv.Load "Function" %1 ["Volatile"] : !spirv.array<4xf32>25  spirv.Return26}27 28//===----------------------------------------------------------------------===//29// spirv.GlobalVariable and spirv.mlir.addressof30//===----------------------------------------------------------------------===//31 32spirv.module Logical GLSL450 {33  // CHECK: llvm.mlir.global external constant @var() {addr_space = 0 : i32} : f3234  spirv.GlobalVariable @var : !spirv.ptr<f32, Input>35}36 37spirv.module Logical GLSL450 {38  //       CHECK: llvm.mlir.global private @struct() {addr_space = 0 : i32} : !llvm.struct<packed (f32, array<10 x f32>)>39  // CHECK-LABEL: @func40  //       CHECK:   llvm.mlir.addressof @struct : !llvm.ptr41  spirv.GlobalVariable @struct : !spirv.ptr<!spirv.struct<(f32, !spirv.array<10xf32>)>, Private>42  spirv.func @func() "None" {43    %0 = spirv.mlir.addressof @struct : !spirv.ptr<!spirv.struct<(f32, !spirv.array<10xf32>)>, Private>44    spirv.Return45  }46}47 48spirv.module Logical GLSL450 {49  //       CHECK: llvm.mlir.global external @bar_descriptor_set0_binding0() {addr_space = 0 : i32} : i3250  // CHECK-LABEL: @foo51  //       CHECK:   llvm.mlir.addressof @bar_descriptor_set0_binding0 : !llvm.ptr52  spirv.GlobalVariable @bar bind(0, 0) : !spirv.ptr<i32, StorageBuffer>53  spirv.func @foo() "None" {54    %0 = spirv.mlir.addressof @bar : !spirv.ptr<i32, StorageBuffer>55    spirv.Return56  }57}58 59spirv.module @name Logical GLSL450 {60  //       CHECK: llvm.mlir.global external @name_bar_descriptor_set0_binding0() {addr_space = 0 : i32} : i3261  // CHECK-LABEL: @foo62  //       CHECK:   llvm.mlir.addressof @name_bar_descriptor_set0_binding0 : !llvm.ptr63  spirv.GlobalVariable @bar bind(0, 0) : !spirv.ptr<i32, StorageBuffer>64  spirv.func @foo() "None" {65    %0 = spirv.mlir.addressof @bar : !spirv.ptr<i32, StorageBuffer>66    spirv.Return67  }68}69 70spirv.module Logical GLSL450 {71  // CHECK: llvm.mlir.global external @bar() {addr_space = 0 : i32, location = 1 : i32} : i3272  // CHECK-LABEL: @foo73  spirv.GlobalVariable @bar {location = 1 : i32} : !spirv.ptr<i32, Output>74  spirv.func @foo() "None" {75    %0 = spirv.mlir.addressof @bar : !spirv.ptr<i32, Output>76    spirv.Return77  }78}79 80spirv.module Logical GLSL450 {81  // CHECK: llvm.mlir.global external constant @bar() {addr_space = 0 : i32, location = 3 : i32} : f3282  // CHECK-LABEL: @foo83  spirv.GlobalVariable @bar {descriptor_set = 0 : i32, location = 3 : i32} : !spirv.ptr<f32, UniformConstant>84  spirv.func @foo() "None" {85    %0 = spirv.mlir.addressof @bar : !spirv.ptr<f32, UniformConstant>86    spirv.Return87  }88}89 90//===----------------------------------------------------------------------===//91// spirv.Load92//===----------------------------------------------------------------------===//93 94// CHECK-LABEL: @load95spirv.func @load() "None" {96  %0 = spirv.Variable : !spirv.ptr<f32, Function>97  //  CHECK: llvm.load %{{.*}} : !llvm.ptr -> f3298  %1 = spirv.Load "Function" %0 : f3299  spirv.Return100}101 102// CHECK-LABEL: @load_none103spirv.func @load_none() "None" {104  %0 = spirv.Variable : !spirv.ptr<f32, Function>105  //  CHECK: llvm.load %{{.*}} : !llvm.ptr -> f32106  %1 = spirv.Load "Function" %0 ["None"] : f32107  spirv.Return108}109 110// CHECK-LABEL: @load_with_alignment111spirv.func @load_with_alignment() "None" {112  %0 = spirv.Variable : !spirv.ptr<f32, Function>113  // CHECK: llvm.load %{{.*}} {alignment = 4 : i64} : !llvm.ptr -> f32114  %1 = spirv.Load "Function" %0 ["Aligned", 4] : f32115  spirv.Return116}117 118// CHECK-LABEL: @load_volatile119spirv.func @load_volatile() "None" {120  %0 = spirv.Variable : !spirv.ptr<f32, Function>121  // CHECK: llvm.load volatile %{{.*}} : !llvm.ptr -> f32122  %1 = spirv.Load "Function" %0 ["Volatile"] : f32123  spirv.Return124}125 126// CHECK-LABEL: @load_nontemporal127spirv.func @load_nontemporal() "None" {128  %0 = spirv.Variable : !spirv.ptr<f32, Function>129  // CHECK: llvm.load %{{.*}} {nontemporal} : !llvm.ptr -> f32130  %1 = spirv.Load "Function" %0 ["Nontemporal"] : f32131  spirv.Return132}133 134//===----------------------------------------------------------------------===//135// spirv.Store136//===----------------------------------------------------------------------===//137 138// CHECK-LABEL: @store139spirv.func @store(%arg0 : f32) "None" {140  %0 = spirv.Variable : !spirv.ptr<f32, Function>141  // CHECK: llvm.store %{{.*}}, %{{.*}} : f32, !llvm.ptr142  spirv.Store "Function" %0, %arg0 : f32143  spirv.Return144}145 146// CHECK-LABEL: @store_composite147spirv.func @store_composite(%arg0 : !spirv.struct<(f64)>) "None" {148  %0 = spirv.Variable : !spirv.ptr<!spirv.struct<(f64)>, Function>149  // CHECK: llvm.store %{{.*}}, %{{.*}} : !llvm.struct<packed (f64)>, !llvm.ptr150  spirv.Store "Function" %0, %arg0 : !spirv.struct<(f64)>151  spirv.Return152}153 154// CHECK-LABEL: @store_with_alignment155spirv.func @store_with_alignment(%arg0 : f32) "None" {156  %0 = spirv.Variable : !spirv.ptr<f32, Function>157  // CHECK: llvm.store %{{.*}}, %{{.*}} {alignment = 4 : i64} : f32, !llvm.ptr158  spirv.Store "Function" %0, %arg0 ["Aligned", 4] : f32159  spirv.Return160}161 162// CHECK-LABEL: @store_volatile163spirv.func @store_volatile(%arg0 : f32) "None" {164  %0 = spirv.Variable : !spirv.ptr<f32, Function>165  // CHECK: llvm.store volatile %{{.*}}, %{{.*}} : f32, !llvm.ptr166  spirv.Store "Function" %0, %arg0 ["Volatile"] : f32167  spirv.Return168}169 170// CHECK-LABEL: @store_nontemporal171spirv.func @store_nontemporal(%arg0 : f32) "None" {172  %0 = spirv.Variable : !spirv.ptr<f32, Function>173  // CHECK: llvm.store %{{.*}}, %{{.*}} {nontemporal} : f32, !llvm.ptr174  spirv.Store "Function" %0, %arg0 ["Nontemporal"] : f32175  spirv.Return176}177 178//===----------------------------------------------------------------------===//179// spirv.Variable180//===----------------------------------------------------------------------===//181 182// CHECK-LABEL: @variable_scalar183spirv.func @variable_scalar() "None" {184  // CHECK: %[[SIZE1:.*]] = llvm.mlir.constant(1 : i32) : i32185  // CHECK: llvm.alloca %[[SIZE1]] x f32 : (i32) -> !llvm.ptr186  %0 = spirv.Variable : !spirv.ptr<f32, Function>187  // CHECK: %[[SIZE2:.*]] = llvm.mlir.constant(1 : i32) : i32188  // CHECK: llvm.alloca %[[SIZE2]] x i8 : (i32) -> !llvm.ptr189  %1 = spirv.Variable : !spirv.ptr<i8, Function>190  spirv.Return191}192 193// CHECK-LABEL: @variable_scalar_with_initialization194spirv.func @variable_scalar_with_initialization() "None" {195  // CHECK: %[[VALUE:.*]] = llvm.mlir.constant(0 : i64) : i64196  // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32197  // CHECK: %[[ALLOCATED:.*]] = llvm.alloca %[[SIZE]] x i64 : (i32) -> !llvm.ptr198  // CHECK: llvm.store %[[VALUE]], %[[ALLOCATED]] : i64, !llvm.ptr199  %c = spirv.Constant 0 : i64200  %0 = spirv.Variable init(%c) : !spirv.ptr<i64, Function>201  spirv.Return202}203 204// CHECK-LABEL: @variable_vector205spirv.func @variable_vector() "None" {206  // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32207  // CHECK: llvm.alloca  %[[SIZE]] x vector<3xf32> : (i32) -> !llvm.ptr208  %0 = spirv.Variable : !spirv.ptr<vector<3xf32>, Function>209  spirv.Return210}211 212// CHECK-LABEL: @variable_vector_with_initialization213spirv.func @variable_vector_with_initialization() "None" {214  // CHECK: %[[VALUE:.*]] = llvm.mlir.constant(dense<false> : vector<3xi1>) : vector<3xi1>215  // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32216  // CHECK: %[[ALLOCATED:.*]] = llvm.alloca %[[SIZE]] x vector<3xi1> : (i32) -> !llvm.ptr217  // CHECK: llvm.store %[[VALUE]], %[[ALLOCATED]] : vector<3xi1>, !llvm.ptr218  %c = spirv.Constant dense<false> : vector<3xi1>219  %0 = spirv.Variable init(%c) : !spirv.ptr<vector<3xi1>, Function>220  spirv.Return221}222 223// CHECK-LABEL: @variable_array224spirv.func @variable_array() "None" {225  // CHECK: %[[SIZE:.*]] = llvm.mlir.constant(1 : i32) : i32226  // CHECK: llvm.alloca %[[SIZE]] x !llvm.array<10 x i32> : (i32) -> !llvm.ptr227  %0 = spirv.Variable : !spirv.ptr<!spirv.array<10 x i32>, Function>228  spirv.Return229}230