1fd4e5da5Sopenharmony_ci// Copyright (c) 2023 Google Inc. 2fd4e5da5Sopenharmony_ci// 3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License. 5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at 6fd4e5da5Sopenharmony_ci// 7fd4e5da5Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8fd4e5da5Sopenharmony_ci// 9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and 13fd4e5da5Sopenharmony_ci// limitations under the License. 14fd4e5da5Sopenharmony_ci 15fd4e5da5Sopenharmony_ci#include "spirv-tools/optimizer.hpp" 16fd4e5da5Sopenharmony_ci#include "test/opt/pass_fixture.h" 17fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h" 18fd4e5da5Sopenharmony_ci 19fd4e5da5Sopenharmony_cinamespace spvtools { 20fd4e5da5Sopenharmony_cinamespace opt { 21fd4e5da5Sopenharmony_cinamespace { 22fd4e5da5Sopenharmony_ci 23fd4e5da5Sopenharmony_ciusing TrimCapabilitiesPassTest = PassTest<::testing::Test>; 24fd4e5da5Sopenharmony_ci 25fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, CheckKnownAliasTransformations) { 26fd4e5da5Sopenharmony_ci // Those are expected changes caused by the test process: 27fd4e5da5Sopenharmony_ci // - SPV is assembled. -> capability goes from text to number. 28fd4e5da5Sopenharmony_ci // - SPV is optimized. 29fd4e5da5Sopenharmony_ci // - SPV is disassembled -> capability goes from number to text. 30fd4e5da5Sopenharmony_ci // - CHECK rule compares both text versions. 31fd4e5da5Sopenharmony_ci // Because some capabilities share the same number (aliases), the text 32fd4e5da5Sopenharmony_ci // compared with the CHECK rules depends on which alias is the first on the 33fd4e5da5Sopenharmony_ci // SPIRV-Headers enum. This could change, and we want to easily distinguish 34fd4e5da5Sopenharmony_ci // real failure from alias order change. This test is only here to list known 35fd4e5da5Sopenharmony_ci // alias transformations. If this test breaks, it's not a bug in the 36fd4e5da5Sopenharmony_ci // optimization pass, but just the SPIRV-Headers enum order that has changed. 37fd4e5da5Sopenharmony_ci // If that happens, tests needs to be updated to the correct alias is used in 38fd4e5da5Sopenharmony_ci // the CHECK rule. 39fd4e5da5Sopenharmony_ci const std::string kTest = R"( 40fd4e5da5Sopenharmony_ci OpCapability Linkage 41fd4e5da5Sopenharmony_ci OpCapability StorageUniform16 42fd4e5da5Sopenharmony_ci OpCapability StorageUniformBufferBlock16 43fd4e5da5Sopenharmony_ci OpCapability ShaderViewportIndexLayerNV 44fd4e5da5Sopenharmony_ci OpCapability FragmentBarycentricNV 45fd4e5da5Sopenharmony_ci OpCapability ShadingRateNV 46fd4e5da5Sopenharmony_ci OpCapability ShaderNonUniformEXT 47fd4e5da5Sopenharmony_ci OpCapability RuntimeDescriptorArrayEXT 48fd4e5da5Sopenharmony_ci OpCapability InputAttachmentArrayDynamicIndexingEXT 49fd4e5da5Sopenharmony_ci OpCapability UniformTexelBufferArrayDynamicIndexingEXT 50fd4e5da5Sopenharmony_ci OpCapability StorageTexelBufferArrayDynamicIndexingEXT 51fd4e5da5Sopenharmony_ci OpCapability UniformBufferArrayNonUniformIndexingEXT 52fd4e5da5Sopenharmony_ci OpCapability SampledImageArrayNonUniformIndexingEXT 53fd4e5da5Sopenharmony_ci OpCapability StorageBufferArrayNonUniformIndexingEXT 54fd4e5da5Sopenharmony_ci OpCapability StorageImageArrayNonUniformIndexingEXT 55fd4e5da5Sopenharmony_ci OpCapability InputAttachmentArrayNonUniformIndexingEXT 56fd4e5da5Sopenharmony_ci OpCapability UniformTexelBufferArrayNonUniformIndexingEXT 57fd4e5da5Sopenharmony_ci OpCapability StorageTexelBufferArrayNonUniformIndexingEXT 58fd4e5da5Sopenharmony_ci OpCapability VulkanMemoryModelKHR 59fd4e5da5Sopenharmony_ci OpCapability VulkanMemoryModelDeviceScopeKHR 60fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddressesEXT 61fd4e5da5Sopenharmony_ci OpCapability DemoteToHelperInvocationEXT 62fd4e5da5Sopenharmony_ci OpCapability DotProductInputAllKHR 63fd4e5da5Sopenharmony_ci OpCapability DotProductInput4x8BitKHR 64fd4e5da5Sopenharmony_ci OpCapability DotProductInput4x8BitPackedKHR 65fd4e5da5Sopenharmony_ci OpCapability DotProductKHR 66fd4e5da5Sopenharmony_ci OpCapability ComputeDerivativeGroupQuadsNV 67fd4e5da5Sopenharmony_ci OpCapability ComputeDerivativeGroupLinearNV 68fd4e5da5Sopenharmony_ci; CHECK: OpCapability Linkage 69fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageUniform16 70fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageUniformBufferBlock16 71fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ShaderViewportIndexLayerNV 72fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentBarycentricNV 73fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ShadingRateNV 74fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ShaderNonUniformEXT 75fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability RuntimeDescriptorArrayEXT 76fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability InputAttachmentArrayDynamicIndexingEXT 77fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability UniformTexelBufferArrayDynamicIndexingEXT 78fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageTexelBufferArrayDynamicIndexingEXT 79fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability UniformBufferArrayNonUniformIndexingEXT 80fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability SampledImageArrayNonUniformIndexingEXT 81fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageBufferArrayNonUniformIndexingEXT 82fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageImageArrayNonUniformIndexingEXT 83fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability InputAttachmentArrayNonUniformIndexingEXT 84fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability UniformTexelBufferArrayNonUniformIndexingEXT 85fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageTexelBufferArrayNonUniformIndexingEXT 86fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability VulkanMemoryModelKHR 87fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability VulkanMemoryModelDeviceScopeKHR 88fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability PhysicalStorageBufferAddressesEXT 89fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability DemoteToHelperInvocationEXT 90fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability DotProductInputAllKHR 91fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability DotProductInput4x8BitKHR 92fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability DotProductInput4x8BitPackedKHR 93fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability DotProductKHR 94fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ComputeDerivativeGroupQuadsNV 95fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ComputeDerivativeGroupLinearNV 96fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformAndStorageBuffer16BitAccess 97fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageBuffer16BitAccess 98fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderViewportIndexLayerEXT 99fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentBarycentricKHR 100fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentDensityEXT 101fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderNonUniform 102fd4e5da5Sopenharmony_ci; CHECK: OpCapability RuntimeDescriptorArray 103fd4e5da5Sopenharmony_ci; CHECK: OpCapability InputAttachmentArrayDynamicIndexing 104fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformTexelBufferArrayDynamicIndexing 105fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageTexelBufferArrayDynamicIndexing 106fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformBufferArrayNonUniformIndexing 107fd4e5da5Sopenharmony_ci; CHECK: OpCapability SampledImageArrayNonUniformIndexing 108fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageBufferArrayNonUniformIndexing 109fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageArrayNonUniformIndexing 110fd4e5da5Sopenharmony_ci; CHECK: OpCapability InputAttachmentArrayNonUniformIndexing 111fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformTexelBufferArrayNonUniformIndexing 112fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageTexelBufferArrayNonUniformIndexing 113fd4e5da5Sopenharmony_ci; CHECK: OpCapability VulkanMemoryModel 114fd4e5da5Sopenharmony_ci; CHECK: OpCapability VulkanMemoryModelDeviceScope 115fd4e5da5Sopenharmony_ci; CHECK: OpCapability PhysicalStorageBufferAddresses 116fd4e5da5Sopenharmony_ci; CHECK: OpCapability DemoteToHelperInvocation 117fd4e5da5Sopenharmony_ci; CHECK: OpCapability DotProductInputAll 118fd4e5da5Sopenharmony_ci; CHECK: OpCapability DotProductInput4x8Bit 119fd4e5da5Sopenharmony_ci; CHECK: OpCapability DotProductInput4x8BitPacked 120fd4e5da5Sopenharmony_ci; CHECK: OpCapability DotProduct 121fd4e5da5Sopenharmony_ci OpMemoryModel Logical Vulkan 122fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 123fd4e5da5Sopenharmony_ci %void = OpTypeVoid 124fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 125fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 126fd4e5da5Sopenharmony_ci %6 = OpLabel 127fd4e5da5Sopenharmony_ci OpReturn 128fd4e5da5Sopenharmony_ci OpFunctionEnd; 129fd4e5da5Sopenharmony_ci )"; 130fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_3); 131fd4e5da5Sopenharmony_ci const auto result = 132fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<EmptyPass>(kTest, /* skip_nop= */ false); 133fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 134fd4e5da5Sopenharmony_ci} 135fd4e5da5Sopenharmony_ci 136fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, LinkagePreventsChanges) { 137fd4e5da5Sopenharmony_ci const std::string kTest = R"( 138fd4e5da5Sopenharmony_ci OpCapability Linkage 139fd4e5da5Sopenharmony_ci OpCapability ClipDistance 140fd4e5da5Sopenharmony_ci OpCapability CullDistance 141fd4e5da5Sopenharmony_ci OpCapability DemoteToHelperInvocation 142fd4e5da5Sopenharmony_ci OpCapability DeviceGroup 143fd4e5da5Sopenharmony_ci OpCapability DrawParameters 144fd4e5da5Sopenharmony_ci OpCapability Float16 145fd4e5da5Sopenharmony_ci OpCapability Float64 146fd4e5da5Sopenharmony_ci OpCapability FragmentBarycentricKHR 147fd4e5da5Sopenharmony_ci OpCapability FragmentFullyCoveredEXT 148fd4e5da5Sopenharmony_ci OpCapability FragmentShadingRateKHR 149fd4e5da5Sopenharmony_ci OpCapability GroupNonUniform 150fd4e5da5Sopenharmony_ci OpCapability GroupNonUniformArithmetic 151fd4e5da5Sopenharmony_ci OpCapability GroupNonUniformBallot 152fd4e5da5Sopenharmony_ci OpCapability GroupNonUniformQuad 153fd4e5da5Sopenharmony_ci OpCapability GroupNonUniformShuffle 154fd4e5da5Sopenharmony_ci OpCapability Image1D 155fd4e5da5Sopenharmony_ci OpCapability ImageBuffer 156fd4e5da5Sopenharmony_ci OpCapability ImageGatherExtended 157fd4e5da5Sopenharmony_ci OpCapability ImageMSArray 158fd4e5da5Sopenharmony_ci OpCapability ImageQuery 159fd4e5da5Sopenharmony_ci OpCapability InputAttachment 160fd4e5da5Sopenharmony_ci OpCapability InputAttachmentArrayNonUniformIndexing 161fd4e5da5Sopenharmony_ci OpCapability Int16 162fd4e5da5Sopenharmony_ci OpCapability Int64 163fd4e5da5Sopenharmony_ci OpCapability Int64Atomics 164fd4e5da5Sopenharmony_ci OpCapability Int64ImageEXT 165fd4e5da5Sopenharmony_ci OpCapability MeshShadingNV 166fd4e5da5Sopenharmony_ci OpCapability MinLod 167fd4e5da5Sopenharmony_ci OpCapability MultiView 168fd4e5da5Sopenharmony_ci OpCapability MultiViewport 169fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddresses 170fd4e5da5Sopenharmony_ci OpCapability RayQueryKHR 171fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 172fd4e5da5Sopenharmony_ci OpCapability RayTracingNV 173fd4e5da5Sopenharmony_ci OpCapability RayTraversalPrimitiveCullingKHR 174fd4e5da5Sopenharmony_ci OpCapability RuntimeDescriptorArray 175fd4e5da5Sopenharmony_ci OpCapability SampleMaskPostDepthCoverage 176fd4e5da5Sopenharmony_ci OpCapability SampleRateShading 177fd4e5da5Sopenharmony_ci OpCapability Sampled1D 178fd4e5da5Sopenharmony_ci OpCapability SampledBuffer 179fd4e5da5Sopenharmony_ci OpCapability SampledImageArrayNonUniformIndexing 180fd4e5da5Sopenharmony_ci OpCapability Shader 181fd4e5da5Sopenharmony_ci OpCapability ShaderClockKHR 182fd4e5da5Sopenharmony_ci OpCapability ShaderLayer 183fd4e5da5Sopenharmony_ci OpCapability ShaderNonUniform 184fd4e5da5Sopenharmony_ci OpCapability ShaderViewportIndex 185fd4e5da5Sopenharmony_ci OpCapability ShaderViewportIndexLayerEXT 186fd4e5da5Sopenharmony_ci OpCapability SparseResidency 187fd4e5da5Sopenharmony_ci OpCapability StencilExportEXT 188fd4e5da5Sopenharmony_ci OpCapability StorageImageArrayNonUniformIndexingEXT 189fd4e5da5Sopenharmony_ci OpCapability StorageImageExtendedFormats 190fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 191fd4e5da5Sopenharmony_ci OpCapability StorageImageWriteWithoutFormat 192fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 193fd4e5da5Sopenharmony_ci OpCapability StoragePushConstant16 194fd4e5da5Sopenharmony_ci OpCapability StorageTexelBufferArrayNonUniformIndexing 195fd4e5da5Sopenharmony_ci OpCapability StorageUniform16 196fd4e5da5Sopenharmony_ci OpCapability StorageUniformBufferBlock16 197fd4e5da5Sopenharmony_ci OpCapability Tessellation 198fd4e5da5Sopenharmony_ci OpCapability UniformTexelBufferArrayNonUniformIndexing 199fd4e5da5Sopenharmony_ci OpCapability VulkanMemoryModel 200fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_fully_covered" 201fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_shader_image_int64" 202fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_shader_stencil_export" 203fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_shader_viewport_index_layer" 204fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_fragment_shader_barycentric" 205fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_fragment_shading_rate" 206fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_post_depth_coverage" 207fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_query" 208fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 209fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_shader_clock" 210fd4e5da5Sopenharmony_ci OpExtension "SPV_NV_mesh_shader" 211fd4e5da5Sopenharmony_ci OpExtension "SPV_NV_ray_tracing" 212fd4e5da5Sopenharmony_ci OpExtension "SPV_NV_viewport_array2" 213fd4e5da5Sopenharmony_ci; CHECK: OpCapability Linkage 214fd4e5da5Sopenharmony_ci; CHECK: OpCapability ClipDistance 215fd4e5da5Sopenharmony_ci; CHECK: OpCapability CullDistance 216fd4e5da5Sopenharmony_ci; CHECK: OpCapability DemoteToHelperInvocation 217fd4e5da5Sopenharmony_ci; CHECK: OpCapability DeviceGroup 218fd4e5da5Sopenharmony_ci; CHECK: OpCapability DrawParameters 219fd4e5da5Sopenharmony_ci; CHECK: OpCapability Float16 220fd4e5da5Sopenharmony_ci; CHECK: OpCapability Float64 221fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentBarycentricKHR 222fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentFullyCoveredEXT 223fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShadingRateKHR 224fd4e5da5Sopenharmony_ci; CHECK: OpCapability GroupNonUniform 225fd4e5da5Sopenharmony_ci; CHECK: OpCapability GroupNonUniformArithmetic 226fd4e5da5Sopenharmony_ci; CHECK: OpCapability GroupNonUniformBallot 227fd4e5da5Sopenharmony_ci; CHECK: OpCapability GroupNonUniformQuad 228fd4e5da5Sopenharmony_ci; CHECK: OpCapability GroupNonUniformShuffle 229fd4e5da5Sopenharmony_ci; CHECK: OpCapability Image1D 230fd4e5da5Sopenharmony_ci; CHECK: OpCapability ImageBuffer 231fd4e5da5Sopenharmony_ci; CHECK: OpCapability ImageGatherExtended 232fd4e5da5Sopenharmony_ci; CHECK: OpCapability ImageMSArray 233fd4e5da5Sopenharmony_ci; CHECK: OpCapability ImageQuery 234fd4e5da5Sopenharmony_ci; CHECK: OpCapability InputAttachment 235fd4e5da5Sopenharmony_ci; CHECK: OpCapability InputAttachmentArrayNonUniformIndexing 236fd4e5da5Sopenharmony_ci; CHECK: OpCapability Int16 237fd4e5da5Sopenharmony_ci; CHECK: OpCapability Int64 238fd4e5da5Sopenharmony_ci; CHECK: OpCapability Int64Atomics 239fd4e5da5Sopenharmony_ci; CHECK: OpCapability Int64ImageEXT 240fd4e5da5Sopenharmony_ci; CHECK: OpCapability MeshShadingNV 241fd4e5da5Sopenharmony_ci; CHECK: OpCapability MinLod 242fd4e5da5Sopenharmony_ci; CHECK: OpCapability MultiView 243fd4e5da5Sopenharmony_ci; CHECK: OpCapability MultiViewport 244fd4e5da5Sopenharmony_ci; CHECK: OpCapability PhysicalStorageBufferAddresses 245fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayQueryKHR 246fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 247fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingNV 248fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTraversalPrimitiveCullingKHR 249fd4e5da5Sopenharmony_ci; CHECK: OpCapability RuntimeDescriptorArray 250fd4e5da5Sopenharmony_ci; CHECK: OpCapability SampleMaskPostDepthCoverage 251fd4e5da5Sopenharmony_ci; CHECK: OpCapability SampleRateShading 252fd4e5da5Sopenharmony_ci; CHECK: OpCapability Sampled1D 253fd4e5da5Sopenharmony_ci; CHECK: OpCapability SampledBuffer 254fd4e5da5Sopenharmony_ci; CHECK: OpCapability SampledImageArrayNonUniformIndexing 255fd4e5da5Sopenharmony_ci; CHECK: OpCapability Shader 256fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderClockKHR 257fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderLayer 258fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderNonUniform 259fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderViewportIndex 260fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderViewportIndexLayerEXT 261fd4e5da5Sopenharmony_ci; CHECK: OpCapability SparseResidency 262fd4e5da5Sopenharmony_ci; CHECK: OpCapability StencilExportEXT 263fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageArrayNonUniformIndexing 264fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageExtendedFormats 265fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageReadWithoutFormat 266fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageWriteWithoutFormat 267fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 268fd4e5da5Sopenharmony_ci; CHECK: OpCapability StoragePushConstant16 269fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageTexelBufferArrayNonUniformIndexing 270fd4e5da5Sopenharmony_ci; CHECK: OpCapability Tessellation 271fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformTexelBufferArrayNonUniformIndex 272fd4e5da5Sopenharmony_ci; CHECK: OpCapability VulkanMemoryModel 273fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_fully_covered" 274fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_shader_image_int64" 275fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_shader_stencil_export" 276fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_shader_viewport_index_layer" 277fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_fragment_shader_barycentric" 278fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_fragment_shading_rate" 279fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_post_depth_coverage" 280fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_query" 281fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 282fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_shader_clock" 283fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_NV_mesh_shader" 284fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_NV_ray_tracing" 285fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_NV_viewport_array2" 286fd4e5da5Sopenharmony_ci OpMemoryModel Logical Vulkan 287fd4e5da5Sopenharmony_ci %void = OpTypeVoid 288fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 289fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 290fd4e5da5Sopenharmony_ci %6 = OpLabel 291fd4e5da5Sopenharmony_ci OpReturn 292fd4e5da5Sopenharmony_ci OpFunctionEnd; 293fd4e5da5Sopenharmony_ci )"; 294fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_3); 295fd4e5da5Sopenharmony_ci const auto result = 296fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 297fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 298fd4e5da5Sopenharmony_ci} 299fd4e5da5Sopenharmony_ci 300fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, KeepShader) { 301fd4e5da5Sopenharmony_ci const std::string kTest = R"( 302fd4e5da5Sopenharmony_ci OpCapability Shader 303fd4e5da5Sopenharmony_ci; CHECK: OpCapability Shader 304fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 305fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 306fd4e5da5Sopenharmony_ci %void = OpTypeVoid 307fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 308fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 309fd4e5da5Sopenharmony_ci %6 = OpLabel 310fd4e5da5Sopenharmony_ci OpReturn 311fd4e5da5Sopenharmony_ci OpFunctionEnd; 312fd4e5da5Sopenharmony_ci )"; 313fd4e5da5Sopenharmony_ci const auto result = 314fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 315fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 316fd4e5da5Sopenharmony_ci} 317fd4e5da5Sopenharmony_ci 318fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, KeepShaderClockWhenInUse) { 319fd4e5da5Sopenharmony_ci const std::string kTest = R"( 320fd4e5da5Sopenharmony_ci OpCapability Shader 321fd4e5da5Sopenharmony_ci OpCapability Int64 322fd4e5da5Sopenharmony_ci OpCapability ShaderClockKHR 323fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_shader_clock" 324fd4e5da5Sopenharmony_ci; CHECK: OpCapability ShaderClockKHR 325fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_shader_clock" 326fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 327fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 328fd4e5da5Sopenharmony_ci %void = OpTypeVoid 329fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 330fd4e5da5Sopenharmony_ci %ulong = OpTypeInt 64 0 331fd4e5da5Sopenharmony_ci %scope = OpConstant %uint 1 332fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 333fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 334fd4e5da5Sopenharmony_ci %6 = OpLabel 335fd4e5da5Sopenharmony_ci %7 = OpReadClockKHR %ulong %scope 336fd4e5da5Sopenharmony_ci OpReturn 337fd4e5da5Sopenharmony_ci OpFunctionEnd; 338fd4e5da5Sopenharmony_ci )"; 339fd4e5da5Sopenharmony_ci const auto result = 340fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 341fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 342fd4e5da5Sopenharmony_ci} 343fd4e5da5Sopenharmony_ci 344fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, TrimShaderClockWhenUnused) { 345fd4e5da5Sopenharmony_ci const std::string kTest = R"( 346fd4e5da5Sopenharmony_ci OpCapability Shader 347fd4e5da5Sopenharmony_ci OpCapability Int64 348fd4e5da5Sopenharmony_ci OpCapability ShaderClockKHR 349fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_shader_clock" 350fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ShaderClockKHR 351fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_shader_clock" 352fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 353fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 354fd4e5da5Sopenharmony_ci %void = OpTypeVoid 355fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 356fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 357fd4e5da5Sopenharmony_ci %6 = OpLabel 358fd4e5da5Sopenharmony_ci OpReturn 359fd4e5da5Sopenharmony_ci OpFunctionEnd; 360fd4e5da5Sopenharmony_ci )"; 361fd4e5da5Sopenharmony_ci const auto result = 362fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 363fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 364fd4e5da5Sopenharmony_ci} 365fd4e5da5Sopenharmony_ci 366fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, AMDShaderBallotExtensionRemains) { 367fd4e5da5Sopenharmony_ci const std::string kTest = R"( 368fd4e5da5Sopenharmony_ci OpCapability Shader 369fd4e5da5Sopenharmony_ci OpCapability Groups 370fd4e5da5Sopenharmony_ci OpExtension "SPV_AMD_shader_ballot" 371fd4e5da5Sopenharmony_ci; CHECK: OpCapability Groups 372fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_AMD_shader_ballot" 373fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 374fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 375fd4e5da5Sopenharmony_ci %void = OpTypeVoid 376fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 377fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 378fd4e5da5Sopenharmony_ci %uint_0 = OpConstant %uint 0 379fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 380fd4e5da5Sopenharmony_ci %3 = OpLabel 381fd4e5da5Sopenharmony_ci %4 = OpGroupIAddNonUniformAMD %uint %uint_0 ExclusiveScan %uint_0 382fd4e5da5Sopenharmony_ci OpReturn 383fd4e5da5Sopenharmony_ci OpFunctionEnd; 384fd4e5da5Sopenharmony_ci )"; 385fd4e5da5Sopenharmony_ci const auto result = 386fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 387fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 388fd4e5da5Sopenharmony_ci} 389fd4e5da5Sopenharmony_ci 390fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, AMDShaderBallotExtensionRemoved) { 391fd4e5da5Sopenharmony_ci const std::string kTest = R"( 392fd4e5da5Sopenharmony_ci OpCapability Shader 393fd4e5da5Sopenharmony_ci OpCapability Groups 394fd4e5da5Sopenharmony_ci OpExtension "SPV_AMD_shader_ballot" 395fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability Groups 396fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_AMD_shader_ballot" 397fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 398fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 399fd4e5da5Sopenharmony_ci %void = OpTypeVoid 400fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 401fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 402fd4e5da5Sopenharmony_ci %3 = OpLabel 403fd4e5da5Sopenharmony_ci OpReturn 404fd4e5da5Sopenharmony_ci OpFunctionEnd; 405fd4e5da5Sopenharmony_ci )"; 406fd4e5da5Sopenharmony_ci const auto result = 407fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 408fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 409fd4e5da5Sopenharmony_ci} 410fd4e5da5Sopenharmony_ci 411fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, MinLod_RemovedIfNotUsed) { 412fd4e5da5Sopenharmony_ci const std::string kTest = R"( 413fd4e5da5Sopenharmony_ci OpCapability Shader 414fd4e5da5Sopenharmony_ci OpCapability Sampled1D 415fd4e5da5Sopenharmony_ci OpCapability MinLod 416fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability MinLod 417fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 418fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 419fd4e5da5Sopenharmony_ci %void = OpTypeVoid 420fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 421fd4e5da5Sopenharmony_ci %v3float = OpTypeVector %float 3 422fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 423fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float Cube 2 0 0 1 Rgba32f 424fd4e5da5Sopenharmony_ci %ptr_type_image = OpTypePointer UniformConstant %type_image 425fd4e5da5Sopenharmony_ci %type_sampler = OpTypeSampler 426fd4e5da5Sopenharmony_ci %ptr_type_sampler = OpTypePointer UniformConstant %type_sampler 427fd4e5da5Sopenharmony_ci %float_0 = OpConstant %float 0 428fd4e5da5Sopenharmony_ci %float_000 = OpConstantComposite %v3float %float_0 %float_0 %float_0 429fd4e5da5Sopenharmony_ci %image = OpVariable %ptr_type_image UniformConstant 430fd4e5da5Sopenharmony_ci %sampler = OpVariable %ptr_type_sampler UniformConstant 431fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 432fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 433fd4e5da5Sopenharmony_ci %3 = OpLabel 434fd4e5da5Sopenharmony_ci %21 = OpLoad %type_image %image 435fd4e5da5Sopenharmony_ci %22 = OpLoad %type_sampler %sampler 436fd4e5da5Sopenharmony_ci %24 = OpSampledImage %type_sampled_image %21 %22 437fd4e5da5Sopenharmony_ci %25 = OpImageSampleImplicitLod %v4float %24 %float_000 438fd4e5da5Sopenharmony_ci OpReturn 439fd4e5da5Sopenharmony_ci OpFunctionEnd; 440fd4e5da5Sopenharmony_ci )"; 441fd4e5da5Sopenharmony_ci const auto result = 442fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 443fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 444fd4e5da5Sopenharmony_ci} 445fd4e5da5Sopenharmony_ci 446fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, MinLod_RemainsWithOpImageSampleImplicitLod) { 447fd4e5da5Sopenharmony_ci const std::string kTest = R"( 448fd4e5da5Sopenharmony_ci OpCapability Shader 449fd4e5da5Sopenharmony_ci OpCapability Sampled1D 450fd4e5da5Sopenharmony_ci OpCapability MinLod 451fd4e5da5Sopenharmony_ci; CHECK: OpCapability MinLod 452fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 453fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 454fd4e5da5Sopenharmony_ci %void = OpTypeVoid 455fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 456fd4e5da5Sopenharmony_ci %v3float = OpTypeVector %float 3 457fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 458fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float Cube 2 0 0 1 Rgba32f 459fd4e5da5Sopenharmony_ci %ptr_type_image = OpTypePointer UniformConstant %type_image 460fd4e5da5Sopenharmony_ci %type_sampler = OpTypeSampler 461fd4e5da5Sopenharmony_ci %ptr_type_sampler = OpTypePointer UniformConstant %type_sampler 462fd4e5da5Sopenharmony_ci %float_0 = OpConstant %float 0 463fd4e5da5Sopenharmony_ci %float_000 = OpConstantComposite %v3float %float_0 %float_0 %float_0 464fd4e5da5Sopenharmony_ci %image = OpVariable %ptr_type_image UniformConstant 465fd4e5da5Sopenharmony_ci %sampler = OpVariable %ptr_type_sampler UniformConstant 466fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 467fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 468fd4e5da5Sopenharmony_ci %3 = OpLabel 469fd4e5da5Sopenharmony_ci %21 = OpLoad %type_image %image 470fd4e5da5Sopenharmony_ci %22 = OpLoad %type_sampler %sampler 471fd4e5da5Sopenharmony_ci %24 = OpSampledImage %type_sampled_image %21 %22 472fd4e5da5Sopenharmony_ci %25 = OpImageSampleImplicitLod %v4float %24 %float_000 MinLod %float_0 473fd4e5da5Sopenharmony_ci OpReturn 474fd4e5da5Sopenharmony_ci OpFunctionEnd; 475fd4e5da5Sopenharmony_ci )"; 476fd4e5da5Sopenharmony_ci const auto result = 477fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 478fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 479fd4e5da5Sopenharmony_ci} 480fd4e5da5Sopenharmony_ci 481fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 482fd4e5da5Sopenharmony_ci MinLod_RemainsWithOpImageSparseSampleImplicitLod) { 483fd4e5da5Sopenharmony_ci const std::string kTest = R"( 484fd4e5da5Sopenharmony_ci OpCapability Shader 485fd4e5da5Sopenharmony_ci OpCapability SparseResidency 486fd4e5da5Sopenharmony_ci OpCapability ImageGatherExtended 487fd4e5da5Sopenharmony_ci OpCapability MinLod 488fd4e5da5Sopenharmony_ci; CHECK: OpCapability MinLod 489fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 490fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %2 "main" 491fd4e5da5Sopenharmony_ci OpExecutionMode %2 OriginUpperLeft 492fd4e5da5Sopenharmony_ci %void = OpTypeVoid 493fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 494fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 495fd4e5da5Sopenharmony_ci %v2float = OpTypeVector %float 2 496fd4e5da5Sopenharmony_ci %v3float = OpTypeVector %float 3 497fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 498fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float 2D 2 0 0 1 Unknown 499fd4e5da5Sopenharmony_ci %ptr_type_image = OpTypePointer UniformConstant %type_image 500fd4e5da5Sopenharmony_ci %type_sampler = OpTypeSampler 501fd4e5da5Sopenharmony_ci %ptr_type_sampler = OpTypePointer UniformConstant %type_sampler 502fd4e5da5Sopenharmony_ci%type_sampled_image = OpTypeSampledImage %type_image 503fd4e5da5Sopenharmony_ci %sparse_struct = OpTypeStruct %uint %v4float 504fd4e5da5Sopenharmony_ci %float_0 = OpConstant %float 0 505fd4e5da5Sopenharmony_ci %float_00 = OpConstantComposite %v2float %float_0 %float_0 506fd4e5da5Sopenharmony_ci %float_000 = OpConstantComposite %v3float %float_0 %float_0 %float_0 507fd4e5da5Sopenharmony_ci %image = OpVariable %ptr_type_image UniformConstant 508fd4e5da5Sopenharmony_ci %sampler = OpVariable %ptr_type_sampler UniformConstant 509fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 510fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 511fd4e5da5Sopenharmony_ci %3 = OpLabel 512fd4e5da5Sopenharmony_ci %21 = OpLoad %type_image %image 513fd4e5da5Sopenharmony_ci %22 = OpLoad %type_sampler %sampler 514fd4e5da5Sopenharmony_ci %24 = OpSampledImage %type_sampled_image %21 %22 515fd4e5da5Sopenharmony_ci %25 = OpImageSparseSampleImplicitLod %sparse_struct %24 %float_00 MinLod %float_0 516fd4e5da5Sopenharmony_ci OpReturn 517fd4e5da5Sopenharmony_ci OpFunctionEnd; 518fd4e5da5Sopenharmony_ci )"; 519fd4e5da5Sopenharmony_ci const auto result = 520fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 521fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 522fd4e5da5Sopenharmony_ci} 523fd4e5da5Sopenharmony_ci 524fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, MinLod_DetectsMinLodWithBitmaskImageOperand) { 525fd4e5da5Sopenharmony_ci const std::string kTest = R"( 526fd4e5da5Sopenharmony_ci OpCapability MinLod 527fd4e5da5Sopenharmony_ci; CHECK: OpCapability MinLod 528fd4e5da5Sopenharmony_ci OpCapability Shader 529fd4e5da5Sopenharmony_ci OpCapability SparseResidency 530fd4e5da5Sopenharmony_ci OpCapability ImageGatherExtended 531fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 532fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %1 "main" 533fd4e5da5Sopenharmony_ci OpExecutionMode %1 OriginUpperLeft 534fd4e5da5Sopenharmony_ci %type_sampler = OpTypeSampler 535fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 536fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 537fd4e5da5Sopenharmony_ci %v2int = OpTypeVector %int 2 538fd4e5da5Sopenharmony_ci %v2float = OpTypeVector %float 2 539fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 540fd4e5da5Sopenharmony_ci %ptr_sampler = OpTypePointer UniformConstant %type_sampler 541fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float 2D 2 0 0 1 Unknown 542fd4e5da5Sopenharmony_ci %ptr_image = OpTypePointer UniformConstant %type_image 543fd4e5da5Sopenharmony_ci %void = OpTypeVoid 544fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 545fd4e5da5Sopenharmony_ci %type_sampled_image = OpTypeSampledImage %type_image 546fd4e5da5Sopenharmony_ci %type_struct = OpTypeStruct %uint %v4float 547fd4e5da5Sopenharmony_ci 548fd4e5da5Sopenharmony_ci %int_1 = OpConstant %int 1 549fd4e5da5Sopenharmony_ci %float_0 = OpConstant %float 0 550fd4e5da5Sopenharmony_ci %float_1 = OpConstant %float 1 551fd4e5da5Sopenharmony_ci %8 = OpConstantComposite %v2float %float_0 %float_0 552fd4e5da5Sopenharmony_ci %12 = OpConstantComposite %v2int %int_1 %int_1 553fd4e5da5Sopenharmony_ci 554fd4e5da5Sopenharmony_ci %2 = OpVariable %ptr_sampler UniformConstant 555fd4e5da5Sopenharmony_ci %3 = OpVariable %ptr_image UniformConstant 556fd4e5da5Sopenharmony_ci %27 = OpTypeFunction %void 557fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %27 558fd4e5da5Sopenharmony_ci %28 = OpLabel 559fd4e5da5Sopenharmony_ci %29 = OpLoad %type_image %3 560fd4e5da5Sopenharmony_ci %30 = OpLoad %type_sampler %2 561fd4e5da5Sopenharmony_ci %31 = OpSampledImage %type_sampled_image %29 %30 562fd4e5da5Sopenharmony_ci %32 = OpImageSparseSampleImplicitLod %type_struct %31 %8 ConstOffset|MinLod %12 %float_0 563fd4e5da5Sopenharmony_ci OpReturn 564fd4e5da5Sopenharmony_ci OpFunctionEnd 565fd4e5da5Sopenharmony_ci )"; 566fd4e5da5Sopenharmony_ci const auto result = 567fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 568fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 569fd4e5da5Sopenharmony_ci} 570fd4e5da5Sopenharmony_ci 571fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 572fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointer_Vulkan1_0) { 573fd4e5da5Sopenharmony_ci const std::string kTest = R"( 574fd4e5da5Sopenharmony_ci OpCapability Shader 575fd4e5da5Sopenharmony_ci OpCapability Float16 576fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 577fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 578fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 579fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 580fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 581fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 582fd4e5da5Sopenharmony_ci %void = OpTypeVoid 583fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 584fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %half 585fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 586fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 587fd4e5da5Sopenharmony_ci %3 = OpLabel 588fd4e5da5Sopenharmony_ci OpReturn 589fd4e5da5Sopenharmony_ci OpFunctionEnd 590fd4e5da5Sopenharmony_ci )"; 591fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 592fd4e5da5Sopenharmony_ci const auto result = 593fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 594fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 595fd4e5da5Sopenharmony_ci} 596fd4e5da5Sopenharmony_ci 597fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 598fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointer_Vulkan1_1) { 599fd4e5da5Sopenharmony_ci const std::string kTest = R"( 600fd4e5da5Sopenharmony_ci OpCapability Shader 601fd4e5da5Sopenharmony_ci OpCapability Float16 602fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 603fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 604fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 605fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 606fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 607fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 608fd4e5da5Sopenharmony_ci %void = OpTypeVoid 609fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 610fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %half 611fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 612fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 613fd4e5da5Sopenharmony_ci %3 = OpLabel 614fd4e5da5Sopenharmony_ci OpReturn 615fd4e5da5Sopenharmony_ci OpFunctionEnd 616fd4e5da5Sopenharmony_ci )"; 617fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 618fd4e5da5Sopenharmony_ci const auto result = 619fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 620fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 621fd4e5da5Sopenharmony_ci} 622fd4e5da5Sopenharmony_ci 623fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 624fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerArray_Vulkan1_0) { 625fd4e5da5Sopenharmony_ci const std::string kTest = R"( 626fd4e5da5Sopenharmony_ci OpCapability Shader 627fd4e5da5Sopenharmony_ci OpCapability Float16 628fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 629fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 630fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 631fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 632fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 633fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 634fd4e5da5Sopenharmony_ci %void = OpTypeVoid 635fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 636fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 637fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %uint 1 638fd4e5da5Sopenharmony_ci %array = OpTypeArray %half %uint_1 639fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %array 640fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 641fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 642fd4e5da5Sopenharmony_ci %3 = OpLabel 643fd4e5da5Sopenharmony_ci OpReturn 644fd4e5da5Sopenharmony_ci OpFunctionEnd 645fd4e5da5Sopenharmony_ci )"; 646fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 647fd4e5da5Sopenharmony_ci const auto result = 648fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 649fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 650fd4e5da5Sopenharmony_ci} 651fd4e5da5Sopenharmony_ci 652fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 653fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerArray_Vulkan1_1) { 654fd4e5da5Sopenharmony_ci const std::string kTest = R"( 655fd4e5da5Sopenharmony_ci OpCapability Shader 656fd4e5da5Sopenharmony_ci OpCapability Float16 657fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 658fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 659fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 660fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 661fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 662fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 663fd4e5da5Sopenharmony_ci %void = OpTypeVoid 664fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 665fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 666fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %uint 1 667fd4e5da5Sopenharmony_ci %array = OpTypeArray %half %uint_1 668fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %array 669fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 670fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 671fd4e5da5Sopenharmony_ci %3 = OpLabel 672fd4e5da5Sopenharmony_ci OpReturn 673fd4e5da5Sopenharmony_ci OpFunctionEnd 674fd4e5da5Sopenharmony_ci )"; 675fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 676fd4e5da5Sopenharmony_ci const auto result = 677fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 678fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 679fd4e5da5Sopenharmony_ci} 680fd4e5da5Sopenharmony_ci 681fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 682fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerStruct_Vulkan1_0) { 683fd4e5da5Sopenharmony_ci const std::string kTest = R"( 684fd4e5da5Sopenharmony_ci OpCapability Shader 685fd4e5da5Sopenharmony_ci OpCapability Float16 686fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 687fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 688fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 689fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 690fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 691fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 692fd4e5da5Sopenharmony_ci %void = OpTypeVoid 693fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 694fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 695fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %struct 696fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 697fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 698fd4e5da5Sopenharmony_ci %3 = OpLabel 699fd4e5da5Sopenharmony_ci OpReturn 700fd4e5da5Sopenharmony_ci OpFunctionEnd 701fd4e5da5Sopenharmony_ci )"; 702fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 703fd4e5da5Sopenharmony_ci const auto result = 704fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 705fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 706fd4e5da5Sopenharmony_ci} 707fd4e5da5Sopenharmony_ci 708fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 709fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerStruct_Vulkan1_1) { 710fd4e5da5Sopenharmony_ci const std::string kTest = R"( 711fd4e5da5Sopenharmony_ci OpCapability Shader 712fd4e5da5Sopenharmony_ci OpCapability Float16 713fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 714fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 715fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 716fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 717fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 718fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 719fd4e5da5Sopenharmony_ci %void = OpTypeVoid 720fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 721fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 722fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %struct 723fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 724fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 725fd4e5da5Sopenharmony_ci %3 = OpLabel 726fd4e5da5Sopenharmony_ci OpReturn 727fd4e5da5Sopenharmony_ci OpFunctionEnd 728fd4e5da5Sopenharmony_ci )"; 729fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 730fd4e5da5Sopenharmony_ci const auto result = 731fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 732fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 733fd4e5da5Sopenharmony_ci} 734fd4e5da5Sopenharmony_ci 735fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 736fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerStructOfStruct_Vulkan1_0) { 737fd4e5da5Sopenharmony_ci const std::string kTest = R"( 738fd4e5da5Sopenharmony_ci OpCapability Shader 739fd4e5da5Sopenharmony_ci OpCapability Float16 740fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 741fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 742fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 743fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 744fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 745fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 746fd4e5da5Sopenharmony_ci %void = OpTypeVoid 747fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 748fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 749fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %float %half 750fd4e5da5Sopenharmony_ci %parent = OpTypeStruct %float %struct 751fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %parent 752fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 753fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 754fd4e5da5Sopenharmony_ci %3 = OpLabel 755fd4e5da5Sopenharmony_ci OpReturn 756fd4e5da5Sopenharmony_ci OpFunctionEnd 757fd4e5da5Sopenharmony_ci )"; 758fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 759fd4e5da5Sopenharmony_ci const auto result = 760fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 761fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 762fd4e5da5Sopenharmony_ci} 763fd4e5da5Sopenharmony_ci 764fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 765fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerStructOfStruct_Vulkan1_1) { 766fd4e5da5Sopenharmony_ci const std::string kTest = R"( 767fd4e5da5Sopenharmony_ci OpCapability Shader 768fd4e5da5Sopenharmony_ci OpCapability Float16 769fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 770fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 771fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 772fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 773fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 774fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 775fd4e5da5Sopenharmony_ci %void = OpTypeVoid 776fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 777fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 778fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %float %half 779fd4e5da5Sopenharmony_ci %parent = OpTypeStruct %float %struct 780fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %parent 781fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 782fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 783fd4e5da5Sopenharmony_ci %3 = OpLabel 784fd4e5da5Sopenharmony_ci OpReturn 785fd4e5da5Sopenharmony_ci OpFunctionEnd 786fd4e5da5Sopenharmony_ci )"; 787fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 788fd4e5da5Sopenharmony_ci const auto result = 789fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 790fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 791fd4e5da5Sopenharmony_ci} 792fd4e5da5Sopenharmony_ci 793fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 794fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerArrayOfStruct_Vulkan1_0) { 795fd4e5da5Sopenharmony_ci const std::string kTest = R"( 796fd4e5da5Sopenharmony_ci OpCapability Shader 797fd4e5da5Sopenharmony_ci OpCapability Float16 798fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 799fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 800fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 801fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 802fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 803fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 804fd4e5da5Sopenharmony_ci %void = OpTypeVoid 805fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 806fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 807fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 808fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %uint 1 809fd4e5da5Sopenharmony_ci %array = OpTypeArray %struct %uint_1 810fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %array 811fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 812fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 813fd4e5da5Sopenharmony_ci %3 = OpLabel 814fd4e5da5Sopenharmony_ci OpReturn 815fd4e5da5Sopenharmony_ci OpFunctionEnd 816fd4e5da5Sopenharmony_ci )"; 817fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 818fd4e5da5Sopenharmony_ci const auto result = 819fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 820fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 821fd4e5da5Sopenharmony_ci} 822fd4e5da5Sopenharmony_ci 823fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 824fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerArrayOfStruct_Vulkan1_1) { 825fd4e5da5Sopenharmony_ci const std::string kTest = R"( 826fd4e5da5Sopenharmony_ci OpCapability Shader 827fd4e5da5Sopenharmony_ci OpCapability Float16 828fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 829fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 830fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 831fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 832fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 833fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 834fd4e5da5Sopenharmony_ci %void = OpTypeVoid 835fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 836fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 837fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 838fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %uint 1 839fd4e5da5Sopenharmony_ci %array = OpTypeArray %struct %uint_1 840fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %array 841fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 842fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 843fd4e5da5Sopenharmony_ci %3 = OpLabel 844fd4e5da5Sopenharmony_ci OpReturn 845fd4e5da5Sopenharmony_ci OpFunctionEnd 846fd4e5da5Sopenharmony_ci )"; 847fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 848fd4e5da5Sopenharmony_ci const auto result = 849fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 850fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 851fd4e5da5Sopenharmony_ci} 852fd4e5da5Sopenharmony_ci 853fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 854fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerVector_Vulkan1_0) { 855fd4e5da5Sopenharmony_ci const std::string kTest = R"( 856fd4e5da5Sopenharmony_ci OpCapability Shader 857fd4e5da5Sopenharmony_ci OpCapability Float16 858fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 859fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 860fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 861fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 862fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 863fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 864fd4e5da5Sopenharmony_ci %void = OpTypeVoid 865fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 866fd4e5da5Sopenharmony_ci %vector = OpTypeVector %half 4 867fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %vector 868fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 869fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 870fd4e5da5Sopenharmony_ci %3 = OpLabel 871fd4e5da5Sopenharmony_ci OpReturn 872fd4e5da5Sopenharmony_ci OpFunctionEnd 873fd4e5da5Sopenharmony_ci )"; 874fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 875fd4e5da5Sopenharmony_ci const auto result = 876fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 877fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 878fd4e5da5Sopenharmony_ci} 879fd4e5da5Sopenharmony_ci 880fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 881fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerVector_Vulkan1_1) { 882fd4e5da5Sopenharmony_ci const std::string kTest = R"( 883fd4e5da5Sopenharmony_ci OpCapability Shader 884fd4e5da5Sopenharmony_ci OpCapability Float16 885fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 886fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 887fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 888fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 889fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 890fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 891fd4e5da5Sopenharmony_ci %void = OpTypeVoid 892fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 893fd4e5da5Sopenharmony_ci %vector = OpTypeVector %half 4 894fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %vector 895fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 896fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 897fd4e5da5Sopenharmony_ci %3 = OpLabel 898fd4e5da5Sopenharmony_ci OpReturn 899fd4e5da5Sopenharmony_ci OpFunctionEnd 900fd4e5da5Sopenharmony_ci )"; 901fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 902fd4e5da5Sopenharmony_ci const auto result = 903fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 904fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 905fd4e5da5Sopenharmony_ci} 906fd4e5da5Sopenharmony_ci 907fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 908fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerMatrix_Vulkan1_0) { 909fd4e5da5Sopenharmony_ci const std::string kTest = R"( 910fd4e5da5Sopenharmony_ci OpCapability Shader 911fd4e5da5Sopenharmony_ci OpCapability Float16 912fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 913fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 914fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 915fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 916fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 917fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 918fd4e5da5Sopenharmony_ci %void = OpTypeVoid 919fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 920fd4e5da5Sopenharmony_ci %vector = OpTypeVector %half 4 921fd4e5da5Sopenharmony_ci %matrix = OpTypeMatrix %vector 4 922fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %matrix 923fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 924fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 925fd4e5da5Sopenharmony_ci %3 = OpLabel 926fd4e5da5Sopenharmony_ci OpReturn 927fd4e5da5Sopenharmony_ci OpFunctionEnd 928fd4e5da5Sopenharmony_ci )"; 929fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 930fd4e5da5Sopenharmony_ci const auto result = 931fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 932fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 933fd4e5da5Sopenharmony_ci} 934fd4e5da5Sopenharmony_ci 935fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 936fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithInputPointerMatrix_Vulkan1_1) { 937fd4e5da5Sopenharmony_ci const std::string kTest = R"( 938fd4e5da5Sopenharmony_ci OpCapability Shader 939fd4e5da5Sopenharmony_ci OpCapability Float16 940fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 941fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 942fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 943fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 944fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 945fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 946fd4e5da5Sopenharmony_ci %void = OpTypeVoid 947fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 948fd4e5da5Sopenharmony_ci %vector = OpTypeVector %half 4 949fd4e5da5Sopenharmony_ci %matrix = OpTypeMatrix %vector 4 950fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Input %matrix 951fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 952fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 953fd4e5da5Sopenharmony_ci %3 = OpLabel 954fd4e5da5Sopenharmony_ci OpReturn 955fd4e5da5Sopenharmony_ci OpFunctionEnd 956fd4e5da5Sopenharmony_ci )"; 957fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 958fd4e5da5Sopenharmony_ci const auto result = 959fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 960fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 961fd4e5da5Sopenharmony_ci} 962fd4e5da5Sopenharmony_ci 963fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 964fd4e5da5Sopenharmony_ci StorageInputOutput16_IsRemovedWithoutInputPointer) { 965fd4e5da5Sopenharmony_ci const std::string kTest = R"( 966fd4e5da5Sopenharmony_ci OpCapability Shader 967fd4e5da5Sopenharmony_ci OpCapability Float16 968fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 969fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 970fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageInputOutput16 971fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 972fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 973fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 974fd4e5da5Sopenharmony_ci %void = OpTypeVoid 975fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 976fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 977fd4e5da5Sopenharmony_ci %3 = OpLabel 978fd4e5da5Sopenharmony_ci OpReturn 979fd4e5da5Sopenharmony_ci OpFunctionEnd 980fd4e5da5Sopenharmony_ci )"; 981fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 982fd4e5da5Sopenharmony_ci const auto result = 983fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 984fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 985fd4e5da5Sopenharmony_ci} 986fd4e5da5Sopenharmony_ci 987fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 988fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithOutputPointer_Vulkan1_0) { 989fd4e5da5Sopenharmony_ci const std::string kTest = R"( 990fd4e5da5Sopenharmony_ci OpCapability Shader 991fd4e5da5Sopenharmony_ci OpCapability Float16 992fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 993fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 994fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 995fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 996fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 997fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 998fd4e5da5Sopenharmony_ci %void = OpTypeVoid 999fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1000fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Output %half 1001fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1002fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1003fd4e5da5Sopenharmony_ci %3 = OpLabel 1004fd4e5da5Sopenharmony_ci OpReturn 1005fd4e5da5Sopenharmony_ci OpFunctionEnd 1006fd4e5da5Sopenharmony_ci )"; 1007fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 1008fd4e5da5Sopenharmony_ci const auto result = 1009fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1010fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1011fd4e5da5Sopenharmony_ci} 1012fd4e5da5Sopenharmony_ci 1013fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1014fd4e5da5Sopenharmony_ci StorageInputOutput16_RemainsWithOutputPointer_Vulkan1_1) { 1015fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1016fd4e5da5Sopenharmony_ci OpCapability Shader 1017fd4e5da5Sopenharmony_ci OpCapability Float16 1018fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 1019fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1020fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageInputOutput16 1021fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1022fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1023fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1024fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1025fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1026fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Output %half 1027fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1028fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1029fd4e5da5Sopenharmony_ci %3 = OpLabel 1030fd4e5da5Sopenharmony_ci OpReturn 1031fd4e5da5Sopenharmony_ci OpFunctionEnd 1032fd4e5da5Sopenharmony_ci )"; 1033fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 1034fd4e5da5Sopenharmony_ci const auto result = 1035fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1036fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1037fd4e5da5Sopenharmony_ci} 1038fd4e5da5Sopenharmony_ci 1039fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1040fd4e5da5Sopenharmony_ci StorageInputOutput16_RemovedWithoutOutputPointer) { 1041fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1042fd4e5da5Sopenharmony_ci OpCapability Shader 1043fd4e5da5Sopenharmony_ci OpCapability Float16 1044fd4e5da5Sopenharmony_ci OpCapability StorageInputOutput16 1045fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1046fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageInputOutput16 1047fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1048fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1049fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1050fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1051fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1052fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1053fd4e5da5Sopenharmony_ci %3 = OpLabel 1054fd4e5da5Sopenharmony_ci OpReturn 1055fd4e5da5Sopenharmony_ci OpFunctionEnd 1056fd4e5da5Sopenharmony_ci )"; 1057fd4e5da5Sopenharmony_ci const auto result = 1058fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1059fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1060fd4e5da5Sopenharmony_ci} 1061fd4e5da5Sopenharmony_ci 1062fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1063fd4e5da5Sopenharmony_ci StoragePushConstant16_RemainsSimplePointer_Vulkan1_0) { 1064fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1065fd4e5da5Sopenharmony_ci OpCapability Shader 1066fd4e5da5Sopenharmony_ci OpCapability Float16 1067fd4e5da5Sopenharmony_ci OpCapability StoragePushConstant16 1068fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1069fd4e5da5Sopenharmony_ci; CHECK: OpCapability StoragePushConstant16 1070fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 1071fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1072fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1073fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1074fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1075fd4e5da5Sopenharmony_ci %ptr = OpTypePointer PushConstant %half 1076fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1077fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1078fd4e5da5Sopenharmony_ci %3 = OpLabel 1079fd4e5da5Sopenharmony_ci OpReturn 1080fd4e5da5Sopenharmony_ci OpFunctionEnd 1081fd4e5da5Sopenharmony_ci )"; 1082fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 1083fd4e5da5Sopenharmony_ci const auto result = 1084fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1085fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1086fd4e5da5Sopenharmony_ci} 1087fd4e5da5Sopenharmony_ci 1088fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1089fd4e5da5Sopenharmony_ci StoragePushConstant16_RemainsSimplePointer_Vulkan1_1) { 1090fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1091fd4e5da5Sopenharmony_ci OpCapability Shader 1092fd4e5da5Sopenharmony_ci OpCapability Float16 1093fd4e5da5Sopenharmony_ci OpCapability StoragePushConstant16 1094fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1095fd4e5da5Sopenharmony_ci; CHECK: OpCapability StoragePushConstant16 1096fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1097fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1098fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1099fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1100fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1101fd4e5da5Sopenharmony_ci %ptr = OpTypePointer PushConstant %half 1102fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1103fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1104fd4e5da5Sopenharmony_ci %3 = OpLabel 1105fd4e5da5Sopenharmony_ci OpReturn 1106fd4e5da5Sopenharmony_ci OpFunctionEnd 1107fd4e5da5Sopenharmony_ci )"; 1108fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 1109fd4e5da5Sopenharmony_ci const auto result = 1110fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1111fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1112fd4e5da5Sopenharmony_ci} 1113fd4e5da5Sopenharmony_ci 1114fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, StoragePushConstant16_RemovedSimplePointer) { 1115fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1116fd4e5da5Sopenharmony_ci OpCapability Shader 1117fd4e5da5Sopenharmony_ci OpCapability Float16 1118fd4e5da5Sopenharmony_ci OpCapability StoragePushConstant16 1119fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1120fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StoragePushConstant16 1121fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1122fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1123fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1124fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1125fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1126fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Function %half 1127fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1128fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1129fd4e5da5Sopenharmony_ci %3 = OpLabel 1130fd4e5da5Sopenharmony_ci OpReturn 1131fd4e5da5Sopenharmony_ci OpFunctionEnd 1132fd4e5da5Sopenharmony_ci )"; 1133fd4e5da5Sopenharmony_ci const auto result = 1134fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1135fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1136fd4e5da5Sopenharmony_ci} 1137fd4e5da5Sopenharmony_ci 1138fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1139fd4e5da5Sopenharmony_ci StorageUniformBufferBlock16_RemainsSimplePointer_Vulkan1_0) { 1140fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1141fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1142fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1143fd4e5da5Sopenharmony_ci 1144fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1145fd4e5da5Sopenharmony_ci OpCapability Shader 1146fd4e5da5Sopenharmony_ci OpCapability Float16 1147fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1148fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1149fd4e5da5Sopenharmony_ci 1150fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageBuffer16BitAccess 1151fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1152fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 1153fd4e5da5Sopenharmony_ci 1154fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1155fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1156fd4e5da5Sopenharmony_ci OpDecorate %struct BufferBlock 1157fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1158fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1159fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1160fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Uniform %struct 1161fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1162fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1163fd4e5da5Sopenharmony_ci %3 = OpLabel 1164fd4e5da5Sopenharmony_ci OpReturn 1165fd4e5da5Sopenharmony_ci OpFunctionEnd 1166fd4e5da5Sopenharmony_ci )"; 1167fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 1168fd4e5da5Sopenharmony_ci const auto result = 1169fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1170fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1171fd4e5da5Sopenharmony_ci} 1172fd4e5da5Sopenharmony_ci 1173fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1174fd4e5da5Sopenharmony_ci StorageUniformBufferBlock16_RemainsSimplePointer_Vulkan1_1) { 1175fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1176fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1177fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1178fd4e5da5Sopenharmony_ci 1179fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1180fd4e5da5Sopenharmony_ci OpCapability Shader 1181fd4e5da5Sopenharmony_ci OpCapability Float16 1182fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1183fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1184fd4e5da5Sopenharmony_ci 1185fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageBuffer16BitAccess 1186fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1187fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1188fd4e5da5Sopenharmony_ci 1189fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1190fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1191fd4e5da5Sopenharmony_ci OpDecorate %struct BufferBlock 1192fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1193fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1194fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1195fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Uniform %struct 1196fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1197fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1198fd4e5da5Sopenharmony_ci %3 = OpLabel 1199fd4e5da5Sopenharmony_ci OpReturn 1200fd4e5da5Sopenharmony_ci OpFunctionEnd 1201fd4e5da5Sopenharmony_ci )"; 1202fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 1203fd4e5da5Sopenharmony_ci const auto result = 1204fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1205fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1206fd4e5da5Sopenharmony_ci} 1207fd4e5da5Sopenharmony_ci 1208fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1209fd4e5da5Sopenharmony_ci StorageUniformBufferBlock16_RemovedSimplePointer) { 1210fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1211fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1212fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1213fd4e5da5Sopenharmony_ci 1214fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1215fd4e5da5Sopenharmony_ci OpCapability Shader 1216fd4e5da5Sopenharmony_ci OpCapability Float16 1217fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1218fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1219fd4e5da5Sopenharmony_ci 1220fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageBuffer16BitAccess 1221fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1222fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1223fd4e5da5Sopenharmony_ci 1224fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1225fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1226fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1227fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1228fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1229fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Function %struct 1230fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1231fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1232fd4e5da5Sopenharmony_ci %3 = OpLabel 1233fd4e5da5Sopenharmony_ci OpReturn 1234fd4e5da5Sopenharmony_ci OpFunctionEnd 1235fd4e5da5Sopenharmony_ci )"; 1236fd4e5da5Sopenharmony_ci const auto result = 1237fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1238fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1239fd4e5da5Sopenharmony_ci} 1240fd4e5da5Sopenharmony_ci 1241fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1242fd4e5da5Sopenharmony_ci StorageUniform16_RemovedWithBufferBlockPointer_Vulkan1_0) { 1243fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1244fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1245fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1246fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniform16 == 1247fd4e5da5Sopenharmony_ci spv::Capability::UniformAndStorageBuffer16BitAccess); 1248fd4e5da5Sopenharmony_ci 1249fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1250fd4e5da5Sopenharmony_ci OpCapability Shader 1251fd4e5da5Sopenharmony_ci OpCapability Float16 1252fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1253fd4e5da5Sopenharmony_ci OpCapability UniformAndStorageBuffer16BitAccess 1254fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1255fd4e5da5Sopenharmony_ci 1256fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageBuffer16BitAccess 1257fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1258fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability UniformAndStorageBuffer16BitAccess 1259fd4e5da5Sopenharmony_ci; `-> StorageUniform16 1260fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 1261fd4e5da5Sopenharmony_ci 1262fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1263fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1264fd4e5da5Sopenharmony_ci OpDecorate %struct BufferBlock 1265fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1266fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1267fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1268fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Uniform %struct 1269fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1270fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1271fd4e5da5Sopenharmony_ci %3 = OpLabel 1272fd4e5da5Sopenharmony_ci OpReturn 1273fd4e5da5Sopenharmony_ci OpFunctionEnd 1274fd4e5da5Sopenharmony_ci )"; 1275fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 1276fd4e5da5Sopenharmony_ci const auto result = 1277fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1278fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1279fd4e5da5Sopenharmony_ci} 1280fd4e5da5Sopenharmony_ci 1281fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1282fd4e5da5Sopenharmony_ci StorageUniform16_RemovedWithBufferBlockPointer_Vulkan1_1) { 1283fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1284fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1285fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1286fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniform16 == 1287fd4e5da5Sopenharmony_ci spv::Capability::UniformAndStorageBuffer16BitAccess); 1288fd4e5da5Sopenharmony_ci 1289fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1290fd4e5da5Sopenharmony_ci OpCapability Shader 1291fd4e5da5Sopenharmony_ci OpCapability Float16 1292fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1293fd4e5da5Sopenharmony_ci OpCapability UniformAndStorageBuffer16BitAccess 1294fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1295fd4e5da5Sopenharmony_ci 1296fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageBuffer16BitAccess 1297fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1298fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability UniformAndStorageBuffer16BitAccess 1299fd4e5da5Sopenharmony_ci; `-> StorageUniform16 1300fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1301fd4e5da5Sopenharmony_ci 1302fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1303fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1304fd4e5da5Sopenharmony_ci OpDecorate %struct BufferBlock 1305fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1306fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1307fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1308fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Uniform %struct 1309fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1310fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1311fd4e5da5Sopenharmony_ci %3 = OpLabel 1312fd4e5da5Sopenharmony_ci OpReturn 1313fd4e5da5Sopenharmony_ci OpFunctionEnd 1314fd4e5da5Sopenharmony_ci )"; 1315fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 1316fd4e5da5Sopenharmony_ci const auto result = 1317fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1318fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1319fd4e5da5Sopenharmony_ci} 1320fd4e5da5Sopenharmony_ci 1321fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1322fd4e5da5Sopenharmony_ci StorageUniform16_RemovedWithNonBlockUniformPointer_Vulkan1_0) { 1323fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1324fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1325fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1326fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniform16 == 1327fd4e5da5Sopenharmony_ci spv::Capability::UniformAndStorageBuffer16BitAccess); 1328fd4e5da5Sopenharmony_ci 1329fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1330fd4e5da5Sopenharmony_ci OpCapability Shader 1331fd4e5da5Sopenharmony_ci OpCapability Float16 1332fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1333fd4e5da5Sopenharmony_ci OpCapability UniformAndStorageBuffer16BitAccess 1334fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1335fd4e5da5Sopenharmony_ci 1336fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageBuffer16BitAccess 1337fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1338fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformAndStorageBuffer16BitAccess 1339fd4e5da5Sopenharmony_ci; `-> StorageUniform16 1340fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_16bit_storage" 1341fd4e5da5Sopenharmony_ci 1342fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1343fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1344fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1345fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1346fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1347fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Uniform %struct 1348fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1349fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1350fd4e5da5Sopenharmony_ci %3 = OpLabel 1351fd4e5da5Sopenharmony_ci OpReturn 1352fd4e5da5Sopenharmony_ci OpFunctionEnd 1353fd4e5da5Sopenharmony_ci )"; 1354fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_0); 1355fd4e5da5Sopenharmony_ci const auto result = 1356fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1357fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1358fd4e5da5Sopenharmony_ci} 1359fd4e5da5Sopenharmony_ci 1360fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1361fd4e5da5Sopenharmony_ci StorageUniform16_RemovedWithNonBlockUniformPointer_Vulkan1_1) { 1362fd4e5da5Sopenharmony_ci // See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354 1363fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniformBufferBlock16 == 1364fd4e5da5Sopenharmony_ci spv::Capability::StorageBuffer16BitAccess); 1365fd4e5da5Sopenharmony_ci static_assert(spv::Capability::StorageUniform16 == 1366fd4e5da5Sopenharmony_ci spv::Capability::UniformAndStorageBuffer16BitAccess); 1367fd4e5da5Sopenharmony_ci 1368fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1369fd4e5da5Sopenharmony_ci OpCapability Shader 1370fd4e5da5Sopenharmony_ci OpCapability Float16 1371fd4e5da5Sopenharmony_ci OpCapability StorageBuffer16BitAccess 1372fd4e5da5Sopenharmony_ci OpCapability UniformAndStorageBuffer16BitAccess 1373fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_16bit_storage" 1374fd4e5da5Sopenharmony_ci 1375fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageBuffer16BitAccess 1376fd4e5da5Sopenharmony_ci; `-> StorageUniformBufferBlock16 1377fd4e5da5Sopenharmony_ci; CHECK: OpCapability UniformAndStorageBuffer16BitAccess 1378fd4e5da5Sopenharmony_ci; `-> StorageUniform16 1379fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_16bit_storage" 1380fd4e5da5Sopenharmony_ci 1381fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1382fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %2 "main" 1383fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1384fd4e5da5Sopenharmony_ci %half = OpTypeFloat 16 1385fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %half 1386fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Uniform %struct 1387fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1388fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1389fd4e5da5Sopenharmony_ci %3 = OpLabel 1390fd4e5da5Sopenharmony_ci OpReturn 1391fd4e5da5Sopenharmony_ci OpFunctionEnd 1392fd4e5da5Sopenharmony_ci )"; 1393fd4e5da5Sopenharmony_ci SetTargetEnv(SPV_ENV_VULKAN_1_1); 1394fd4e5da5Sopenharmony_ci const auto result = 1395fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1396fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1397fd4e5da5Sopenharmony_ci} 1398fd4e5da5Sopenharmony_ci 1399fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, FragmentShaderInterlock_RemovedIfNotUsed) { 1400fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1401fd4e5da5Sopenharmony_ci OpCapability Shader 1402fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1403fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1404fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1405fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1406fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderPixelInterlockEXT 1407fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderSampleInterlockEXT 1408fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderShadingRateInterlockEXT 1409fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_EXT_fragment_shader_interlock" 1410fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1411fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1412fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1413fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1414fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1415fd4e5da5Sopenharmony_ci %3 = OpLabel 1416fd4e5da5Sopenharmony_ci OpReturn 1417fd4e5da5Sopenharmony_ci OpFunctionEnd; 1418fd4e5da5Sopenharmony_ci )"; 1419fd4e5da5Sopenharmony_ci const auto result = 1420fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1421fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1422fd4e5da5Sopenharmony_ci} 1423fd4e5da5Sopenharmony_ci 1424fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1425fd4e5da5Sopenharmony_ci FragmentShaderPixelInterlock_RemainsWhenOrderedIsUsed) { 1426fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1427fd4e5da5Sopenharmony_ci OpCapability Shader 1428fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1429fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1430fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1431fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1432fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShaderPixelInterlockEXT 1433fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderSampleInterlockEXT 1434fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderShadingRateInterlockEXT 1435fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_shader_interlock" 1436fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1437fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1438fd4e5da5Sopenharmony_ci OpExecutionMode %main PixelInterlockOrderedEXT 1439fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1440fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1441fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1442fd4e5da5Sopenharmony_ci %3 = OpLabel 1443fd4e5da5Sopenharmony_ci OpBeginInvocationInterlockEXT 1444fd4e5da5Sopenharmony_ci OpEndInvocationInterlockEXT 1445fd4e5da5Sopenharmony_ci OpReturn 1446fd4e5da5Sopenharmony_ci OpFunctionEnd; 1447fd4e5da5Sopenharmony_ci )"; 1448fd4e5da5Sopenharmony_ci const auto result = 1449fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1450fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1451fd4e5da5Sopenharmony_ci} 1452fd4e5da5Sopenharmony_ci 1453fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1454fd4e5da5Sopenharmony_ci FragmentShaderPixelInterlock_RemainsWhenUnorderedIsUsed) { 1455fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1456fd4e5da5Sopenharmony_ci OpCapability Shader 1457fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1458fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1459fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1460fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1461fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShaderPixelInterlockEXT 1462fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderSampleInterlockEXT 1463fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderShadingRateInterlockEXT 1464fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_shader_interlock" 1465fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1466fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1467fd4e5da5Sopenharmony_ci OpExecutionMode %main PixelInterlockUnorderedEXT 1468fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1469fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1470fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1471fd4e5da5Sopenharmony_ci %3 = OpLabel 1472fd4e5da5Sopenharmony_ci OpBeginInvocationInterlockEXT 1473fd4e5da5Sopenharmony_ci OpEndInvocationInterlockEXT 1474fd4e5da5Sopenharmony_ci OpReturn 1475fd4e5da5Sopenharmony_ci OpFunctionEnd; 1476fd4e5da5Sopenharmony_ci )"; 1477fd4e5da5Sopenharmony_ci const auto result = 1478fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1479fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1480fd4e5da5Sopenharmony_ci} 1481fd4e5da5Sopenharmony_ci 1482fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1483fd4e5da5Sopenharmony_ci FragmentShaderSampleInterlock_RemainsWhenOrderedIsUsed) { 1484fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1485fd4e5da5Sopenharmony_ci OpCapability Shader 1486fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1487fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1488fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1489fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1490fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderPixelInterlockEXT 1491fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShaderSampleInterlockEXT 1492fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderShadingRateInterlockEXT 1493fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_shader_interlock" 1494fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1495fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1496fd4e5da5Sopenharmony_ci OpExecutionMode %main SampleInterlockOrderedEXT 1497fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1498fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1499fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1500fd4e5da5Sopenharmony_ci %3 = OpLabel 1501fd4e5da5Sopenharmony_ci OpBeginInvocationInterlockEXT 1502fd4e5da5Sopenharmony_ci OpEndInvocationInterlockEXT 1503fd4e5da5Sopenharmony_ci OpReturn 1504fd4e5da5Sopenharmony_ci OpFunctionEnd; 1505fd4e5da5Sopenharmony_ci )"; 1506fd4e5da5Sopenharmony_ci const auto result = 1507fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1508fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1509fd4e5da5Sopenharmony_ci} 1510fd4e5da5Sopenharmony_ci 1511fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1512fd4e5da5Sopenharmony_ci FragmentShaderSampleInterlock_RemainsWhenUnorderedIsUsed) { 1513fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1514fd4e5da5Sopenharmony_ci OpCapability Shader 1515fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1516fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1517fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1518fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1519fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderPixelInterlockEXT 1520fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShaderSampleInterlockEXT 1521fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderShadingRateInterlockEXT 1522fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_shader_interlock" 1523fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1524fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1525fd4e5da5Sopenharmony_ci OpExecutionMode %main SampleInterlockUnorderedEXT 1526fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1527fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1528fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1529fd4e5da5Sopenharmony_ci %3 = OpLabel 1530fd4e5da5Sopenharmony_ci OpBeginInvocationInterlockEXT 1531fd4e5da5Sopenharmony_ci OpEndInvocationInterlockEXT 1532fd4e5da5Sopenharmony_ci OpReturn 1533fd4e5da5Sopenharmony_ci OpFunctionEnd; 1534fd4e5da5Sopenharmony_ci )"; 1535fd4e5da5Sopenharmony_ci const auto result = 1536fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1537fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1538fd4e5da5Sopenharmony_ci} 1539fd4e5da5Sopenharmony_ci 1540fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1541fd4e5da5Sopenharmony_ci FragmentShaderShadingRateInterlock_RemainsWhenOrderedIsUsed) { 1542fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1543fd4e5da5Sopenharmony_ci OpCapability Shader 1544fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1545fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1546fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1547fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1548fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderPixelInterlockEXT 1549fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderSampleInterlockEXT 1550fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShaderShadingRateInterlockEXT 1551fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_shader_interlock" 1552fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1553fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1554fd4e5da5Sopenharmony_ci OpExecutionMode %main ShadingRateInterlockOrderedEXT 1555fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1556fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1557fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1558fd4e5da5Sopenharmony_ci %3 = OpLabel 1559fd4e5da5Sopenharmony_ci OpBeginInvocationInterlockEXT 1560fd4e5da5Sopenharmony_ci OpEndInvocationInterlockEXT 1561fd4e5da5Sopenharmony_ci OpReturn 1562fd4e5da5Sopenharmony_ci OpFunctionEnd; 1563fd4e5da5Sopenharmony_ci )"; 1564fd4e5da5Sopenharmony_ci const auto result = 1565fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1566fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1567fd4e5da5Sopenharmony_ci} 1568fd4e5da5Sopenharmony_ci 1569fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1570fd4e5da5Sopenharmony_ci FragmentShaderShadingRateInterlock_RemainsWhenUnorderedIsUsed) { 1571fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1572fd4e5da5Sopenharmony_ci OpCapability Shader 1573fd4e5da5Sopenharmony_ci OpCapability FragmentShaderPixelInterlockEXT 1574fd4e5da5Sopenharmony_ci OpCapability FragmentShaderSampleInterlockEXT 1575fd4e5da5Sopenharmony_ci OpCapability FragmentShaderShadingRateInterlockEXT 1576fd4e5da5Sopenharmony_ci OpExtension "SPV_EXT_fragment_shader_interlock" 1577fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderPixelInterlockEXT 1578fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability FragmentShaderSampleInterlockEXT 1579fd4e5da5Sopenharmony_ci; CHECK: OpCapability FragmentShaderShadingRateInterlockEXT 1580fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_EXT_fragment_shader_interlock" 1581fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1582fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1583fd4e5da5Sopenharmony_ci OpExecutionMode %main ShadingRateInterlockUnorderedEXT 1584fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1585fd4e5da5Sopenharmony_ci %1 = OpTypeFunction %void 1586fd4e5da5Sopenharmony_ci %2 = OpFunction %void None %1 1587fd4e5da5Sopenharmony_ci %3 = OpLabel 1588fd4e5da5Sopenharmony_ci OpBeginInvocationInterlockEXT 1589fd4e5da5Sopenharmony_ci OpEndInvocationInterlockEXT 1590fd4e5da5Sopenharmony_ci OpReturn 1591fd4e5da5Sopenharmony_ci OpFunctionEnd; 1592fd4e5da5Sopenharmony_ci )"; 1593fd4e5da5Sopenharmony_ci const auto result = 1594fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1595fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1596fd4e5da5Sopenharmony_ci} 1597fd4e5da5Sopenharmony_ci 1598fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, Int64_RemovedWhenUnused) { 1599fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1600fd4e5da5Sopenharmony_ci OpCapability Int64 1601fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability Int64 1602fd4e5da5Sopenharmony_ci OpCapability Shader 1603fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1604fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1605fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1606fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 1607fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 1608fd4e5da5Sopenharmony_ci %6 = OpLabel 1609fd4e5da5Sopenharmony_ci OpReturn 1610fd4e5da5Sopenharmony_ci OpFunctionEnd; 1611fd4e5da5Sopenharmony_ci )"; 1612fd4e5da5Sopenharmony_ci const auto result = 1613fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1614fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1615fd4e5da5Sopenharmony_ci} 1616fd4e5da5Sopenharmony_ci 1617fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, Int64_RemainsWhenUsed) { 1618fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1619fd4e5da5Sopenharmony_ci OpCapability Int64 1620fd4e5da5Sopenharmony_ci; CHECK: OpCapability Int64 1621fd4e5da5Sopenharmony_ci OpCapability Shader 1622fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1623fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 1624fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1625fd4e5da5Sopenharmony_ci %int = OpTypeInt 64 0 1626fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 1627fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 1628fd4e5da5Sopenharmony_ci %6 = OpLabel 1629fd4e5da5Sopenharmony_ci OpReturn 1630fd4e5da5Sopenharmony_ci OpFunctionEnd; 1631fd4e5da5Sopenharmony_ci )"; 1632fd4e5da5Sopenharmony_ci const auto result = 1633fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1634fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1635fd4e5da5Sopenharmony_ci} 1636fd4e5da5Sopenharmony_ci 1637fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, RayQueryKHR_RemovedWhenUnused) { 1638fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1639fd4e5da5Sopenharmony_ci OpCapability Shader 1640fd4e5da5Sopenharmony_ci OpCapability RayQueryKHR 1641fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_query" 1642fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability RayQueryKHR 1643fd4e5da5Sopenharmony_ci; CHECK-NOT: OpExtension "SPV_KHR_ray_query" 1644fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1645fd4e5da5Sopenharmony_ci OpEntryPoint Vertex %main "main" %out_var_TEXCOORD1 1646fd4e5da5Sopenharmony_ci OpSource HLSL 660 1647fd4e5da5Sopenharmony_ci OpName %out_var_TEXCOORD1 "out.var.TEXCOORD1" 1648fd4e5da5Sopenharmony_ci OpName %main "main" 1649fd4e5da5Sopenharmony_ci OpDecorate %out_var_TEXCOORD1 Flat 1650fd4e5da5Sopenharmony_ci OpDecorate %out_var_TEXCOORD1 Location 0 1651fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 1652fd4e5da5Sopenharmony_ci %uint_1234 = OpConstant %uint 1234 1653fd4e5da5Sopenharmony_ci%_ptr_Output_uint = OpTypePointer Output %uint 1654fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1655fd4e5da5Sopenharmony_ci %7 = OpTypeFunction %void 1656fd4e5da5Sopenharmony_ci%out_var_TEXCOORD1 = OpVariable %_ptr_Output_uint Output 1657fd4e5da5Sopenharmony_ci %main = OpFunction %void None %7 1658fd4e5da5Sopenharmony_ci %8 = OpLabel 1659fd4e5da5Sopenharmony_ci OpStore %out_var_TEXCOORD1 %uint_1234 1660fd4e5da5Sopenharmony_ci OpReturn 1661fd4e5da5Sopenharmony_ci OpFunctionEnd 1662fd4e5da5Sopenharmony_ci )"; 1663fd4e5da5Sopenharmony_ci const auto result = 1664fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1665fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 1666fd4e5da5Sopenharmony_ci} 1667fd4e5da5Sopenharmony_ci 1668fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1669fd4e5da5Sopenharmony_ci RayQueryKHR_RemainsWhenAccelerationStructureIsPresent) { 1670fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1671fd4e5da5Sopenharmony_ci OpCapability Shader 1672fd4e5da5Sopenharmony_ci OpCapability RayQueryKHR 1673fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_query" 1674fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayQueryKHR 1675fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_query" 1676fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1677fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 1678fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 1679fd4e5da5Sopenharmony_ci OpDecorate %var_bvh DescriptorSet 0 1680fd4e5da5Sopenharmony_ci OpDecorate %var_bvh Binding 0 1681fd4e5da5Sopenharmony_ci %bvh = OpTypeAccelerationStructureKHR 1682fd4e5da5Sopenharmony_ci %ptr_bvh = OpTypePointer UniformConstant %bvh 1683fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1684fd4e5da5Sopenharmony_ci %20 = OpTypeFunction %void 1685fd4e5da5Sopenharmony_ci %var_bvh = OpVariable %ptr_bvh UniformConstant 1686fd4e5da5Sopenharmony_ci %main = OpFunction %void None %20 1687fd4e5da5Sopenharmony_ci %30 = OpLabel 1688fd4e5da5Sopenharmony_ci OpReturn 1689fd4e5da5Sopenharmony_ci OpFunctionEnd 1690fd4e5da5Sopenharmony_ci )"; 1691fd4e5da5Sopenharmony_ci const auto result = 1692fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1693fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1694fd4e5da5Sopenharmony_ci} 1695fd4e5da5Sopenharmony_ci 1696fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, RayQueryKHR_RemainsWhenRayQueryTypeIsPresent) { 1697fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1698fd4e5da5Sopenharmony_ci OpCapability Shader 1699fd4e5da5Sopenharmony_ci OpCapability RayQueryKHR 1700fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_query" 1701fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayQueryKHR 1702fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_query" 1703fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1704fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 1705fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 1706fd4e5da5Sopenharmony_ci %query = OpTypeRayQueryKHR 1707fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1708fd4e5da5Sopenharmony_ci %20 = OpTypeFunction %void 1709fd4e5da5Sopenharmony_ci %ptr_query = OpTypePointer Function %query 1710fd4e5da5Sopenharmony_ci %main = OpFunction %void None %20 1711fd4e5da5Sopenharmony_ci %30 = OpLabel 1712fd4e5da5Sopenharmony_ci %var_query = OpVariable %ptr_query Function 1713fd4e5da5Sopenharmony_ci OpReturn 1714fd4e5da5Sopenharmony_ci OpFunctionEnd 1715fd4e5da5Sopenharmony_ci )"; 1716fd4e5da5Sopenharmony_ci const auto result = 1717fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1718fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1719fd4e5da5Sopenharmony_ci} 1720fd4e5da5Sopenharmony_ci 1721fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, RayQueryKHR_RemainsWhenUsed) { 1722fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1723fd4e5da5Sopenharmony_ci OpCapability Shader 1724fd4e5da5Sopenharmony_ci OpCapability RayQueryKHR 1725fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_query" 1726fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayQueryKHR 1727fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_query" 1728fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1729fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 1730fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 1731fd4e5da5Sopenharmony_ci OpDecorate %bvh DescriptorSet 0 1732fd4e5da5Sopenharmony_ci OpDecorate %bvh Binding 0 1733fd4e5da5Sopenharmony_ci OpDecorate %output DescriptorSet 0 1734fd4e5da5Sopenharmony_ci OpDecorate %output Binding 1 1735fd4e5da5Sopenharmony_ci OpDecorate %_runtimearr_float ArrayStride 4 1736fd4e5da5Sopenharmony_ci OpMemberDecorate %type_RWStructuredBuffer_float 0 Offset 0 1737fd4e5da5Sopenharmony_ci OpDecorate %type_RWStructuredBuffer_float BufferBlock 1738fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 1739fd4e5da5Sopenharmony_ci %float_0 = OpConstant %float 0 1740fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 1741fd4e5da5Sopenharmony_ci %v3float = OpTypeVector %float 3 1742fd4e5da5Sopenharmony_ci %12 = OpConstantComposite %v3float %float_0 %float_0 %float_0 1743fd4e5da5Sopenharmony_ci %int_0 = OpConstant %int 0 1744fd4e5da5Sopenharmony_ci %uint = OpTypeInt 32 0 1745fd4e5da5Sopenharmony_ci %uint_0 = OpConstant %uint 0 1746fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %uint 1 1747fd4e5da5Sopenharmony_ci%accelerationStructureKHR = OpTypeAccelerationStructureKHR 1748fd4e5da5Sopenharmony_ci%_ptr_UniformConstant_accelerationStructureKHR = OpTypePointer UniformConstant %accelerationStructureKHR 1749fd4e5da5Sopenharmony_ci%_runtimearr_float = OpTypeRuntimeArray %float 1750fd4e5da5Sopenharmony_ci%type_RWStructuredBuffer_float = OpTypeStruct %_runtimearr_float 1751fd4e5da5Sopenharmony_ci%_ptr_Uniform_type_RWStructuredBuffer_float = OpTypePointer Uniform %type_RWStructuredBuffer_float 1752fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1753fd4e5da5Sopenharmony_ci %20 = OpTypeFunction %void 1754fd4e5da5Sopenharmony_ci%rayQueryKHR = OpTypeRayQueryKHR 1755fd4e5da5Sopenharmony_ci%_ptr_Function_rayQueryKHR = OpTypePointer Function %rayQueryKHR 1756fd4e5da5Sopenharmony_ci %bool = OpTypeBool 1757fd4e5da5Sopenharmony_ci%_ptr_Uniform_float = OpTypePointer Uniform %float 1758fd4e5da5Sopenharmony_ci %bvh = OpVariable %_ptr_UniformConstant_accelerationStructureKHR UniformConstant 1759fd4e5da5Sopenharmony_ci %output = OpVariable %_ptr_Uniform_type_RWStructuredBuffer_float Uniform 1760fd4e5da5Sopenharmony_ci %main = OpFunction %void None %20 1761fd4e5da5Sopenharmony_ci %24 = OpLabel 1762fd4e5da5Sopenharmony_ci %25 = OpVariable %_ptr_Function_rayQueryKHR Function 1763fd4e5da5Sopenharmony_ci %26 = OpLoad %accelerationStructureKHR %bvh 1764fd4e5da5Sopenharmony_ci OpRayQueryInitializeKHR %25 %26 %uint_0 %uint_0 %12 %float_0 %12 %float_0 1765fd4e5da5Sopenharmony_ci %27 = OpRayQueryProceedKHR %bool %25 1766fd4e5da5Sopenharmony_ci %28 = OpRayQueryGetIntersectionTypeKHR %uint %25 %uint_1 1767fd4e5da5Sopenharmony_ci %29 = OpIEqual %bool %28 %uint_1 1768fd4e5da5Sopenharmony_ci OpSelectionMerge %30 None 1769fd4e5da5Sopenharmony_ci OpBranchConditional %29 %31 %30 1770fd4e5da5Sopenharmony_ci %31 = OpLabel 1771fd4e5da5Sopenharmony_ci %32 = OpAccessChain %_ptr_Uniform_float %output %int_0 %uint_0 1772fd4e5da5Sopenharmony_ci OpStore %32 %float_0 1773fd4e5da5Sopenharmony_ci OpBranch %30 1774fd4e5da5Sopenharmony_ci %30 = OpLabel 1775fd4e5da5Sopenharmony_ci OpReturn 1776fd4e5da5Sopenharmony_ci OpFunctionEnd 1777fd4e5da5Sopenharmony_ci )"; 1778fd4e5da5Sopenharmony_ci const auto result = 1779fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1780fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1781fd4e5da5Sopenharmony_ci} 1782fd4e5da5Sopenharmony_ci 1783fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1784fd4e5da5Sopenharmony_ci RayTracingKHR_RemainsWithIntersectionExecutionMode) { 1785fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1786fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 1787fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 1788fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 1789fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 1790fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1791fd4e5da5Sopenharmony_ci OpEntryPoint IntersectionKHR %main "main" 1792fd4e5da5Sopenharmony_ci OpSource HLSL 660 1793fd4e5da5Sopenharmony_ci OpName %main "main" 1794fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1795fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 1796fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 1797fd4e5da5Sopenharmony_ci %4 = OpLabel 1798fd4e5da5Sopenharmony_ci OpReturn 1799fd4e5da5Sopenharmony_ci OpFunctionEnd 1800fd4e5da5Sopenharmony_ci )"; 1801fd4e5da5Sopenharmony_ci const auto result = 1802fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1803fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1804fd4e5da5Sopenharmony_ci} 1805fd4e5da5Sopenharmony_ci 1806fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1807fd4e5da5Sopenharmony_ci RayTracingKHR_RemainsWithClosestHitExecutionMode) { 1808fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1809fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 1810fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 1811fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 1812fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 1813fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1814fd4e5da5Sopenharmony_ci OpEntryPoint ClosestHitKHR %main "main" %a 1815fd4e5da5Sopenharmony_ci OpSource HLSL 630 1816fd4e5da5Sopenharmony_ci OpName %Payload "Payload" 1817fd4e5da5Sopenharmony_ci OpMemberName %Payload 0 "color" 1818fd4e5da5Sopenharmony_ci OpName %a "a" 1819fd4e5da5Sopenharmony_ci OpName %main "main" 1820fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 1821fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 1822fd4e5da5Sopenharmony_ci %Payload = OpTypeStruct %v4float 1823fd4e5da5Sopenharmony_ci%ptr_payload = OpTypePointer IncomingRayPayloadKHR %Payload 1824fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1825fd4e5da5Sopenharmony_ci %8 = OpTypeFunction %void 1826fd4e5da5Sopenharmony_ci %a = OpVariable %ptr_payload IncomingRayPayloadKHR 1827fd4e5da5Sopenharmony_ci %main = OpFunction %void None %8 1828fd4e5da5Sopenharmony_ci %9 = OpLabel 1829fd4e5da5Sopenharmony_ci %10 = OpLoad %Payload %a 1830fd4e5da5Sopenharmony_ci OpStore %a %10 1831fd4e5da5Sopenharmony_ci OpReturn 1832fd4e5da5Sopenharmony_ci OpFunctionEnd 1833fd4e5da5Sopenharmony_ci 1834fd4e5da5Sopenharmony_ci )"; 1835fd4e5da5Sopenharmony_ci const auto result = 1836fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1837fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1838fd4e5da5Sopenharmony_ci} 1839fd4e5da5Sopenharmony_ci 1840fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, RayTracingKHR_RemainsWithAnyHitExecutionMode) { 1841fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1842fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 1843fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 1844fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 1845fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 1846fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1847fd4e5da5Sopenharmony_ci OpEntryPoint AnyHitKHR %main "main" %a 1848fd4e5da5Sopenharmony_ci OpSource HLSL 630 1849fd4e5da5Sopenharmony_ci OpName %Payload "Payload" 1850fd4e5da5Sopenharmony_ci OpMemberName %Payload 0 "color" 1851fd4e5da5Sopenharmony_ci OpName %a "a" 1852fd4e5da5Sopenharmony_ci OpName %main "main" 1853fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 1854fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 1855fd4e5da5Sopenharmony_ci %Payload = OpTypeStruct %v4float 1856fd4e5da5Sopenharmony_ci%ptr_payload = OpTypePointer IncomingRayPayloadKHR %Payload 1857fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1858fd4e5da5Sopenharmony_ci %8 = OpTypeFunction %void 1859fd4e5da5Sopenharmony_ci %a = OpVariable %ptr_payload IncomingRayPayloadKHR 1860fd4e5da5Sopenharmony_ci %main = OpFunction %void None %8 1861fd4e5da5Sopenharmony_ci %9 = OpLabel 1862fd4e5da5Sopenharmony_ci %10 = OpLoad %Payload %a 1863fd4e5da5Sopenharmony_ci OpStore %a %10 1864fd4e5da5Sopenharmony_ci OpReturn 1865fd4e5da5Sopenharmony_ci OpFunctionEnd 1866fd4e5da5Sopenharmony_ci )"; 1867fd4e5da5Sopenharmony_ci const auto result = 1868fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1869fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1870fd4e5da5Sopenharmony_ci} 1871fd4e5da5Sopenharmony_ci 1872fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, RayTracingKHR_RemainsWithMissExecutionMode) { 1873fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1874fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 1875fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 1876fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 1877fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 1878fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1879fd4e5da5Sopenharmony_ci OpEntryPoint MissKHR %main "main" %a 1880fd4e5da5Sopenharmony_ci OpSource HLSL 630 1881fd4e5da5Sopenharmony_ci OpName %Payload "Payload" 1882fd4e5da5Sopenharmony_ci OpMemberName %Payload 0 "color" 1883fd4e5da5Sopenharmony_ci OpName %a "a" 1884fd4e5da5Sopenharmony_ci OpName %main "main" 1885fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 1886fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 1887fd4e5da5Sopenharmony_ci %Payload = OpTypeStruct %v4float 1888fd4e5da5Sopenharmony_ci%ptr_payload = OpTypePointer IncomingRayPayloadKHR %Payload 1889fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1890fd4e5da5Sopenharmony_ci %8 = OpTypeFunction %void 1891fd4e5da5Sopenharmony_ci %a = OpVariable %ptr_payload IncomingRayPayloadKHR 1892fd4e5da5Sopenharmony_ci %main = OpFunction %void None %8 1893fd4e5da5Sopenharmony_ci %9 = OpLabel 1894fd4e5da5Sopenharmony_ci %10 = OpLoad %Payload %a 1895fd4e5da5Sopenharmony_ci OpStore %a %10 1896fd4e5da5Sopenharmony_ci OpReturn 1897fd4e5da5Sopenharmony_ci OpFunctionEnd 1898fd4e5da5Sopenharmony_ci )"; 1899fd4e5da5Sopenharmony_ci const auto result = 1900fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1901fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1902fd4e5da5Sopenharmony_ci} 1903fd4e5da5Sopenharmony_ci 1904fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1905fd4e5da5Sopenharmony_ci RayTracingKHR_RemainsWithRayGenerationExecutionMode) { 1906fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1907fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 1908fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 1909fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 1910fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 1911fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1912fd4e5da5Sopenharmony_ci OpEntryPoint RayGenerationKHR %main "main" 1913fd4e5da5Sopenharmony_ci OpSource HLSL 630 1914fd4e5da5Sopenharmony_ci OpName %main "main" 1915fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1916fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 1917fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 1918fd4e5da5Sopenharmony_ci %4 = OpLabel 1919fd4e5da5Sopenharmony_ci OpReturn 1920fd4e5da5Sopenharmony_ci OpFunctionEnd 1921fd4e5da5Sopenharmony_ci )"; 1922fd4e5da5Sopenharmony_ci const auto result = 1923fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1924fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1925fd4e5da5Sopenharmony_ci} 1926fd4e5da5Sopenharmony_ci 1927fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1928fd4e5da5Sopenharmony_ci RayTracingKHR_RemainsWithCallableExecutionMode) { 1929fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1930fd4e5da5Sopenharmony_ci; CHECK: OpCapability RayTracingKHR 1931fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_KHR_ray_tracing" 1932fd4e5da5Sopenharmony_ci OpCapability RayTracingKHR 1933fd4e5da5Sopenharmony_ci OpExtension "SPV_KHR_ray_tracing" 1934fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1935fd4e5da5Sopenharmony_ci OpEntryPoint CallableKHR %main "main" %a 1936fd4e5da5Sopenharmony_ci OpSource HLSL 660 1937fd4e5da5Sopenharmony_ci OpName %Payload "Payload" 1938fd4e5da5Sopenharmony_ci OpMemberName %Payload 0 "data" 1939fd4e5da5Sopenharmony_ci OpName %a "a" 1940fd4e5da5Sopenharmony_ci OpName %main "main" 1941fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 1942fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 1943fd4e5da5Sopenharmony_ci %Payload = OpTypeStruct %v4float 1944fd4e5da5Sopenharmony_ci%ptr_payload = OpTypePointer IncomingCallableDataKHR %Payload 1945fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1946fd4e5da5Sopenharmony_ci %8 = OpTypeFunction %void 1947fd4e5da5Sopenharmony_ci %a = OpVariable %ptr_payload IncomingCallableDataKHR 1948fd4e5da5Sopenharmony_ci %main = OpFunction %void None %8 1949fd4e5da5Sopenharmony_ci %9 = OpLabel 1950fd4e5da5Sopenharmony_ci %10 = OpLoad %Payload %a 1951fd4e5da5Sopenharmony_ci OpStore %a %10 1952fd4e5da5Sopenharmony_ci OpReturn 1953fd4e5da5Sopenharmony_ci OpFunctionEnd 1954fd4e5da5Sopenharmony_ci )"; 1955fd4e5da5Sopenharmony_ci const auto result = 1956fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1957fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1958fd4e5da5Sopenharmony_ci} 1959fd4e5da5Sopenharmony_ci 1960fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 1961fd4e5da5Sopenharmony_ci ImageMSArray_RemainsIfSampledIs2AndArrayedIs1) { 1962fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1963fd4e5da5Sopenharmony_ci OpCapability ImageMSArray 1964fd4e5da5Sopenharmony_ci ; CHECK: OpCapability ImageMSArray 1965fd4e5da5Sopenharmony_ci OpCapability Shader 1966fd4e5da5Sopenharmony_ci OpCapability StorageImageMultisample 1967fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 1968fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 1969fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %main "main" 1970fd4e5da5Sopenharmony_ci OpExecutionMode %main OriginUpperLeft 1971fd4e5da5Sopenharmony_ci OpDecorate %var_image DescriptorSet 0 1972fd4e5da5Sopenharmony_ci OpDecorate %var_image Binding 1 1973fd4e5da5Sopenharmony_ci %void = OpTypeVoid 1974fd4e5da5Sopenharmony_ci %func = OpTypeFunction %void 1975fd4e5da5Sopenharmony_ci %f32 = OpTypeFloat 32 1976fd4e5da5Sopenharmony_ci %u32 = OpTypeInt 32 0 1977fd4e5da5Sopenharmony_ci %uint_2 = OpConstant %u32 2 1978fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %u32 1 1979fd4e5da5Sopenharmony_ci %v2uint = OpTypeVector %u32 2 1980fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %f32 4 1981fd4e5da5Sopenharmony_ci %image = OpTypeImage %f32 2D 2 1 1 2 Unknown 1982fd4e5da5Sopenharmony_ci%ptr_image = OpTypePointer UniformConstant %image 1983fd4e5da5Sopenharmony_ci %10 = OpConstantComposite %v2uint %uint_1 %uint_2 1984fd4e5da5Sopenharmony_ci%var_image = OpVariable %ptr_image UniformConstant 1985fd4e5da5Sopenharmony_ci %main = OpFunction %void None %func 1986fd4e5da5Sopenharmony_ci %main_lab = OpLabel 1987fd4e5da5Sopenharmony_ci %18 = OpLoad %image %var_image 1988fd4e5da5Sopenharmony_ci %19 = OpImageRead %v4float %18 %10 Sample %uint_2 1989fd4e5da5Sopenharmony_ci OpReturn 1990fd4e5da5Sopenharmony_ci OpFunctionEnd 1991fd4e5da5Sopenharmony_ci )"; 1992fd4e5da5Sopenharmony_ci const auto result = 1993fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 1994fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 1995fd4e5da5Sopenharmony_ci} 1996fd4e5da5Sopenharmony_ci 1997fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, ImageMSArray_RemovedIfNotUsed) { 1998fd4e5da5Sopenharmony_ci const std::string kTest = R"( 1999fd4e5da5Sopenharmony_ci OpCapability Shader 2000fd4e5da5Sopenharmony_ci OpCapability ImageMSArray 2001fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ImageMSArray 2002fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2003fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %main "main" %out_var_SV_Target 2004fd4e5da5Sopenharmony_ci OpExecutionMode %main OriginUpperLeft 2005fd4e5da5Sopenharmony_ci OpSource HLSL 660 2006fd4e5da5Sopenharmony_ci OpName %out_var_SV_Target "out.var.SV_Target" 2007fd4e5da5Sopenharmony_ci OpName %main "main" 2008fd4e5da5Sopenharmony_ci OpDecorate %out_var_SV_Target Location 0 2009fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 2010fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %float 4 2011fd4e5da5Sopenharmony_ci%_ptr_Output_v4float = OpTypePointer Output %v4float 2012fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2013fd4e5da5Sopenharmony_ci %7 = OpTypeFunction %void 2014fd4e5da5Sopenharmony_ci%out_var_SV_Target = OpVariable %_ptr_Output_v4float Output 2015fd4e5da5Sopenharmony_ci %main = OpFunction %void None %7 2016fd4e5da5Sopenharmony_ci %8 = OpLabel 2017fd4e5da5Sopenharmony_ci OpReturn 2018fd4e5da5Sopenharmony_ci OpFunctionEnd 2019fd4e5da5Sopenharmony_ci )"; 2020fd4e5da5Sopenharmony_ci const auto result = 2021fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2022fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2023fd4e5da5Sopenharmony_ci} 2024fd4e5da5Sopenharmony_ci 2025fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, ImageMSArray_RemovedIfArrayedIsNot1) { 2026fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2027fd4e5da5Sopenharmony_ci OpCapability ImageMSArray 2028fd4e5da5Sopenharmony_ci ; CHECK-NOT: OpCapability ImageMSArray 2029fd4e5da5Sopenharmony_ci OpCapability Shader 2030fd4e5da5Sopenharmony_ci OpCapability StorageImageMultisample 2031fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2032fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2033fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %main "main" 2034fd4e5da5Sopenharmony_ci OpExecutionMode %main OriginUpperLeft 2035fd4e5da5Sopenharmony_ci OpDecorate %var_image DescriptorSet 0 2036fd4e5da5Sopenharmony_ci OpDecorate %var_image Binding 1 2037fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2038fd4e5da5Sopenharmony_ci %func = OpTypeFunction %void 2039fd4e5da5Sopenharmony_ci %f32 = OpTypeFloat 32 2040fd4e5da5Sopenharmony_ci %u32 = OpTypeInt 32 0 2041fd4e5da5Sopenharmony_ci %uint_2 = OpConstant %u32 2 2042fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %u32 1 2043fd4e5da5Sopenharmony_ci %v2uint = OpTypeVector %u32 2 2044fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %f32 4 2045fd4e5da5Sopenharmony_ci %image = OpTypeImage %f32 2D 2 0 1 2 Unknown 2046fd4e5da5Sopenharmony_ci%ptr_image = OpTypePointer UniformConstant %image 2047fd4e5da5Sopenharmony_ci %10 = OpConstantComposite %v2uint %uint_1 %uint_2 2048fd4e5da5Sopenharmony_ci%var_image = OpVariable %ptr_image UniformConstant 2049fd4e5da5Sopenharmony_ci %main = OpFunction %void None %func 2050fd4e5da5Sopenharmony_ci %main_lab = OpLabel 2051fd4e5da5Sopenharmony_ci %18 = OpLoad %image %var_image 2052fd4e5da5Sopenharmony_ci %19 = OpImageRead %v4float %18 %10 Sample %uint_2 2053fd4e5da5Sopenharmony_ci OpReturn 2054fd4e5da5Sopenharmony_ci OpFunctionEnd 2055fd4e5da5Sopenharmony_ci )"; 2056fd4e5da5Sopenharmony_ci const auto result = 2057fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2058fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2059fd4e5da5Sopenharmony_ci} 2060fd4e5da5Sopenharmony_ci 2061fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, ImageMSArray_RemovedIfSampledNot2) { 2062fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2063fd4e5da5Sopenharmony_ci OpCapability ImageMSArray 2064fd4e5da5Sopenharmony_ci ; CHECK-NOT: OpCapability ImageMSArray 2065fd4e5da5Sopenharmony_ci OpCapability Shader 2066fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2067fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2068fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %main "main" 2069fd4e5da5Sopenharmony_ci OpExecutionMode %main OriginUpperLeft 2070fd4e5da5Sopenharmony_ci OpDecorate %var_image DescriptorSet 0 2071fd4e5da5Sopenharmony_ci OpDecorate %var_image Binding 1 2072fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2073fd4e5da5Sopenharmony_ci %func = OpTypeFunction %void 2074fd4e5da5Sopenharmony_ci %f32 = OpTypeFloat 32 2075fd4e5da5Sopenharmony_ci %u32 = OpTypeInt 32 0 2076fd4e5da5Sopenharmony_ci %uint_3 = OpConstant %u32 3 2077fd4e5da5Sopenharmony_ci %uint_2 = OpConstant %u32 2 2078fd4e5da5Sopenharmony_ci %uint_1 = OpConstant %u32 1 2079fd4e5da5Sopenharmony_ci %v3uint = OpTypeVector %u32 3 2080fd4e5da5Sopenharmony_ci %v4float = OpTypeVector %f32 4 2081fd4e5da5Sopenharmony_ci %image = OpTypeImage %f32 2D 2 1 0 2 Unknown 2082fd4e5da5Sopenharmony_ci%ptr_image = OpTypePointer UniformConstant %image 2083fd4e5da5Sopenharmony_ci %10 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3 2084fd4e5da5Sopenharmony_ci%var_image = OpVariable %ptr_image UniformConstant 2085fd4e5da5Sopenharmony_ci %main = OpFunction %void None %func 2086fd4e5da5Sopenharmony_ci %main_lab = OpLabel 2087fd4e5da5Sopenharmony_ci %18 = OpLoad %image %var_image 2088fd4e5da5Sopenharmony_ci %19 = OpImageRead %v4float %18 %10 2089fd4e5da5Sopenharmony_ci OpReturn 2090fd4e5da5Sopenharmony_ci OpFunctionEnd 2091fd4e5da5Sopenharmony_ci )"; 2092fd4e5da5Sopenharmony_ci const auto result = 2093fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2094fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2095fd4e5da5Sopenharmony_ci} 2096fd4e5da5Sopenharmony_ci 2097fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, Float64_RemovedWhenUnused) { 2098fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2099fd4e5da5Sopenharmony_ci OpCapability Float64 2100fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability Float64 2101fd4e5da5Sopenharmony_ci OpCapability Shader 2102fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2103fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 2104fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2105fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2106fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 2107fd4e5da5Sopenharmony_ci %6 = OpLabel 2108fd4e5da5Sopenharmony_ci OpReturn 2109fd4e5da5Sopenharmony_ci OpFunctionEnd; 2110fd4e5da5Sopenharmony_ci )"; 2111fd4e5da5Sopenharmony_ci const auto result = 2112fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2113fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2114fd4e5da5Sopenharmony_ci} 2115fd4e5da5Sopenharmony_ci 2116fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, Float64_RemainsWhenUsed) { 2117fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2118fd4e5da5Sopenharmony_ci OpCapability Float64 2119fd4e5da5Sopenharmony_ci; CHECK: OpCapability Float64 2120fd4e5da5Sopenharmony_ci OpCapability Shader 2121fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2122fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 2123fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2124fd4e5da5Sopenharmony_ci %float = OpTypeFloat 64 2125fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2126fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 2127fd4e5da5Sopenharmony_ci %6 = OpLabel 2128fd4e5da5Sopenharmony_ci OpReturn 2129fd4e5da5Sopenharmony_ci OpFunctionEnd; 2130fd4e5da5Sopenharmony_ci )"; 2131fd4e5da5Sopenharmony_ci const auto result = 2132fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2133fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2134fd4e5da5Sopenharmony_ci} 2135fd4e5da5Sopenharmony_ci 2136fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2137fd4e5da5Sopenharmony_ci ComputeDerivativeGroupQuads_ReamainsWithExecMode) { 2138fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2139fd4e5da5Sopenharmony_ci OpCapability ComputeDerivativeGroupQuadsNV 2140fd4e5da5Sopenharmony_ci OpCapability ComputeDerivativeGroupLinearNV 2141fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ComputeDerivativeGroupLinearNV 2142fd4e5da5Sopenharmony_ci; CHECK: OpCapability ComputeDerivativeGroupQuadsNV 2143fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ComputeDerivativeGroupLinearNV 2144fd4e5da5Sopenharmony_ci OpCapability Shader 2145fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_NV_compute_shader_derivatives" 2146fd4e5da5Sopenharmony_ci OpExtension "SPV_NV_compute_shader_derivatives" 2147fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2148fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 2149fd4e5da5Sopenharmony_ci OpExecutionMode %1 DerivativeGroupQuadsNV 2150fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2151fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2152fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 2153fd4e5da5Sopenharmony_ci %6 = OpLabel 2154fd4e5da5Sopenharmony_ci OpReturn 2155fd4e5da5Sopenharmony_ci OpFunctionEnd 2156fd4e5da5Sopenharmony_ci )"; 2157fd4e5da5Sopenharmony_ci const auto result = 2158fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2159fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2160fd4e5da5Sopenharmony_ci} 2161fd4e5da5Sopenharmony_ci 2162fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2163fd4e5da5Sopenharmony_ci ComputeDerivativeGroupLinear_ReamainsWithExecMode) { 2164fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2165fd4e5da5Sopenharmony_ci OpCapability ComputeDerivativeGroupLinearNV 2166fd4e5da5Sopenharmony_ci OpCapability ComputeDerivativeGroupQuadsNV 2167fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ComputeDerivativeGroupQuadsNV 2168fd4e5da5Sopenharmony_ci; CHECK: OpCapability ComputeDerivativeGroupLinearNV 2169fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability ComputeDerivativeGroupQuadsNV 2170fd4e5da5Sopenharmony_ci OpCapability Shader 2171fd4e5da5Sopenharmony_ci; CHECK: OpExtension "SPV_NV_compute_shader_derivatives" 2172fd4e5da5Sopenharmony_ci OpExtension "SPV_NV_compute_shader_derivatives" 2173fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2174fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 2175fd4e5da5Sopenharmony_ci OpExecutionMode %1 DerivativeGroupLinearNV 2176fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2177fd4e5da5Sopenharmony_ci %float = OpTypeFloat 64 2178fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2179fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 2180fd4e5da5Sopenharmony_ci %6 = OpLabel 2181fd4e5da5Sopenharmony_ci OpReturn 2182fd4e5da5Sopenharmony_ci OpFunctionEnd 2183fd4e5da5Sopenharmony_ci )"; 2184fd4e5da5Sopenharmony_ci const auto result = 2185fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2186fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2187fd4e5da5Sopenharmony_ci} 2188fd4e5da5Sopenharmony_ci 2189fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2190fd4e5da5Sopenharmony_ci StorageImageReadWithoutFormat_RemovedIfUnused) { 2191fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2192fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2193fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageImageReadWithoutFormat 2194fd4e5da5Sopenharmony_ci OpCapability Shader 2195fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2196fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %PSMain "PSMain" %out_var 2197fd4e5da5Sopenharmony_ci OpExecutionMode %PSMain OriginUpperLeft 2198fd4e5da5Sopenharmony_ci OpDecorate %out_var Location 0 2199fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 2200fd4e5da5Sopenharmony_ci %float4 = OpTypeVector %float 4 2201fd4e5da5Sopenharmony_ci %float_0 = OpConstant %float 0 2202fd4e5da5Sopenharmony_ci%float4_0000 = OpConstantComposite %float4 %float_0 %float_0 %float_0 %float_0 2203fd4e5da5Sopenharmony_ci %ptr_float4 = OpTypePointer Output %float4 2204fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2205fd4e5da5Sopenharmony_ci %9 = OpTypeFunction %void 2206fd4e5da5Sopenharmony_ci %out_var = OpVariable %ptr_float4 Output 2207fd4e5da5Sopenharmony_ci %PSMain = OpFunction %void None %9 2208fd4e5da5Sopenharmony_ci %10 = OpLabel 2209fd4e5da5Sopenharmony_ci OpStore %out_var %float4_0000 2210fd4e5da5Sopenharmony_ci OpReturn 2211fd4e5da5Sopenharmony_ci OpFunctionEnd 2212fd4e5da5Sopenharmony_ci )"; 2213fd4e5da5Sopenharmony_ci const auto result = 2214fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2215fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2216fd4e5da5Sopenharmony_ci} 2217fd4e5da5Sopenharmony_ci 2218fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2219fd4e5da5Sopenharmony_ci StorageImageReadWithoutFormat_RemovedIfUnusedOpImageFetch) { 2220fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2221fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2222fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageImageReadWithoutFormat 2223fd4e5da5Sopenharmony_ci OpCapability Shader 2224fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2225fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %PSMain "PSMain" %out_var 2226fd4e5da5Sopenharmony_ci OpExecutionMode %PSMain OriginUpperLeft 2227fd4e5da5Sopenharmony_ci OpDecorate %out_var Location 0 2228fd4e5da5Sopenharmony_ci OpDecorate %texture DescriptorSet 0 2229fd4e5da5Sopenharmony_ci OpDecorate %texture Binding 1 2230fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 2231fd4e5da5Sopenharmony_ci %float4 = OpTypeVector %float 4 2232fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 2233fd4e5da5Sopenharmony_ci %int2 = OpTypeVector %int 2 2234fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float 2D 2 0 0 1 Unknown 2235fd4e5da5Sopenharmony_ci %ptr_image = OpTypePointer UniformConstant %type_image 2236fd4e5da5Sopenharmony_ci %int_0 = OpConstant %int 0 2237fd4e5da5Sopenharmony_ci %int2_00 = OpConstantComposite %int2 %int_0 %int_0 2238fd4e5da5Sopenharmony_ci %ptr_float4 = OpTypePointer Output %float4 2239fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2240fd4e5da5Sopenharmony_ci %9 = OpTypeFunction %void 2241fd4e5da5Sopenharmony_ci %texture = OpVariable %ptr_image UniformConstant 2242fd4e5da5Sopenharmony_ci %out_var = OpVariable %ptr_float4 Output 2243fd4e5da5Sopenharmony_ci %PSMain = OpFunction %void None %9 2244fd4e5da5Sopenharmony_ci %10 = OpLabel 2245fd4e5da5Sopenharmony_ci %11 = OpLoad %type_image %texture 2246fd4e5da5Sopenharmony_ci %12 = OpImageFetch %float4 %11 %int2_00 Lod %int_0 2247fd4e5da5Sopenharmony_ci OpStore %out_var %12 2248fd4e5da5Sopenharmony_ci OpReturn 2249fd4e5da5Sopenharmony_ci OpFunctionEnd 2250fd4e5da5Sopenharmony_ci )"; 2251fd4e5da5Sopenharmony_ci const auto result = 2252fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2253fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2254fd4e5da5Sopenharmony_ci} 2255fd4e5da5Sopenharmony_ci 2256fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2257fd4e5da5Sopenharmony_ci StorageImageReadWithoutFormat_RemainsWhenRequiredWithRead) { 2258fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2259fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2260fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageReadWithoutFormat 2261fd4e5da5Sopenharmony_ci OpCapability Shader 2262fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2263fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %PSMain "PSMain" %out_var 2264fd4e5da5Sopenharmony_ci OpExecutionMode %PSMain OriginUpperLeft 2265fd4e5da5Sopenharmony_ci OpDecorate %out_var Location 0 2266fd4e5da5Sopenharmony_ci OpDecorate %texture DescriptorSet 0 2267fd4e5da5Sopenharmony_ci OpDecorate %texture Binding 1 2268fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 2269fd4e5da5Sopenharmony_ci %float4 = OpTypeVector %float 4 2270fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 2271fd4e5da5Sopenharmony_ci %int2 = OpTypeVector %int 2 2272fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float 2D 2 0 0 1 Unknown 2273fd4e5da5Sopenharmony_ci %ptr_image = OpTypePointer UniformConstant %type_image 2274fd4e5da5Sopenharmony_ci %int_0 = OpConstant %int 0 2275fd4e5da5Sopenharmony_ci %int2_00 = OpConstantComposite %int2 %int_0 %int_0 2276fd4e5da5Sopenharmony_ci %ptr_float4 = OpTypePointer Output %float4 2277fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2278fd4e5da5Sopenharmony_ci %9 = OpTypeFunction %void 2279fd4e5da5Sopenharmony_ci %texture = OpVariable %ptr_image UniformConstant 2280fd4e5da5Sopenharmony_ci %out_var = OpVariable %ptr_float4 Output 2281fd4e5da5Sopenharmony_ci %PSMain = OpFunction %void None %9 2282fd4e5da5Sopenharmony_ci %10 = OpLabel 2283fd4e5da5Sopenharmony_ci %11 = OpLoad %type_image %texture 2284fd4e5da5Sopenharmony_ci %12 = OpImageRead %float4 %11 %int2_00 Lod %int_0 2285fd4e5da5Sopenharmony_ci OpStore %out_var %12 2286fd4e5da5Sopenharmony_ci OpReturn 2287fd4e5da5Sopenharmony_ci OpFunctionEnd 2288fd4e5da5Sopenharmony_ci )"; 2289fd4e5da5Sopenharmony_ci const auto result = 2290fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2291fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2292fd4e5da5Sopenharmony_ci} 2293fd4e5da5Sopenharmony_ci 2294fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2295fd4e5da5Sopenharmony_ci StorageImageReadWithoutFormat_RemainsWhenRequiredWithSparseRead) { 2296fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2297fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2298fd4e5da5Sopenharmony_ci; CHECK: OpCapability StorageImageReadWithoutFormat 2299fd4e5da5Sopenharmony_ci OpCapability SparseResidency 2300fd4e5da5Sopenharmony_ci OpCapability Shader 2301fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2302fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %PSMain "PSMain" 2303fd4e5da5Sopenharmony_ci OpExecutionMode %PSMain OriginUpperLeft 2304fd4e5da5Sopenharmony_ci OpDecorate %texture DescriptorSet 0 2305fd4e5da5Sopenharmony_ci OpDecorate %texture Binding 1 2306fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 2307fd4e5da5Sopenharmony_ci %float4 = OpTypeVector %float 4 2308fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 2309fd4e5da5Sopenharmony_ci %int2 = OpTypeVector %int 2 2310fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float 2D 2 0 0 2 Unknown 2311fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %int %float4 2312fd4e5da5Sopenharmony_ci %ptr_image = OpTypePointer UniformConstant %type_image 2313fd4e5da5Sopenharmony_ci %int_0 = OpConstant %int 0 2314fd4e5da5Sopenharmony_ci %int2_00 = OpConstantComposite %int2 %int_0 %int_0 2315fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2316fd4e5da5Sopenharmony_ci %9 = OpTypeFunction %void 2317fd4e5da5Sopenharmony_ci %texture = OpVariable %ptr_image UniformConstant 2318fd4e5da5Sopenharmony_ci %PSMain = OpFunction %void None %9 2319fd4e5da5Sopenharmony_ci %10 = OpLabel 2320fd4e5da5Sopenharmony_ci %11 = OpLoad %type_image %texture 2321fd4e5da5Sopenharmony_ci %12 = OpImageSparseRead %struct %11 %int2_00 2322fd4e5da5Sopenharmony_ci OpReturn 2323fd4e5da5Sopenharmony_ci OpFunctionEnd 2324fd4e5da5Sopenharmony_ci )"; 2325fd4e5da5Sopenharmony_ci const auto result = 2326fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2327fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2328fd4e5da5Sopenharmony_ci} 2329fd4e5da5Sopenharmony_ci 2330fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2331fd4e5da5Sopenharmony_ci StorageImageReadWithoutFormat_RemovedWithReadOnSubpassData) { 2332fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2333fd4e5da5Sopenharmony_ci OpCapability StorageImageReadWithoutFormat 2334fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability StorageImageReadWithoutFormat 2335fd4e5da5Sopenharmony_ci OpCapability InputAttachment 2336fd4e5da5Sopenharmony_ci OpCapability Shader 2337fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2338fd4e5da5Sopenharmony_ci OpEntryPoint Fragment %PSMain "PSMain" %out_var 2339fd4e5da5Sopenharmony_ci OpExecutionMode %PSMain OriginUpperLeft 2340fd4e5da5Sopenharmony_ci OpDecorate %out_var Location 0 2341fd4e5da5Sopenharmony_ci OpDecorate %texture DescriptorSet 0 2342fd4e5da5Sopenharmony_ci OpDecorate %texture Binding 1 2343fd4e5da5Sopenharmony_ci %float = OpTypeFloat 32 2344fd4e5da5Sopenharmony_ci %float4 = OpTypeVector %float 4 2345fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 1 2346fd4e5da5Sopenharmony_ci %int2 = OpTypeVector %int 2 2347fd4e5da5Sopenharmony_ci %type_image = OpTypeImage %float SubpassData 2 0 0 2 Unknown 2348fd4e5da5Sopenharmony_ci %ptr_image = OpTypePointer UniformConstant %type_image 2349fd4e5da5Sopenharmony_ci %int_0 = OpConstant %int 0 2350fd4e5da5Sopenharmony_ci %int2_00 = OpConstantComposite %int2 %int_0 %int_0 2351fd4e5da5Sopenharmony_ci %ptr_float4 = OpTypePointer Output %float4 2352fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2353fd4e5da5Sopenharmony_ci %9 = OpTypeFunction %void 2354fd4e5da5Sopenharmony_ci %texture = OpVariable %ptr_image UniformConstant 2355fd4e5da5Sopenharmony_ci %out_var = OpVariable %ptr_float4 Output 2356fd4e5da5Sopenharmony_ci %PSMain = OpFunction %void None %9 2357fd4e5da5Sopenharmony_ci %10 = OpLabel 2358fd4e5da5Sopenharmony_ci %11 = OpLoad %type_image %texture 2359fd4e5da5Sopenharmony_ci %12 = OpImageRead %float4 %11 %int2_00 2360fd4e5da5Sopenharmony_ci OpStore %out_var %12 2361fd4e5da5Sopenharmony_ci OpReturn 2362fd4e5da5Sopenharmony_ci OpFunctionEnd 2363fd4e5da5Sopenharmony_ci )"; 2364fd4e5da5Sopenharmony_ci const auto result = 2365fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2366fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2367fd4e5da5Sopenharmony_ci} 2368fd4e5da5Sopenharmony_ci 2369fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, PhysicalStorageBuffer_RemovedWhenUnused) { 2370fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2371fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddresses 2372fd4e5da5Sopenharmony_ci; CHECK-NOT: OpCapability PhysicalStorageBufferAddresses 2373fd4e5da5Sopenharmony_ci OpCapability Shader 2374fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2375fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %1 "main" 2376fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2377fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2378fd4e5da5Sopenharmony_ci %1 = OpFunction %void None %3 2379fd4e5da5Sopenharmony_ci %6 = OpLabel 2380fd4e5da5Sopenharmony_ci OpReturn 2381fd4e5da5Sopenharmony_ci OpFunctionEnd; 2382fd4e5da5Sopenharmony_ci )"; 2383fd4e5da5Sopenharmony_ci const auto result = 2384fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2385fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange); 2386fd4e5da5Sopenharmony_ci} 2387fd4e5da5Sopenharmony_ci 2388fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2389fd4e5da5Sopenharmony_ci PhysicalStorageBuffer_RemainsWithOpTypeForwardPointer) { 2390fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2391fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddresses 2392fd4e5da5Sopenharmony_ci; CHECK: OpCapability PhysicalStorageBufferAddresses 2393fd4e5da5Sopenharmony_ci OpCapability Shader 2394fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2395fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 2396fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 2397fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2398fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 0 2399fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %int 2400fd4e5da5Sopenharmony_ci OpTypeForwardPointer %ptr PhysicalStorageBuffer 2401fd4e5da5Sopenharmony_ci %ptr = OpTypePointer PhysicalStorageBuffer %struct 2402fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2403fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 2404fd4e5da5Sopenharmony_ci %6 = OpLabel 2405fd4e5da5Sopenharmony_ci OpReturn 2406fd4e5da5Sopenharmony_ci OpFunctionEnd 2407fd4e5da5Sopenharmony_ci )"; 2408fd4e5da5Sopenharmony_ci const auto result = 2409fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2410fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2411fd4e5da5Sopenharmony_ci} 2412fd4e5da5Sopenharmony_ci 2413fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2414fd4e5da5Sopenharmony_ci PhysicalStorageBuffer_RemainsWithPhysicalStorageBufferStorage) { 2415fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2416fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddresses 2417fd4e5da5Sopenharmony_ci; CHECK: OpCapability PhysicalStorageBufferAddresses 2418fd4e5da5Sopenharmony_ci OpCapability Shader 2419fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2420fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 2421fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 2422fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2423fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 0 2424fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %int 2425fd4e5da5Sopenharmony_ci %ptr = OpTypePointer PhysicalStorageBuffer %struct 2426fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2427fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 2428fd4e5da5Sopenharmony_ci %6 = OpLabel 2429fd4e5da5Sopenharmony_ci OpReturn 2430fd4e5da5Sopenharmony_ci OpFunctionEnd; 2431fd4e5da5Sopenharmony_ci )"; 2432fd4e5da5Sopenharmony_ci const auto result = 2433fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2434fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2435fd4e5da5Sopenharmony_ci} 2436fd4e5da5Sopenharmony_ci 2437fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2438fd4e5da5Sopenharmony_ci PhysicalStorageBuffer_RemainsWithRestrictDecoration) { 2439fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2440fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddresses 2441fd4e5da5Sopenharmony_ci; CHECK: OpCapability PhysicalStorageBufferAddresses 2442fd4e5da5Sopenharmony_ci OpCapability Shader 2443fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2444fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 2445fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 2446fd4e5da5Sopenharmony_ci OpDecorate %var RestrictPointer 2447fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2448fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 0 2449fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %int 2450fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Function %struct 2451fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2452fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 2453fd4e5da5Sopenharmony_ci %6 = OpLabel 2454fd4e5da5Sopenharmony_ci %var = OpVariable %ptr Function 2455fd4e5da5Sopenharmony_ci OpReturn 2456fd4e5da5Sopenharmony_ci OpFunctionEnd; 2457fd4e5da5Sopenharmony_ci )"; 2458fd4e5da5Sopenharmony_ci const auto result = 2459fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2460fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2461fd4e5da5Sopenharmony_ci} 2462fd4e5da5Sopenharmony_ci 2463fd4e5da5Sopenharmony_ciTEST_F(TrimCapabilitiesPassTest, 2464fd4e5da5Sopenharmony_ci PhysicalStorageBuffer_RemainsWithAliasedDecoration) { 2465fd4e5da5Sopenharmony_ci const std::string kTest = R"( 2466fd4e5da5Sopenharmony_ci OpCapability PhysicalStorageBufferAddresses 2467fd4e5da5Sopenharmony_ci; CHECK: OpCapability PhysicalStorageBufferAddresses 2468fd4e5da5Sopenharmony_ci OpCapability Shader 2469fd4e5da5Sopenharmony_ci OpMemoryModel Logical GLSL450 2470fd4e5da5Sopenharmony_ci OpEntryPoint GLCompute %main "main" 2471fd4e5da5Sopenharmony_ci OpExecutionMode %main LocalSize 1 2 4 2472fd4e5da5Sopenharmony_ci OpDecorate %var AliasedPointer 2473fd4e5da5Sopenharmony_ci %void = OpTypeVoid 2474fd4e5da5Sopenharmony_ci %int = OpTypeInt 32 0 2475fd4e5da5Sopenharmony_ci %struct = OpTypeStruct %int 2476fd4e5da5Sopenharmony_ci %ptr = OpTypePointer Function %struct 2477fd4e5da5Sopenharmony_ci %3 = OpTypeFunction %void 2478fd4e5da5Sopenharmony_ci %main = OpFunction %void None %3 2479fd4e5da5Sopenharmony_ci %6 = OpLabel 2480fd4e5da5Sopenharmony_ci %var = OpVariable %ptr Function 2481fd4e5da5Sopenharmony_ci OpReturn 2482fd4e5da5Sopenharmony_ci OpFunctionEnd; 2483fd4e5da5Sopenharmony_ci )"; 2484fd4e5da5Sopenharmony_ci const auto result = 2485fd4e5da5Sopenharmony_ci SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false); 2486fd4e5da5Sopenharmony_ci EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange); 2487fd4e5da5Sopenharmony_ci} 2488fd4e5da5Sopenharmony_ci 2489fd4e5da5Sopenharmony_ci} // namespace 2490fd4e5da5Sopenharmony_ci} // namespace opt 2491fd4e5da5Sopenharmony_ci} // namespace spvtools 2492