SPIRV-Tools/source
Steven Perron 7075c49923
Add dummy loop in merge-return. (#1896)
The current implementation of merge return can create bad, but correct,
code.  When it is not in a loop construct, it will insert a lot of
extra branch around code.  The potentially large number of branches are
bad.  At the same time, it can separate code store to variables from
its uses hiding the fact that the store dominates the load.

This hurts the later analysis because the compiler thinks that multiple
values can reach a load, when there is really only 1.  This poorer
analysis leads to missed optimizations.

The solution is to create a dummy loop around the entire body of the
function, then we can break from that loop with a single branch.  Also
only new merge nodes would be those at the end of loops meaning that
most analysies will not be hurt.

Remove dead code for cases that are no longer possible.

It seems like some drivers expect there the be an OpSelectionMerge
before conditional branches, even if they are not strictly needed.
So we add them.
2018-09-18 08:52:47 -04:00
..
comp Use MakeUnique. (#1837) 2018-08-14 15:01:50 -04:00
link Move make_unique to source/util. (#1836) 2018-08-14 12:44:54 -04:00
opt Add dummy loop in merge-return. (#1896) 2018-09-18 08:52:47 -04:00
util Add option for the max id bound. (#1870) 2018-09-10 11:49:41 -04:00
val Add support for VK_KHR_shader_atomic_int64 in validator 2018-09-14 14:07:25 -04:00
assembly_grammar.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
assembly_grammar.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
binary.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
binary.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
cfa.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
CMakeLists.txt Add option for the max id bound. (#1870) 2018-09-10 11:49:41 -04:00
diagnostic.cpp Remove source/message.h (#1838) 2018-08-14 15:41:21 -04:00
diagnostic.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
disassemble.cpp Use MakeUnique. (#1837) 2018-08-14 15:01:50 -04:00
disassemble.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
enum_set.h Use MakeUnique. (#1837) 2018-08-14 15:01:50 -04:00
enum_string_mapping.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
enum_string_mapping.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
ext_inst.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
ext_inst.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
extensions.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
extensions.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
extinst.debuginfo.grammar.json Add asm, dis support for DebugInfo extended instruction set 2017-12-22 09:39:36 -05:00
extinst.spv-amd-gcn-shader.grammar.json Fix spelling in SPV_AMD_gcn_shader support 2017-04-03 14:59:18 -04:00
extinst.spv-amd-shader-ballot.grammar.json Add support for SPV AMD extensions 2017-06-21 15:08:07 -04:00
extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json Add support for SPV AMD extensions 2017-06-21 15:08:07 -04:00
extinst.spv-amd-shader-trinary-minmax.grammar.json Add support for SPV AMD extensions 2017-06-21 15:08:07 -04:00
id_descriptor.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
id_descriptor.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
instruction.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -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 Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
libspirv.cpp Add option for the max id bound. (#1870) 2018-09-10 11:49:41 -04:00
macro.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
name_mapper.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
name_mapper.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
opcode.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
opcode.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
operand.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
operand.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
parsed_operand.cpp Replace asserts with returns 2018-08-08 15:13:04 -04:00
parsed_operand.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
print.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -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 Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
spirv_definition.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
spirv_endian.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
spirv_endian.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
spirv_optimizer_options.cpp Add option for the max id bound. (#1870) 2018-09-10 11:49:41 -04:00
spirv_optimizer_options.h Add option for the max id bound. (#1870) 2018-09-10 11:49:41 -04:00
spirv_target_env.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
spirv_target_env.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
spirv_validator_options.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
spirv_validator_options.h Rewrite include guards (#1793) 2018-08-03 08:05:33 -04:00
table.cpp Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00
table.h Remove source/message.h (#1838) 2018-08-14 15:41:21 -04:00
text_handler.cpp Fix readbility/braces warnings (#1804) 2018-08-07 09:09:47 -04:00
text_handler.h Remove source/message.h (#1838) 2018-08-14 15:41:21 -04:00
text.cpp Remove source/message.h (#1838) 2018-08-14 15:41:21 -04:00
text.h Cleanup includes. (#1795) 2018-08-03 15:06:09 -04:00