mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 04:10:09 +01:00
nir/instr_set: Expose nir_instrs_equal()
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
parent
64328f947e
commit
6e984bcb92
2 changed files with 62 additions and 59 deletions
|
|
@ -2976,6 +2976,7 @@ NIR_SRC_AS_(deref, nir_deref_instr, nir_instr_type_deref, nir_instr_as_deref)
|
|||
|
||||
bool nir_src_is_dynamically_uniform(nir_src src);
|
||||
bool nir_srcs_equal(nir_src src1, nir_src src2);
|
||||
bool nir_instrs_equal(const nir_instr *instr1, const nir_instr *instr2);
|
||||
void nir_instr_rewrite_src(nir_instr *instr, nir_src *src, nir_src new_src);
|
||||
void nir_instr_move_src(nir_instr *dest_instr, nir_src *dest, nir_src *src);
|
||||
void nir_if_rewrite_condition(nir_if *if_stmt, nir_src new_src);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,64 @@
|
|||
#include "nir_vla.h"
|
||||
#include "util/half_float.h"
|
||||
|
||||
static bool
|
||||
src_is_ssa(nir_src *src, void *data)
|
||||
{
|
||||
(void) data;
|
||||
return src->is_ssa;
|
||||
}
|
||||
|
||||
static bool
|
||||
dest_is_ssa(nir_dest *dest, void *data)
|
||||
{
|
||||
(void) data;
|
||||
return dest->is_ssa;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
instr_each_src_and_dest_is_ssa(const nir_instr *instr)
|
||||
{
|
||||
if (!nir_foreach_dest((nir_instr *)instr, dest_is_ssa, NULL) ||
|
||||
!nir_foreach_src((nir_instr *)instr, src_is_ssa, NULL))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* This function determines if uses of an instruction can safely be rewritten
|
||||
* to use another identical instruction instead. Note that this function must
|
||||
* be kept in sync with hash_instr() and nir_instrs_equal() -- only
|
||||
* instructions that pass this test will be handed on to those functions, and
|
||||
* conversely they must handle everything that this function returns true for.
|
||||
*/
|
||||
static bool
|
||||
instr_can_rewrite(const nir_instr *instr)
|
||||
{
|
||||
/* We only handle SSA. */
|
||||
assert(instr_each_src_and_dest_is_ssa(instr));
|
||||
|
||||
switch (instr->type) {
|
||||
case nir_instr_type_alu:
|
||||
case nir_instr_type_deref:
|
||||
case nir_instr_type_tex:
|
||||
case nir_instr_type_load_const:
|
||||
case nir_instr_type_phi:
|
||||
return true;
|
||||
case nir_instr_type_intrinsic:
|
||||
return nir_intrinsic_can_reorder(nir_instr_as_intrinsic(instr));
|
||||
case nir_instr_type_call:
|
||||
case nir_instr_type_jump:
|
||||
case nir_instr_type_ssa_undef:
|
||||
return false;
|
||||
case nir_instr_type_parallel_copy:
|
||||
default:
|
||||
unreachable("Invalid instruction type");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
#define HASH(hash, data) _mesa_fnv32_1a_accumulate((hash), (data))
|
||||
|
||||
static uint32_t
|
||||
|
|
@ -482,9 +540,11 @@ nir_alu_srcs_equal(const nir_alu_instr *alu1, const nir_alu_instr *alu2,
|
|||
* the same hash for (ignoring collisions, of course).
|
||||
*/
|
||||
|
||||
static bool
|
||||
bool
|
||||
nir_instrs_equal(const nir_instr *instr1, const nir_instr *instr2)
|
||||
{
|
||||
assert(instr_can_rewrite(instr1) && instr_can_rewrite(instr2));
|
||||
|
||||
if (instr1->type != instr2->type)
|
||||
return false;
|
||||
|
||||
|
|
@ -691,64 +751,6 @@ nir_instrs_equal(const nir_instr *instr1, const nir_instr *instr2)
|
|||
unreachable("All cases in the above switch should return");
|
||||
}
|
||||
|
||||
static bool
|
||||
src_is_ssa(nir_src *src, void *data)
|
||||
{
|
||||
(void) data;
|
||||
return src->is_ssa;
|
||||
}
|
||||
|
||||
static bool
|
||||
dest_is_ssa(nir_dest *dest, void *data)
|
||||
{
|
||||
(void) data;
|
||||
return dest->is_ssa;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
instr_each_src_and_dest_is_ssa(nir_instr *instr)
|
||||
{
|
||||
if (!nir_foreach_dest(instr, dest_is_ssa, NULL) ||
|
||||
!nir_foreach_src(instr, src_is_ssa, NULL))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* This function determines if uses of an instruction can safely be rewritten
|
||||
* to use another identical instruction instead. Note that this function must
|
||||
* be kept in sync with hash_instr() and nir_instrs_equal() -- only
|
||||
* instructions that pass this test will be handed on to those functions, and
|
||||
* conversely they must handle everything that this function returns true for.
|
||||
*/
|
||||
|
||||
static bool
|
||||
instr_can_rewrite(nir_instr *instr)
|
||||
{
|
||||
/* We only handle SSA. */
|
||||
assert(instr_each_src_and_dest_is_ssa(instr));
|
||||
|
||||
switch (instr->type) {
|
||||
case nir_instr_type_alu:
|
||||
case nir_instr_type_deref:
|
||||
case nir_instr_type_tex:
|
||||
case nir_instr_type_load_const:
|
||||
case nir_instr_type_phi:
|
||||
return true;
|
||||
case nir_instr_type_intrinsic:
|
||||
return nir_intrinsic_can_reorder(nir_instr_as_intrinsic(instr));
|
||||
case nir_instr_type_call:
|
||||
case nir_instr_type_jump:
|
||||
case nir_instr_type_ssa_undef:
|
||||
return false;
|
||||
case nir_instr_type_parallel_copy:
|
||||
default:
|
||||
unreachable("Invalid instruction type");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static nir_ssa_def *
|
||||
nir_instr_get_dest_ssa_def(nir_instr *instr)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue