151 lines · plain
1// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip -split-input-file %s | FileCheck %s2 3// RUN: %if spirv-tools %{ rm -rf %t %}4// RUN: %if spirv-tools %{ mkdir %t %}5// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %}6// RUN: %if spirv-tools %{ spirv-val %t %}7 8spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {9 // CHECK: spirv.SpecConstant @sc_true = true10 spirv.SpecConstant @sc_true = true11 // CHECK: spirv.SpecConstant @sc_false spec_id(1) = false12 spirv.SpecConstant @sc_false spec_id(1) = false13 14 // CHECK: spirv.SpecConstant @sc_int = -5 : i3215 spirv.SpecConstant @sc_int = -5 : i3216 17 // CHECK: spirv.SpecConstant @sc_float spec_id(5) = 1.000000e+00 : f3218 spirv.SpecConstant @sc_float spec_id(5) = 1. : f3219 20 // CHECK: spirv.SpecConstantComposite @scc (@sc_int, @sc_int) : !spirv.array<2 x i32>21 spirv.SpecConstantComposite @scc (@sc_int, @sc_int) : !spirv.array<2 x i32>22 23 // CHECK-LABEL: @use24 spirv.func @use() -> (i32) "None" {25 // We materialize a `spirv.mlir.referenceof` op at every use of a26 // specialization constant in the deserializer. So two ops here.27 // CHECK: %[[USE1:.*]] = spirv.mlir.referenceof @sc_int : i3228 // CHECK: %[[USE2:.*]] = spirv.mlir.referenceof @sc_int : i3229 // CHECK: spirv.IAdd %[[USE1]], %[[USE2]]30 31 %0 = spirv.mlir.referenceof @sc_int : i3232 %1 = spirv.IAdd %0, %0 : i3233 spirv.ReturnValue %1 : i3234 }35 36 // CHECK-LABEL: @use37 spirv.func @use_composite() -> (i32) "None" {38 // We materialize a `spirv.mlir.referenceof` op at every use of a39 // specialization constant in the deserializer. So two ops here.40 // CHECK: %[[USE1:.*]] = spirv.mlir.referenceof @scc : !spirv.array<2 x i32>41 // CHECK: %[[ITM0:.*]] = spirv.CompositeExtract %[[USE1]][0 : i32] : !spirv.array<2 x i32>42 // CHECK: %[[USE2:.*]] = spirv.mlir.referenceof @scc : !spirv.array<2 x i32>43 // CHECK: %[[ITM1:.*]] = spirv.CompositeExtract %[[USE2]][1 : i32] : !spirv.array<2 x i32>44 // CHECK: spirv.IAdd %[[ITM0]], %[[ITM1]]45 46 %0 = spirv.mlir.referenceof @scc : !spirv.array<2 x i32>47 %1 = spirv.CompositeExtract %0[0 : i32] : !spirv.array<2 x i32>48 %2 = spirv.CompositeExtract %0[1 : i32] : !spirv.array<2 x i32>49 %3 = spirv.IAdd %1, %2 : i3250 spirv.ReturnValue %3 : i3251 }52}53 54// -----55 56spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {57 58 spirv.SpecConstant @sc_f32_1 = 1.5 : f3259 spirv.SpecConstant @sc_f32_2 = 2.5 : f3260 spirv.SpecConstant @sc_f32_3 = 3.5 : f3261 62 spirv.SpecConstant @sc_i32_1 = 1 : i3263 64 // CHECK: spirv.SpecConstantComposite @scc_array (@sc_f32_1, @sc_f32_2, @sc_f32_3) : !spirv.array<3 x f32>65 spirv.SpecConstantComposite @scc_array (@sc_f32_1, @sc_f32_2, @sc_f32_3) : !spirv.array<3 x f32>66 67 // CHECK: spirv.SpecConstantComposite @scc_struct (@sc_i32_1, @sc_f32_2, @sc_f32_3) : !spirv.struct<(i32, f32, f32)>68 spirv.SpecConstantComposite @scc_struct (@sc_i32_1, @sc_f32_2, @sc_f32_3) : !spirv.struct<(i32, f32, f32)>69 70 // CHECK: spirv.SpecConstantComposite @scc_vector (@sc_f32_1, @sc_f32_2, @sc_f32_3) : vector<3xf32>71 spirv.SpecConstantComposite @scc_vector (@sc_f32_1, @sc_f32_2, @sc_f32_3) : vector<3 x f32>72}73 74// -----75 76spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {77 78 spirv.SpecConstant @sc_f32_1 = 1.5 : f3279 spirv.SpecConstant @sc_f32_2 = 2.5 : f3280 spirv.SpecConstant @sc_f32_3 = 3.5 : f3281 82 spirv.SpecConstant @sc_i32_1 = 1 : i3283 84 // CHECK: spirv.SpecConstantComposite @scc_array (@sc_f32_1, @sc_f32_2, @sc_f32_3) : !spirv.array<3 x f32>85 spirv.SpecConstantComposite @scc_array (@sc_f32_1, @sc_f32_2, @sc_f32_3) : !spirv.array<3 x f32>86 87 // CHECK: spirv.SpecConstantComposite @scc_struct (@sc_i32_1, @sc_f32_2, @sc_f32_3) : !spirv.struct<(i32, f32, f32)>88 spirv.SpecConstantComposite @scc_struct (@sc_i32_1, @sc_f32_2, @sc_f32_3) : !spirv.struct<(i32, f32, f32)>89 90 // CHECK: spirv.SpecConstantComposite @scc_vector (@sc_f32_1, @sc_f32_2, @sc_f32_3) : vector<3xf32>91 spirv.SpecConstantComposite @scc_vector (@sc_f32_1, @sc_f32_2, @sc_f32_3) : vector<3 x f32>92}93 94// -----95 96spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage, ReplicatedCompositesEXT], [SPV_EXT_replicated_composites]> {97 98 spirv.SpecConstant @sc_i32_1 = 1 : i3299 100 // CHECK: spirv.EXT.SpecConstantCompositeReplicate @scc_splat_array_of_i32 (@sc_i32_1) : !spirv.array<3 x i32>101 spirv.EXT.SpecConstantCompositeReplicate @scc_splat_array_of_i32 (@sc_i32_1) : !spirv.array<3 x i32>102 103 // CHECK: spirv.EXT.SpecConstantCompositeReplicate @scc_splat_struct_of_i32 (@sc_i32_1) : !spirv.struct<(i32, i32, i32)>104 spirv.EXT.SpecConstantCompositeReplicate @scc_splat_struct_of_i32 (@sc_i32_1) : !spirv.struct<(i32, i32, i32)>105 106 // CHECK: spirv.EXT.SpecConstantCompositeReplicate @scc_splat_vector_of_i32 (@sc_i32_1) : vector<3xi32>107 spirv.EXT.SpecConstantCompositeReplicate @scc_splat_vector_of_i32 (@sc_i32_1) : vector<3 x i32>108 109 spirv.SpecConstant @sc_f32_1 = 1.0 : f32110 111 // CHECK: spirv.EXT.SpecConstantCompositeReplicate @scc_splat_array_of_f32 (@sc_f32_1) : !spirv.array<3 x f32>112 spirv.EXT.SpecConstantCompositeReplicate @scc_splat_array_of_f32 (@sc_f32_1) : !spirv.array<3 x f32>113 114 // CHECK: spirv.EXT.SpecConstantCompositeReplicate @scc_splat_struct_of_f32 (@sc_f32_1) : !spirv.struct<(f32, f32, f32)>115 spirv.EXT.SpecConstantCompositeReplicate @scc_splat_struct_of_f32 (@sc_f32_1) : !spirv.struct<(f32, f32, f32)>116 117 // CHECK: spirv.EXT.SpecConstantCompositeReplicate @scc_splat_vector_of_f32 (@sc_f32_1) : vector<3xf32>118 spirv.EXT.SpecConstantCompositeReplicate @scc_splat_vector_of_f32 (@sc_f32_1) : vector<3 x f32>119}120 121// -----122 123spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {124 125 spirv.SpecConstant @sc_i32_1 = 1 : i32126 127 spirv.func @use_composite() -> (i32) "None" {128 // CHECK: [[USE1:%.*]] = spirv.mlir.referenceof @sc_i32_1 : i32129 // CHECK: [[USE2:%.*]] = spirv.Constant 0 : i32130 131 // CHECK: [[RES1:%.*]] = spirv.SpecConstantOperation wraps "spirv.ISub"([[USE1]], [[USE2]]) : (i32, i32) -> i32132 133 // CHECK: [[USE3:%.*]] = spirv.mlir.referenceof @sc_i32_1 : i32134 // CHECK: [[USE4:%.*]] = spirv.Constant 0 : i32135 136 // CHECK: [[RES2:%.*]] = spirv.SpecConstantOperation wraps "spirv.ISub"([[USE3]], [[USE4]]) : (i32, i32) -> i32137 138 %0 = spirv.mlir.referenceof @sc_i32_1 : i32139 %1 = spirv.Constant 0 : i32140 %2 = spirv.SpecConstantOperation wraps "spirv.ISub"(%0, %1) : (i32, i32) -> i32141 142 // CHECK: [[RES3:%.*]] = spirv.SpecConstantOperation wraps "spirv.IMul"([[RES1]], [[RES2]]) : (i32, i32) -> i32143 %3 = spirv.SpecConstantOperation wraps "spirv.IMul"(%2, %2) : (i32, i32) -> i32144 145 // Make sure deserialization continues from the right place after creating146 // the previous op.147 // CHECK: spirv.ReturnValue [[RES3]]148 spirv.ReturnValue %3 : i32149 }150}151