Ever since
4246c2869c3c and
7d85dc4f350b loop unrolling can no
longer depend on inot being eliminated from the loop
terminator condition so we need to be able to handle it.
Here we simply check to see if the inot contains a simple
terminator condition we previously handled. We also update
the previous users of this function to use a newly name
copy of the previous behaviour
nir_is_terminator_condition_with_two_inputs().
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18006>
/* Limit terminator condition to loop unroll support case which is a simple
* comparison (ie. "i < count" is supported, but "i + 1 < count" is not).
*/
- if (nir_is_supported_terminator_condition(cond_scalar)) {
+ if (nir_is_terminator_condition_with_two_inputs(cond_scalar)) {
nir_alu_instr *alu = nir_instr_as_alu(cond->ssa->parent_instr);
/* One side of comparison is induction variable, the other side is
bool found_induction_var = false;
for (unsigned i = 0; i < 2; i++) {
nir_ssa_scalar src = nir_ssa_scalar_chase_alu_src(iand, i);
- if (nir_is_supported_terminator_condition(src) &&
+ if (nir_is_terminator_condition_with_two_inputs(src) &&
get_induction_and_limit_vars(src, ind, limit, limit_rhs, state)) {
*cond = src;
found_induction_var = true;
}
if (!basic_ind.def) {
- if (nir_is_supported_terminator_condition(cond)) {
+ if (nir_is_terminator_condition_with_two_inputs(cond)) {
get_induction_and_limit_vars(cond, &basic_ind,
&limit, &limit_rhs, state);
}
}
static inline bool
-nir_is_supported_terminator_condition(nir_ssa_scalar cond)
+nir_is_terminator_condition_with_two_inputs(nir_ssa_scalar cond)
{
if (!nir_ssa_scalar_is_alu(cond))
return false;
nir_op_infos[alu->op].num_inputs == 2;
}
+static inline bool
+nir_is_supported_terminator_condition(nir_ssa_scalar cond)
+{
+ if (!nir_ssa_scalar_is_alu(cond))
+ return false;
+
+ nir_alu_instr *alu = nir_instr_as_alu(cond.def->parent_instr);
+ return nir_alu_instr_is_comparison(alu) &&
+ (nir_op_infos[alu->op].num_inputs == 2 ||
+ (alu->op == nir_op_inot &&
+ nir_is_terminator_condition_with_two_inputs(nir_ssa_scalar_chase_alu_src(cond, 0))));
+}
+
#endif /* NIR_LOOP_ANALYZE_H */
/* Limit terminator condition to loop unroll support case which is a simple
* comparison (ie. "i < count" is supported, but "i + 1 < count" is not).
*/
- if (nir_is_supported_terminator_condition(cond_scalar)) {
+ if (nir_is_terminator_condition_with_two_inputs(cond_scalar)) {
nir_alu_instr *alu = nir_instr_as_alu(cond->ssa->parent_instr);
/* One side of comparison is induction variable, the other side is