mesa/src/compiler
Jason Ekstrand 9c2a11430e spirv: Rewrite CFG construction
This commit completely rewrites the way we extract a structured CFG from
SPIR-V.  The new approach is different in a few ways:

 1. It does a breadth-first search instead of depth-first.  This means
    that we've visited the merge node for a construct before we visit
    any of the nodes inside the construct.  This makes it easier to
    validate things like loop and switch nesting.

 2. We record more information in the CFG.  Earlier commits added a
    parent pointer to vtn_cf_node but we now record all of the merge and
    other special blocks for each CFG node.  This lets us validate
    things more precisely.

 3. It makes heavy use of merge blocks for walking the CFG.  Previously,
    we sort of used them as hints for trying to guess the CFG structure
    but things got dicey whenever a merge was missing.  We had some
    heuristics for how to handle short-circuiting if statements but it
    was a bunch of special cases.

    Now, we make them a fundamental part of walking the CFG.  When we
    encounter a control-flow construct, we add the body components of
    the construct to the BFS work list and then jump to the merge block
    if one exists to continue scanning the current CFG nesting level.
    If no merge block exists, we assume that means that control-flow
    never re-converges in a normal way and that the only way to get back
    to normality is with a direct jump such as a loop break or continue.
    This should make things far more robust when trying to deal with the
    more creative placement (or lack thereof) of merge instructions.

Reviewed-by: Alan Baker <alanbaker@google.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3820>
Closes: #2760
Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4446>
2020-04-24 16:29:24 +00:00
..
glsl glsl: remove some duplicate code from the nir uniform linker 2020-04-24 08:31:01 +00:00
nir nir/lower_subgroups: Mask off unused bits in ballot ops 2020-04-24 11:37:03 +00:00
spirv spirv: Rewrite CFG construction 2020-04-24 16:29:24 +00:00
Android.glsl.gen.mk mesa: android: Remove unnecessary dependency tracking rules 2019-05-06 11:29:25 +00:00
Android.glsl.mk
Android.mk
Android.nir.gen.mk nir: Add missing dependency in Android.nir.gen.mk 2019-08-19 09:53:18 +03:00
Android.nir.mk android: fix libmesa_nir build 2017-07-21 08:47:56 +03:00
builtin_type_macros.h glsl_types: vec8/vec16 support 2018-03-25 10:42:54 -04:00
glsl_types.cpp glsl: fix race in instance getters 2020-03-30 20:17:43 +00:00
glsl_types.h glsl: Add type queries for fp16+float and fp16+float+double 2020-03-09 16:31:08 +00:00
Makefile.sources glsl: Hard-code noise to zero in builtin_functions.cpp 2020-04-21 06:16:13 +00:00
meson.build meson: inline inc_common 2020-03-28 21:36:54 +01:00
nir_types.cpp nir/lower_amul: fix slot calculation 2020-04-06 18:00:17 +00:00
nir_types.h nir/lower_amul: fix slot calculation 2020-04-06 18:00:17 +00:00
SConscript spirv: Fix building with SCons 2018-03-30 14:33:03 -06:00
SConscript.glsl Move compiler.h and imports.h/c from src/mesa/main into src/util 2020-03-27 21:00:09 +00:00
SConscript.nir nir: mako all the intrinsics 2018-03-27 08:36:37 -04:00
SConscript.spirv spirv: Fix building with SCons 2018-03-30 14:33:03 -06:00
shader_enums.c compiler: add VARYING_SLOT_VIEWPORT_MASK 2020-04-15 20:12:00 -04:00
shader_enums.h compiler: add VARYING_SLOT_VIEWPORT_MASK 2020-04-15 20:12:00 -04:00
shader_info.h glsl: add NV_viewport_array2 support 2020-04-15 20:12:00 -04:00