nir: update nir_is_supported_terminator_condition()
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 11 Aug 2022 01:09:26 +0000 (11:09 +1000)
committerMarge Bot <emma+marge@anholt.net>
Thu, 8 Sep 2022 01:01:14 +0000 (01:01 +0000)
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>

src/compiler/nir/nir_inline_uniforms.c
src/compiler/nir/nir_loop_analyze.c
src/compiler/nir/nir_loop_analyze.h
src/gallium/frontends/lavapipe/lvp_inline_uniforms.c

index 57c29fc..c2331bb 100644 (file)
@@ -196,7 +196,7 @@ add_inlinable_uniforms(const nir_src *cond, nir_loop_info *info,
       /* 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
index 3b54a06..f9840da 100644 (file)
@@ -1035,7 +1035,7 @@ try_find_trip_count_vars_in_iand(nir_ssa_scalar *cond,
    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;
@@ -1097,7 +1097,7 @@ find_trip_count(loop_info_state *state, unsigned execution_mode)
       }
 
       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);
          }
index b095401..1317044 100644 (file)
@@ -94,7 +94,7 @@ nir_is_trivial_loop_if(nir_if *nif, nir_block *break_block)
 }
 
 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;
@@ -104,4 +104,17 @@ nir_is_supported_terminator_condition(nir_ssa_scalar cond)
           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 */
index c133b3d..76c0b51 100644 (file)
@@ -178,7 +178,7 @@ add_inlinable_uniforms(const nir_src *cond, nir_loop_info *info,
       /* 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