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