SPIRV-Tools/source
Cassandra Beckley 1bc0e6f59a
Add a new legalization pass to dedupe invocation interlock instructions (#5409)
Add a new legalization pass to dedupe invocation interlock instructions

DXC will be adding support for HLSL's rasterizer ordered views by using
the SPV_EXT_fragment_shader_interlock_extension. That extension
stipulates that if an entry point has an interlock ordering execution
mode, it must dynamically execute OpBeginInvocationInterlockEXT and
OpEndInvocationInterlockEXT, in that order, exactly once. This would be
difficult to determine in DXC's SPIR-V backend, so instead we will emit
these instructions potentially multiple times, and use this legalization
pass to ensure that the final SPIR-V follows the specification.

This PR uses data-flow analysis to determine where to place begin and
end instructions; in essence, determining whether a block contains or is
preceded by a begin instruction is similar to a specialized case of a
reaching definitions analysis, where we have only a single definition,
such as `bool has_begun = false`. For this simpler case, we can compute
the set of blocks using BFS to determine the reachability of the begin
instruction.

We need to do this for both begin and end instructions, so I have
generalized portions of the code to run both forward and backward over
the CFG for each respective case.
2023-09-27 19:54:10 -04:00
..
diff Add support for LiteralFloat type (#5323) 2023-07-17 11:16:01 -04:00
fuzz Do not define GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE if it is already defined. (#5200) 2023-04-18 15:47:10 -04:00
link linker: Add --use-highest-version option (#5376) 2023-08-21 17:05:33 -06:00
lint cmake: Modernize install(TARGET) usage (#5056) 2023-01-16 10:55:35 -05:00
opt Add a new legalization pass to dedupe invocation interlock instructions (#5409) 2023-09-27 19:54:10 -04:00
reduce cmake: Modernize install(TARGET) usage (#5056) 2023-01-16 10:55:35 -05:00
util Remove use of deprecated std::aligned_storage (#5183) 2023-04-06 17:22:28 +02:00
val val: re-add ImageMSArray validation (#5394) 2023-09-07 09:39:28 -04:00
wasm build: remove last references of c++11 (#5295) 2023-06-28 05:37:55 -07:00
assembly_grammar.cpp Move token version/cap/ext checks from parsing to validation (#5370) 2023-08-10 12:19:12 -04:00
assembly_grammar.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
binary.cpp Add support for LiteralFloat type (#5323) 2023-07-17 11:16:01 -04:00
binary.h Fix endianness of string literals (#4622) 2021-12-08 12:01:26 -05:00
cfa.h Prevent null pointer from being dereferenced (#4971) 2022-10-24 15:16:33 -04:00
CMakeLists.txt cmake: Use modern Python3 CMake support (#5277) 2023-06-19 15:02:41 -04:00
common_debug_info.h spirv-opt: Switch from Vulkan.DebugInfo to Shader.DebugInfo (#4493) 2021-09-15 14:38:53 -04:00
diagnostic.cpp fix strncpy bound error (#4331) 2021-06-29 10:07:13 -04:00
diagnostic.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
disassemble.cpp Add support for LiteralFloat type (#5323) 2023-07-17 11:16:01 -04:00
disassemble.h Fix segfault in SpirvTools::Disassemble when printing (#4833) 2022-06-29 12:05:00 -04:00
enum_set.h enumset: add iterator based constructor/insert (#5344) 2023-07-20 17:54:50 +00:00
enum_string_mapping.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
enum_string_mapping.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
ext_inst.cpp Vulkan 1.3 (#4686) 2022-01-25 10:36:08 -05:00
ext_inst.h Fix various source comment (doxygen) typos (#4680) 2022-01-26 15:13:08 -05:00
extensions.cpp NFC: replace EnumSet::ForEach with range-based-for (#5322) 2023-07-13 14:40:47 -04:00
extensions.h NFC: rewrite EnumSet to handle larger enums. (#5289) 2023-07-07 10:41:52 -04:00
instruction.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
latest_version_glsl_std_450_header.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
latest_version_opencl_std_header.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
latest_version_spirv_header.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
libspirv.cpp libspirv.cpp: adds c++ api for spvBinaryParse (#5109) 2023-02-14 14:08:20 -05:00
macro.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
name_mapper.cpp Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
name_mapper.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
opcode.cpp SPV_KHR_cooperative_matrix (#5286) 2023-06-22 18:33:36 -04:00
opcode.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
operand.cpp Update SPIRV-Headers, add cache control operand kinds (#5406) 2023-09-13 17:43:12 -04:00
operand.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
parsed_operand.cpp Add support for LiteralFloat type (#5323) 2023-07-17 11:16:01 -04:00
parsed_operand.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
pch_source.cpp Enable precompiled headers for spirv-tools(-shared) and some unit tests (#2026) 2018-11-06 09:26:23 -05:00
pch_source.h Enable precompiled headers for spirv-tools(-shared) and some unit tests (#2026) 2018-11-06 09:26:23 -05:00
print.cpp QNX has support for ANSI ESC codes, default terminal is QANSI. (#5387) 2023-08-30 14:51:03 -04:00
print.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
software_version.cpp Add missing function parameters in libspirv.h 2018-04-03 10:10:43 -04:00
spirv_constant.h Fix Linker generator ID (#4601) 2021-10-29 10:32:41 -04:00
spirv_definition.h Fix various source comment (doxygen) typos (#4680) 2022-01-26 15:13:08 -05:00
spirv_endian.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
spirv_endian.h Fix various source comment (doxygen) typos (#4680) 2022-01-26 15:13:08 -05:00
spirv_fuzzer_options.cpp spirv-fuzz: Add pass recommendations (#3757) 2020-09-18 15:51:35 +01:00
spirv_fuzzer_options.h spirv-fuzz: Add pass recommendations (#3757) 2020-09-18 15:51:35 +01:00
spirv_optimizer_options.cpp Add —preserve-bindings and —preserve-spec-constants (#2693) 2019-07-10 14:12:19 -04:00
spirv_optimizer_options.h Add —preserve-bindings and —preserve-spec-constants (#2693) 2019-07-10 14:12:19 -04:00
spirv_reducer_options.cpp spirv-reduce: Support reducing a specific function (#3774) 2020-09-11 06:29:43 +01:00
spirv_reducer_options.h spirv-reduce: Support reducing a specific function (#3774) 2020-09-11 06:29:43 +01:00
spirv_target_env.cpp Explicitly #include <utility> in spirv_target_env.cpp (#5159) 2023-03-15 13:15:29 +01:00
spirv_target_env.h Fix various source comment (doxygen) typos (#4680) 2022-01-26 15:13:08 -05:00
spirv_validator_options.cpp spirv-val: Add an option to use friendly names or not (#4951) 2022-09-30 12:22:00 -04:00
spirv_validator_options.h spirv-val: Add an option to use friendly names or not (#4951) 2022-09-30 12:22:00 -04:00
table.cpp Vulkan 1.3 (#4686) 2022-01-25 10:36:08 -05:00
table.h Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
text_handler.cpp Switch SPIRV-Tools to use spirv.hpp11 internally (#4981) 2022-11-04 17:27:10 -04:00
text_handler.h Remove source/message.h (#1838) 2018-08-14 15:41:21 -04:00
text.cpp Add support for LiteralFloat type (#5323) 2023-07-17 11:16:01 -04:00
text.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00