brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · d476c24 Raw
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