Mesa (master): i965: Don' t dead-code eliminate instructions that write to the accumulator.

Matt Turner mattst88 at kemper.freedesktop.org
Mon Oct 7 17:46:21 UTC 2013


Module: Mesa
Branch: master
Commit: 92dc16c3e2e2b9e3e71baaccc67bbe727e9d68ab
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=92dc16c3e2e2b9e3e71baaccc67bbe727e9d68ab

Author: Matt Turner <mattst88 at gmail.com>
Date:   Thu Sep 19 19:31:31 2013 -0700

i965: Don't dead-code eliminate instructions that write to the accumulator.

Reviewed-by: Paul Berry <stereotype441 at gmail.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_fs.cpp   |   16 +++++++++++++++-
 src/mesa/drivers/dri/i965/brw_vec4.cpp |   16 +++++++++++++++-
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index b2c9f5a..b83aca4 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -1846,7 +1846,21 @@ fs_visitor::dead_code_eliminate()
       if (inst->dst.file == GRF) {
          assert(this->virtual_grf_end[inst->dst.reg] >= pc);
          if (this->virtual_grf_end[inst->dst.reg] == pc) {
-            inst->remove();
+            /* Don't dead code eliminate instructions that write to the
+             * accumulator as a side-effect. Instead just set the destination
+             * to the null register to free it.
+             */
+            switch (inst->opcode) {
+            case BRW_OPCODE_ADDC:
+            case BRW_OPCODE_SUBB:
+            case BRW_OPCODE_MACH:
+               inst->dst.file = ARF;
+               inst->dst.reg = BRW_ARF_NULL;
+               break;
+            default:
+               inst->remove();
+               break;
+            }
             progress = true;
          }
       }
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 75c3d34..790ff2e 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -314,7 +314,21 @@ vec4_visitor::dead_code_eliminate()
       if (inst->dst.file == GRF) {
          assert(this->virtual_grf_end[inst->dst.reg] >= pc);
          if (this->virtual_grf_end[inst->dst.reg] == pc) {
-            inst->remove();
+            /* Don't dead code eliminate instructions that write to the
+             * accumulator as a side-effect. Instead just set the destination
+             * to the null register to free it.
+             */
+            switch (inst->opcode) {
+            case BRW_OPCODE_ADDC:
+            case BRW_OPCODE_SUBB:
+            case BRW_OPCODE_MACH:
+               inst->dst.file = ARF;
+               inst->dst.reg = BRW_ARF_NULL;
+               break;
+            default:
+               inst->remove();
+               break;
+            }
             progress = true;
          }
       }




More information about the mesa-commit mailing list