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 <sviatoslav.peleshko@globallogic.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26173>
(cherry picked from commit a6459e0f7b)
This commit is contained in:
Sviatoslav Peleshko
2023-11-13 13:40:10 +02:00
committed by Eric Engestrom
parent ab4a2e97a9
commit e17dfc075a
3 changed files with 15 additions and 2 deletions

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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)