nir: add helper to return inversion op of a comparison

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_1 = load_const (0x00000004 /* 0.000000 */)
   loop {
      ...
      vec1 1 ssa_12 = ilt ssa_225, ssa_11
      vec1 1 ssa_17 = ilt ssa_226, ssa_1
      vec1 1 ssa_18 = iand ssa_12, ssa_17
      vec1 1 ssa_19 = inot ssa_18

      if ssa_19 {
         ...
         break
      } else {
         ...
      }
   }

So in order to find the trip count we need to find the inverse of
ilt.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Timothy Arceri
2018-12-06 11:17:45 +11:00
parent 090feaacdc
commit f219f6114d

View File

@@ -734,6 +734,35 @@ calculate_iterations(nir_const_value *initial, nir_const_value *step,
return -1;
}
static nir_op
inverse_comparison(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 comparison!");
}
}
static bool
is_supported_terminator_condition(nir_alu_instr *alu)
{