mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-11-25 04:50:04 +00:00
opt: add PhysicalStorageBufferAddresses to trim (#5476)
The PhysicalStorageBufferAddresses capability can now be trimmed. From the spec, it seems any instruction enabled by this required some operand to have the PhysicalStorageBuffer storage class. This means checking the storage class is enough. Now, because the pass uses the grammar, we don't need to add any new logic. Signed-off-by: Nathan Gauër <brioche@google.com>
This commit is contained in:
parent
c91e9d09b5
commit
f43c464d53
@ -74,14 +74,18 @@ class TrimCapabilitiesPass : public Pass {
|
||||
// contains unsupported instruction, the pass could yield bad results.
|
||||
static constexpr std::array kSupportedCapabilities{
|
||||
// clang-format off
|
||||
spv::Capability::ComputeDerivativeGroupLinearNV,
|
||||
spv::Capability::ComputeDerivativeGroupQuadsNV,
|
||||
spv::Capability::Float64,
|
||||
spv::Capability::FragmentShaderPixelInterlockEXT,
|
||||
spv::Capability::FragmentShaderSampleInterlockEXT,
|
||||
spv::Capability::FragmentShaderShadingRateInterlockEXT,
|
||||
spv::Capability::Groups,
|
||||
spv::Capability::ImageMSArray,
|
||||
spv::Capability::Int64,
|
||||
spv::Capability::Linkage,
|
||||
spv::Capability::MinLod,
|
||||
spv::Capability::PhysicalStorageBufferAddresses,
|
||||
spv::Capability::RayQueryKHR,
|
||||
spv::Capability::RayTracingKHR,
|
||||
spv::Capability::RayTraversalPrimitiveCullingKHR,
|
||||
@ -91,10 +95,7 @@ class TrimCapabilitiesPass : public Pass {
|
||||
spv::Capability::StorageInputOutput16,
|
||||
spv::Capability::StoragePushConstant16,
|
||||
spv::Capability::StorageUniform16,
|
||||
spv::Capability::StorageUniformBufferBlock16,
|
||||
spv::Capability::ImageMSArray,
|
||||
spv::Capability::ComputeDerivativeGroupQuadsNV,
|
||||
spv::Capability::ComputeDerivativeGroupLinearNV
|
||||
spv::Capability::StorageUniformBufferBlock16
|
||||
// clang-format on
|
||||
};
|
||||
|
||||
|
@ -2366,6 +2366,126 @@ TEST_F(TrimCapabilitiesPassTest,
|
||||
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange);
|
||||
}
|
||||
|
||||
TEST_F(TrimCapabilitiesPassTest, PhysicalStorageBuffer_RemovedWhenUnused) {
|
||||
const std::string kTest = R"(
|
||||
OpCapability PhysicalStorageBufferAddresses
|
||||
; CHECK-NOT: OpCapability PhysicalStorageBufferAddresses
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %1 "main"
|
||||
%void = OpTypeVoid
|
||||
%3 = OpTypeFunction %void
|
||||
%1 = OpFunction %void None %3
|
||||
%6 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd;
|
||||
)";
|
||||
const auto result =
|
||||
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
|
||||
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithChange);
|
||||
}
|
||||
|
||||
TEST_F(TrimCapabilitiesPassTest,
|
||||
PhysicalStorageBuffer_RemainsWithOpTypeForwardPointer) {
|
||||
const std::string kTest = R"(
|
||||
OpCapability PhysicalStorageBufferAddresses
|
||||
; CHECK: OpCapability PhysicalStorageBufferAddresses
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main"
|
||||
OpExecutionMode %main LocalSize 1 2 4
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%struct = OpTypeStruct %int
|
||||
OpTypeForwardPointer %ptr PhysicalStorageBuffer
|
||||
%ptr = OpTypePointer PhysicalStorageBuffer %struct
|
||||
%3 = OpTypeFunction %void
|
||||
%main = OpFunction %void None %3
|
||||
%6 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
)";
|
||||
const auto result =
|
||||
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
|
||||
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange);
|
||||
}
|
||||
|
||||
TEST_F(TrimCapabilitiesPassTest,
|
||||
PhysicalStorageBuffer_RemainsWithPhysicalStorageBufferStorage) {
|
||||
const std::string kTest = R"(
|
||||
OpCapability PhysicalStorageBufferAddresses
|
||||
; CHECK: OpCapability PhysicalStorageBufferAddresses
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main"
|
||||
OpExecutionMode %main LocalSize 1 2 4
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%struct = OpTypeStruct %int
|
||||
%ptr = OpTypePointer PhysicalStorageBuffer %struct
|
||||
%3 = OpTypeFunction %void
|
||||
%main = OpFunction %void None %3
|
||||
%6 = OpLabel
|
||||
OpReturn
|
||||
OpFunctionEnd;
|
||||
)";
|
||||
const auto result =
|
||||
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
|
||||
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange);
|
||||
}
|
||||
|
||||
TEST_F(TrimCapabilitiesPassTest,
|
||||
PhysicalStorageBuffer_RemainsWithRestrictDecoration) {
|
||||
const std::string kTest = R"(
|
||||
OpCapability PhysicalStorageBufferAddresses
|
||||
; CHECK: OpCapability PhysicalStorageBufferAddresses
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main"
|
||||
OpExecutionMode %main LocalSize 1 2 4
|
||||
OpDecorate %var RestrictPointer
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%struct = OpTypeStruct %int
|
||||
%ptr = OpTypePointer Function %struct
|
||||
%3 = OpTypeFunction %void
|
||||
%main = OpFunction %void None %3
|
||||
%6 = OpLabel
|
||||
%var = OpVariable %ptr Function
|
||||
OpReturn
|
||||
OpFunctionEnd;
|
||||
)";
|
||||
const auto result =
|
||||
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
|
||||
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange);
|
||||
}
|
||||
|
||||
TEST_F(TrimCapabilitiesPassTest,
|
||||
PhysicalStorageBuffer_RemainsWithAliasedDecoration) {
|
||||
const std::string kTest = R"(
|
||||
OpCapability PhysicalStorageBufferAddresses
|
||||
; CHECK: OpCapability PhysicalStorageBufferAddresses
|
||||
OpCapability Shader
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint GLCompute %main "main"
|
||||
OpExecutionMode %main LocalSize 1 2 4
|
||||
OpDecorate %var AliasedPointer
|
||||
%void = OpTypeVoid
|
||||
%int = OpTypeInt 32 0
|
||||
%struct = OpTypeStruct %int
|
||||
%ptr = OpTypePointer Function %struct
|
||||
%3 = OpTypeFunction %void
|
||||
%main = OpFunction %void None %3
|
||||
%6 = OpLabel
|
||||
%var = OpVariable %ptr Function
|
||||
OpReturn
|
||||
OpFunctionEnd;
|
||||
)";
|
||||
const auto result =
|
||||
SinglePassRunAndMatch<TrimCapabilitiesPass>(kTest, /* skip_nop= */ false);
|
||||
EXPECT_EQ(std::get<1>(result), Pass::Status::SuccessWithoutChange);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace opt
|
||||
} // namespace spvtools
|
||||
|
Loading…
Reference in New Issue
Block a user