nir: Optimize out discard_ifs with a constant 0 argument.
authorEric Anholt <eric@anholt.net>
Wed, 16 Mar 2016 01:32:19 +0000 (18:32 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 28 Sep 2016 15:31:14 +0000 (08:31 -0700)
I found this in a shader that was doing an alpha test when alpha is fixed
at 1.0.

v2: Rebase on master (now the const value is "u32" not "u").

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> (v1)
src/compiler/nir/nir_opt_constant_folding.c

index 8f040619bfaeeb5cc99de326e9ba8c29152a214e..d6be807b3dcbd58dcc890b7e64ece191256206d0 100644 (file)
@@ -155,6 +155,14 @@ constant_fold_intrinsic_instr(nir_intrinsic_instr *instr)
       progress |= constant_fold_deref(&instr->instr, instr->variables[i]);
    }
 
+   if (instr->intrinsic == nir_intrinsic_discard_if) {
+      nir_const_value *src_val = nir_src_as_const_value(instr->src[0]);
+      if (src_val && src_val->u32[0] == 0) {
+         nir_instr_remove(&instr->instr);
+         progress = true;
+      }
+   }
+
    return progress;
 }