Mesa (master): i965/vec4: Fix constant propagation across different types.

Francisco Jerez currojerez at kemper.freedesktop.org
Thu Feb 19 12:20:11 UTC 2015


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

Author: Francisco Jerez <currojerez at riseup.net>
Date:   Tue Feb  3 22:48:27 2015 +0200

i965/vec4: Fix constant propagation across different types.

If the source type differs from the original type of the constant we
need to bit-cast it before propagating, otherwise the original type
information will be lost.  If the constant was a vector float there
isn't much we can do, because the result of bit-casting the component
values of a vector float cannot itself be represented as an immediate.

Reviewed-by: Matt Turner <mattst88 at gmail.com>

---

 src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
index 674be51..679867c 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
@@ -122,6 +122,16 @@ try_constant_propagate(struct brw_context *brw, vec4_instruction *inst,
    if (value.file != IMM)
       return false;
 
+   if (value.type == BRW_REGISTER_TYPE_VF) {
+      /* The result of bit-casting the component values of a vector float
+       * cannot in general be represented as an immediate.
+       */
+      if (inst->src[arg].type != BRW_REGISTER_TYPE_F)
+         return false;
+   } else {
+      value.type = inst->src[arg].type;
+   }
+
    if (inst->src[arg].abs) {
       if ((brw->gen >= 8 && is_logic_op(inst->opcode)) ||
           !brw_abs_immediate(value.type, &value.fixed_hw_reg)) {




More information about the mesa-commit mailing list