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)
