mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 02:38:04 +02:00
nir/loop_analyze: support loops with min/max and non-add incrementation
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Acked-by: Timothy Arceri <tarceri@itsqueeze.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26225>
This commit is contained in:
parent
fc1ebc67b1
commit
0cbe0d2968
2 changed files with 22 additions and 8 deletions
|
|
@ -959,20 +959,23 @@ get_iteration(nir_op cond_op, nir_const_value initial, nir_const_value step,
|
|||
static int32_t
|
||||
get_iteration_empirical(nir_scalar cond, nir_alu_instr *incr_alu,
|
||||
nir_scalar basis, nir_const_value initial,
|
||||
nir_scalar limit_basis, nir_const_value limit,
|
||||
bool invert_cond, unsigned execution_mode,
|
||||
unsigned max_unroll_iterations)
|
||||
{
|
||||
int iter_count = 0;
|
||||
nir_const_value result;
|
||||
nir_const_value iter = initial;
|
||||
|
||||
const nir_scalar incr = nir_get_scalar(&incr_alu->def, basis.comp);
|
||||
|
||||
const nir_scalar original[] = {basis, limit_basis};
|
||||
nir_const_value replacement[] = {initial, limit};
|
||||
|
||||
while (iter_count <= max_unroll_iterations) {
|
||||
bool success;
|
||||
|
||||
success = try_eval_const_alu(&result, cond, &basis, &iter,
|
||||
1, execution_mode);
|
||||
success = try_eval_const_alu(&result, cond, original, replacement,
|
||||
2, execution_mode);
|
||||
if (!success)
|
||||
return -1;
|
||||
|
||||
|
|
@ -982,11 +985,11 @@ get_iteration_empirical(nir_scalar cond, nir_alu_instr *incr_alu,
|
|||
|
||||
iter_count++;
|
||||
|
||||
success = try_eval_const_alu(&result, incr, &basis, &iter,
|
||||
1, execution_mode);
|
||||
success = try_eval_const_alu(&result, incr, original, replacement,
|
||||
2, execution_mode);
|
||||
assert(success);
|
||||
|
||||
iter = result;
|
||||
replacement[0] = result;
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
|
@ -1141,8 +1144,8 @@ calculate_iterations(nir_scalar basis, nir_scalar limit_basis,
|
|||
case nir_op_ishr:
|
||||
case nir_op_ushr:
|
||||
return get_iteration_empirical(cond, alu, basis, initial,
|
||||
invert_cond, execution_mode,
|
||||
max_unroll_iterations);
|
||||
limit_basis, limit, invert_cond,
|
||||
execution_mode, max_unroll_iterations);
|
||||
default:
|
||||
unreachable("Invalid induction variable increment operation.");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -302,6 +302,7 @@ INOT_COMPARE(ine)
|
|||
|
||||
CMP_MIN(ige, imin)
|
||||
CMP_MIN_REV(ige, imin)
|
||||
CMP_MIN(uge, umin)
|
||||
CMP_MIN(ige, fmin)
|
||||
CMP_MIN(uge, imin)
|
||||
CMP_MIN(ilt, imin)
|
||||
|
|
@ -1614,3 +1615,13 @@ UNKNOWN_COUNT_TEST(0x00000008, 0x00000004, 0xffffffff, ilt_imin, iadd)
|
|||
* }
|
||||
*/
|
||||
INEXACT_COUNT_TEST(0x00000008, 0x00000004, 0xffffffff, ilt_imax, iadd, 5)
|
||||
|
||||
/* uint i = 0x00000001;
|
||||
* while (true) {
|
||||
* if (i >= umin(vertex_id, 0x00000100))
|
||||
* break;
|
||||
*
|
||||
* i <<= 1;
|
||||
* }
|
||||
*/
|
||||
INEXACT_COUNT_TEST(0x00000001, 0x00000100, 0x00000001, uge_umin, ishl, 8)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue