i965/vec4: unit test for copy propagation and writemask
authorChia-I Wu <olvaffe@gmail.com>
Mon, 14 Apr 2014 13:52:34 +0000 (21:52 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 18 Jun 2014 05:43:05 +0000 (13:43 +0800)
This unit test demonstrates a subtle bug fixed by
4ddf51db6af36736d5d42c1043eeea86e47459ce.

Signed-off-by: Chia-I Wu <olv@lunarg.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/test_vec4_copy_propagation.cpp

index cb70096e58cfd1900d42d6959bee3daa50568d31..fd517f87c096679900617dae2d2b4ba5efd7eb71 100644 (file)
@@ -154,3 +154,33 @@ TEST_F(copy_propagation_test, test_swizzle_swizzle)
                                                     SWIZZLE_X,
                                                     SWIZZLE_Y));
 }
+
+TEST_F(copy_propagation_test, test_swizzle_writemask)
+{
+   dst_reg a = dst_reg(v, glsl_type::vec4_type);
+   dst_reg b = dst_reg(v, glsl_type::vec4_type);
+   dst_reg c = dst_reg(v, glsl_type::vec4_type);
+
+   v->emit(v->MOV(b, swizzle(src_reg(a), BRW_SWIZZLE4(SWIZZLE_X,
+                                                      SWIZZLE_Y,
+                                                      SWIZZLE_X,
+                                                      SWIZZLE_Z))));
+
+   v->emit(v->MOV(writemask(a, WRITEMASK_XYZ), src_reg(1.0f)));
+
+   vec4_instruction *test_mov =
+      v->MOV(c, swizzle(src_reg(b), BRW_SWIZZLE4(SWIZZLE_W,
+                                                 SWIZZLE_W,
+                                                 SWIZZLE_W,
+                                                 SWIZZLE_W)));
+   v->emit(test_mov);
+
+   copy_propagation(v);
+
+   /* should not copy propagate */
+   EXPECT_EQ(test_mov->src[0].reg, b.reg);
+   EXPECT_EQ(test_mov->src[0].swizzle, BRW_SWIZZLE4(SWIZZLE_W,
+                                                    SWIZZLE_W,
+                                                    SWIZZLE_W,
+                                                    SWIZZLE_W));
+}