This will be used to help find the trip count of loops that look like the following:
while (a < x && i < 8) { ... i++; } Where the NIR will end up looking something like this: vec1 32 ssa_0 = load_const (0x00000000 /* 0.000000 */) vec1 32 ssa_1 = load_const (0x00000008 /* 0.000000 */) loop { ... vec1 32 ssa_28 = ige ssa_26, ssa_3 vec1 32 ssa_29 = ige ssa_27, ssa_1 vec1 32 ssa_30 = iadd ssa_29, ssa_28 vec1 ssa_31 = ieq ssa_30, ssa_0 if ssa_31 { ... break } else { ... } ... } So in order to find the trip count we need to find the inverse of ige. --- src/compiler/nir/nir_loop_analyze.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/compiler/nir/nir_loop_analyze.c b/src/compiler/nir/nir_loop_analyze.c index 9a1962cfd8..b96c723f2a 100644 --- a/src/compiler/nir/nir_loop_analyze.c +++ b/src/compiler/nir/nir_loop_analyze.c @@ -672,6 +672,35 @@ calculate_iterations(nir_const_value *initial, nir_const_value *step, return -1; } +static nir_op +inverse_comparision(nir_alu_instr *alu) +{ + switch (alu->op) { + case nir_op_fge: + return nir_op_flt; + case nir_op_ige: + return nir_op_ilt; + case nir_op_uge: + return nir_op_ult; + case nir_op_flt: + return nir_op_fge; + case nir_op_ilt: + return nir_op_ige; + case nir_op_ult: + return nir_op_uge; + case nir_op_feq: + return nir_op_fne; + case nir_op_ieq: + return nir_op_ine; + case nir_op_fne: + return nir_op_feq; + case nir_op_ine: + return nir_op_ieq; + default: + unreachable("Unsuported comparision!"); + } +} + static bool is_supported_terminator_condition(nir_alu_instr *alu) { -- 2.19.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev