mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 17:38:09 +02:00
nir/from_ssa: consider defs in sibling blocks
If def a and def b are in sibling blocks, the one with higher parent_instr's index does not necessarily come after the other. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3712 Fixes:943ddb9458"nir: Add a better out-of-SSA pass" Signed-off-by: Yevhenii Kolesnikov <yevhenii.kolesnikov@globallogic.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8246> (cherry picked from commitfd05620e43)
This commit is contained in:
parent
3dd7df6c24
commit
06faacb8b1
2 changed files with 19 additions and 2 deletions
|
|
@ -1084,7 +1084,7 @@
|
|||
"description": "nir/from_ssa: consider defs in sibling blocks",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "943ddb945877fc8a48dd7a435d40e1a9e7b9eead"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -45,6 +45,15 @@ struct from_ssa_state {
|
|||
};
|
||||
|
||||
/* Returns if def @a comes after def @b.
|
||||
*
|
||||
* The core observation that makes the Boissinot algorithm efficient
|
||||
* is that, given two properly sorted sets, we can check for
|
||||
* interference in these sets via a linear walk. This is accomplished
|
||||
* by doing single combined walk over union of the two sets in DFS
|
||||
* order. It doesn't matter what DFS we do so long as we're
|
||||
* consistent. Fortunately, the dominance algorithm we ran prior to
|
||||
* this pass did such a walk and recorded the pre- and post-indices in
|
||||
* the blocks.
|
||||
*
|
||||
* We treat SSA undefs as always coming before other instruction types.
|
||||
*/
|
||||
|
|
@ -57,7 +66,15 @@ def_after(nir_ssa_def *a, nir_ssa_def *b)
|
|||
if (b->parent_instr->type == nir_instr_type_ssa_undef)
|
||||
return true;
|
||||
|
||||
return a->parent_instr->index > b->parent_instr->index;
|
||||
/* If they're in the same block, we can rely on whichever instruction
|
||||
* comes first in the block.
|
||||
*/
|
||||
if (a->parent_instr->block == b->parent_instr->block)
|
||||
return a->parent_instr->index > b->parent_instr->index;
|
||||
|
||||
/* Otherwise, if blocks are distinct, we sort them in DFS pre-order */
|
||||
return a->parent_instr->block->dom_pre_index >
|
||||
b->parent_instr->block->dom_pre_index;
|
||||
}
|
||||
|
||||
/* Returns true if a dominates b */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue