nir/peephole_select: Allow uniform/input loads and load_const
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 16 Mar 2015 22:08:04 +0000 (15:08 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 18 Mar 2015 00:11:05 +0000 (17:11 -0700)
Shader-db results on HSW:

total instructions in shared programs: 4174156 -> 4157291 (-0.40%)
instructions in affected programs:     145397 -> 128532 (-11.60%)
helped:                                383
HURT:                                  0
GAINED:                                20
LOST:                                  22

There are two more tests lost than gained.  However, comparing this with
GLSL IR vs. NIR results, the overall delta is reduced from 85/44
gained/lost on current master to 71/32 with this commit.  Therefore, I
think it's probably a boon since we are getting "closer" to where we were
before.

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/glsl/nir/nir_opt_peephole_select.c

index c9512bd62c955472fbd95eccc88186afc4441bef..b89451b09f9ecd3be7f821c718b7e3e9e5f38f4a 100644 (file)
@@ -56,6 +56,31 @@ block_check_for_allowed_instrs(nir_block *block)
 {
    nir_foreach_instr(block, instr) {
       switch (instr->type) {
+      case nir_instr_type_intrinsic: {
+         nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
+
+         switch (intrin->intrinsic) {
+         case nir_intrinsic_load_var:
+            switch (intrin->variables[0]->var->data.mode) {
+            case nir_var_shader_in:
+            case nir_var_uniform:
+               break;
+
+            default:
+               return false;
+            }
+            break;
+
+         default:
+            return false;
+         }
+
+         break;
+      }
+
+      case nir_instr_type_load_const:
+         break;
+
       case nir_instr_type_alu: {
          /* It must be a move operation */
          nir_alu_instr *mov = nir_instr_as_alu(instr);