i965/fs: Allow constant propagation between different types
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 16 Oct 2014 18:45:44 +0000 (11:45 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 13 Jan 2015 21:24:52 +0000 (13:24 -0800)
This will be needed for NIR because it is typeless and treats all constants
as uint32 values and reinterprets them when they are used later.  This
commit allows those values to be properly propagated.

Also, this helps some synmark shaders because it allows us to copy
propagate a 0x00000000UD into a 0.0F in a load_payload, which then lets us
combine 4 load_payloads.

instructions in affected programs:     2288 -> 2144 (-6.29%)

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 611cff13846a6da7309e874a3f54e08d11bc8967..70f417fd2a8bac3a5837e8bcd2a173c6415e69af 100644 (file)
@@ -433,8 +433,7 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
          continue;
 
       assert(entry->dst.file == GRF);
-      if (inst->src[i].reg != entry->dst.reg ||
-          inst->src[i].type != entry->dst.type)
+      if (inst->src[i].reg != entry->dst.reg)
          continue;
 
       /* Bail if inst is reading a range that isn't contained in the range
@@ -454,6 +453,7 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
 
       fs_reg val = entry->src;
       val.effective_width = inst->src[i].effective_width;
+      val.type = inst->src[i].type;
 
       switch (inst->opcode) {
       case BRW_OPCODE_MOV: