Module: Mesa
Branch: staging/23.3
Commit: e17dfc075a4b2f339faaac6ef051836b6f7dd880
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e17dfc075a4b2f339faaac6ef051836b6f7dd880

Author: Sviatoslav Peleshko <[email protected]>
Date:   Mon Nov 13 13:40:10 2023 +0200

nir/loop_analyze: Don't test non-positive iterations count

Testing negative iterations count makes no sense, and can cause issues
when the unsigned type is used.
Testing 0 iterations is already covered with
will_break_on_first_iteration, so it can be skipped too.

Fixes: 6772a17a ("nir: Add a loop analysis pass")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9913
Signed-off-by: Sviatoslav Peleshko <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26173>
(cherry picked from commit a6459e0f7bcb662130c79764ccf54ccfa9151182)

---

 .pick_status.json                             |  2 +-
 src/compiler/nir/nir_loop_analyze.c           |  4 +++-
 src/compiler/nir/tests/loop_analyze_tests.cpp | 11 +++++++++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 446acdb8812..a10aa151b66 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -204,7 +204,7 @@
         "description": "nir/loop_analyze: Don't test non-positive iterations 
count",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "6772a17acc8ee90f9398348251a4455f988208fd",
         "notes": null
diff --git a/src/compiler/nir/nir_loop_analyze.c 
b/src/compiler/nir/nir_loop_analyze.c
index f468d2316e5..d9c0492a065 100644
--- a/src/compiler/nir/nir_loop_analyze.c
+++ b/src/compiler/nir/nir_loop_analyze.c
@@ -1138,11 +1138,13 @@ calculate_iterations(nir_def *basis, nir_def 
*limit_basis,
     */
    for (int bias = -1; bias <= 1; bias++) {
       const int iter_bias = iter_int + bias;
+      if (iter_bias < 1)
+         continue;
 
       if (test_iterations(iter_bias, step, limit, alu_op, bit_size,
                           induction_base_type, initial,
                           limit_rhs, invert_cond, execution_mode)) {
-         return iter_bias > 0 ? iter_bias - trip_offset : iter_bias;
+         return iter_bias - trip_offset;
       }
    }
 
diff --git a/src/compiler/nir/tests/loop_analyze_tests.cpp 
b/src/compiler/nir/tests/loop_analyze_tests.cpp
index f7c3c41d750..a530b7f226c 100644
--- a/src/compiler/nir/tests/loop_analyze_tests.cpp
+++ b/src/compiler/nir/tests/loop_analyze_tests.cpp
@@ -285,6 +285,7 @@ COMPARE_REVERSE(ishl)
 
 INOT_COMPARE(ilt_rev)
 INOT_COMPARE(ine)
+INOT_COMPARE(uge_rev)
 
 #define KNOWN_COUNT_TEST(_init_value, _cond_value, _incr_value, cond, incr, 
count) \
    TEST_F(nir_loop_analyze_test, incr ## _ ## cond ## _known_count_ ## count)  
  \
@@ -567,6 +568,16 @@ KNOWN_COUNT_TEST_INVERT(0x00000000, 0x00000001, 
0x00000006, ige, iadd, 5)
  */
 KNOWN_COUNT_TEST(0x0000000a, 0x00000005, 0xffffffff, inot_ilt_rev, iadd, 5)
 
+/*    uint i = 0;
+ *    while (true) {
+ *       if (!(0 >= i))
+ *          break;
+ *
+ *       i += 1;
+ *    }
+ */
+KNOWN_COUNT_TEST(0x00000000, 0x00000000, 0x00000001, inot_uge_rev, iadd, 1)
+
 /*    uint i = 0;
  *    while (true) {
  *       if (i != 0)

Reply via email to