i965: Fix accumulator_contains() test to also reject swizzles of the dst.
authorEric Anholt <eric@anholt.net>
Mon, 13 Aug 2012 06:30:18 +0000 (23:30 -0700)
committerEric Anholt <eric@anholt.net>
Sun, 26 Aug 2012 16:58:40 +0000 (09:58 -0700)
When faced with this sequence:

MOV R1, c[1];
MAD R0, R2, R1.x, R1.y;

we were concluding that the MOV of R1 set up our accumulator and so we could
just use the previous result.  Only, it's got R1.xyzw in it instead of the
r1.y we're looking for.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=46784
NOTE: This is a candidate for the 8.0 branch.

src/mesa/drivers/dri/i965/brw_vs_emit.c

index 6169f73741735cb9e4414403cfb1cb32c4954c2b..177b2b31a29ff8b272d2cd76edc2cd46f61f873d 100644 (file)
@@ -1743,7 +1743,7 @@ accumulator_contains(struct brw_vs_compile *c, struct brw_reg val)
    if (val.address_mode != BRW_ADDRESS_DIRECT)
       return false;
 
-   if (val.negate || val.abs)
+   if (val.negate || val.abs || val.dw1.bits.swizzle != BRW_SWIZZLE_XYZW)
       return false;
 
    switch (prev_insn->header.opcode) {