i965/fs: Restrict optimization that would fail for gen7's SENDs from GRFs
authorEric Anholt <eric@anholt.net>
Fri, 9 Nov 2012 19:48:20 +0000 (11:48 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 5 Dec 2012 00:58:46 +0000 (16:58 -0800)
v2: Fix SNB math bug in register_coalesce() where I was looking at the
    instruction to be removed, not the instruction to be copy propagated
    into.

src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 6ccc0d99743a2e76816f5334bba552c50b762e75..d0260af3e21b94d8cee62b171d06ba51c3bfcf28 100644 (file)
@@ -288,6 +288,24 @@ fs_inst::is_math()
            opcode == SHADER_OPCODE_POW);
 }
 
+bool
+fs_inst::is_send_from_grf()
+{
+   return opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7;
+}
+
+bool
+fs_visitor::can_do_source_mods(fs_inst *inst)
+{
+   if (intel->gen == 6 && inst->is_math())
+      return false;
+
+   if (inst->is_send_from_grf())
+      return false;
+
+   return true;
+}
+
 void
 fs_reg::init()
 {
@@ -1622,7 +1640,9 @@ fs_visitor::register_coalesce()
          inst->dst.type != inst->src[0].type)
         continue;
 
-      bool has_source_modifiers = inst->src[0].abs || inst->src[0].negate;
+      bool has_source_modifiers = (inst->src[0].abs ||
+                                   inst->src[0].negate ||
+                                   inst->src[0].file == UNIFORM);
 
       /* Found a move of a GRF to a GRF.  Let's see if we can coalesce
        * them: check for no writes to either one until the exit of the
@@ -1645,10 +1665,8 @@ fs_visitor::register_coalesce()
          * unusual register regions, so avoid coalescing those for
          * now.  We should do something more specific.
          */
-        if (intel->gen == 6 &&
-            scan_inst->is_math() &&
-            (has_source_modifiers || inst->src[0].file == UNIFORM)) {
-           interfered = true;
+        if (has_source_modifiers && !can_do_source_mods(scan_inst)) {
+            interfered = true;
            break;
         }
 
index dae781552697002d20bbaa8c89c6c0ea1256fede..ec4d486b68226a9003a95a023610ee3466c9dd27 100644 (file)
@@ -156,6 +156,7 @@ public:
    bool overwrites_reg(const fs_reg &reg);
    bool is_tex();
    bool is_math();
+   bool is_send_from_grf();
 
    fs_reg dst;
    fs_reg src[3];
@@ -222,6 +223,8 @@ public:
 
    void swizzle_result(ir_texture *ir, fs_reg orig_val, int sampler);
 
+   bool can_do_source_mods(fs_inst *inst);
+
    fs_inst *emit(fs_inst inst);
    fs_inst *emit(fs_inst *inst);
 
index d296e48c038fbb23fdd27847a64d948f53e7906e..c9c90284eac0649e2aadbb1aed2d6c3323632c29 100644 (file)
@@ -216,9 +216,8 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
 
    bool has_source_modifiers = entry->src.abs || entry->src.negate;
 
-   if (intel->gen == 6 && inst->is_math() &&
-       (has_source_modifiers || entry->src.file == UNIFORM ||
-        entry->src.smear != -1))
+   if ((has_source_modifiers || entry->src.file == UNIFORM ||
+        entry->src.smear != -1) && !can_do_source_mods(inst))
       return false;
 
    inst->src[arg].file = entry->src.file;