nir/algebraic: disable inexact optimizations depending on float controls execution...
[mesa.git] / src / compiler / nir / nir_algebraic.py
index 3b136f800d443aef1bd02774a531c85146d9c972..783d0b692851dd926a15b60d6ae337e7094eefec 100644 (file)
@@ -1158,6 +1158,7 @@ ${pass_name}_block(nir_builder *build, nir_block *block,
                    const uint16_t *states, const bool *condition_flags)
 {
    bool progress = false;
+   const unsigned execution_mode = build->shader->info.float_controls_execution_mode;
 
    nir_foreach_instr_reverse_safe(instr, block) {
       if (instr->type != nir_instr_type_alu)
@@ -1167,6 +1168,7 @@ ${pass_name}_block(nir_builder *build, nir_block *block,
       if (!alu->dest.dest.is_ssa)
          continue;
 
+      unsigned bit_size = alu->dest.dest.ssa.bit_size;
       switch (states[alu->dest.dest.ssa.index]) {
 % for i in range(len(automaton.state_patterns)):
       case ${i}:
@@ -1174,6 +1176,9 @@ ${pass_name}_block(nir_builder *build, nir_block *block,
          for (unsigned i = 0; i < ARRAY_SIZE(${pass_name}_state${i}_xforms); i++) {
             const struct transform *xform = &${pass_name}_state${i}_xforms[i];
             if (condition_flags[xform->condition_offset] &&
+                !(xform->search->inexact &&
+                  (nir_is_float_control_signed_zero_inf_nan_preserve(execution_mode, bit_size) ||
+                   nir_is_denorm_flush_to_zero(execution_mode, bit_size))) &&
                 nir_replace_instr(build, alu, xform->search, xform->replace)) {
                progress = true;
                break;