nir/algebraic: disable inexact optimizations depending on float controls execution...
authorSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Wed, 12 Dec 2018 15:29:13 +0000 (16:29 +0100)
committerAndres Gomez <agomez@igalia.com>
Tue, 17 Sep 2019 20:39:18 +0000 (23:39 +0300)
If FLOAT_CONTROLS_SIGNED_ZERO_INF_NAN_PRESERVE or
FLOAT_CONTROLS_DENORM_FLUSH_TO_ZERO are enabled, do not apply the
inexact optimizations so the VK_KHR_shader_float_controls execution
mode is respected.

v2:
- Do not apply inexact optimizations if SHADER_DENORM_FLUSH_TO_ZERO is
  enabled (Andres).

v3:
- Updated to renamed shader info member (Andres).

v4:
- Directly access execution mode instead of dragging it by parameter (Caio).

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Signed-off-by: Andres Gomez <agomez@igalia.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com> [v1]
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;