nir: mark progress when removing trailing unused load_const channels
authorPavel Ondračka <pavel.ondracka@gmail.com>
Tue, 31 Jan 2023 12:57:22 +0000 (13:57 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 1 Feb 2023 20:33:31 +0000 (20:33 +0000)
When the unused channels were at the end and so no reswizzling was
needed, we wouldn't correctly mark the progress.

Fixes: 3305c960
Signed-off-by: Pavel Ondračka <pavel.ondracka@gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21014>

src/compiler/nir/nir_opt_shrink_vectors.c
src/compiler/nir/tests/opt_shrink_vectors_tests.cpp

index a31effa..90f44e3 100644 (file)
@@ -330,12 +330,15 @@ opt_shrink_vectors_load_const(nir_load_const_instr *instr)
       }
    }
 
+   if (progress)
+      reswizzle_alu_uses(def, reswizzle);
+
    unsigned rounded = round_up_components(num_components);
    assert(rounded <= def->num_components);
+   if (rounded < def->num_components)
+      progress = true;
 
    def->num_components = rounded;
-   if (progress)
-      reswizzle_alu_uses(def, reswizzle);
 
    return progress;
 }
index fef3632..4932911 100644 (file)
@@ -84,6 +84,41 @@ static void check_swizzle(nir_alu_src * src, const char * swizzle)
    }
 }
 
+TEST_F(nir_opt_shrink_vectors_test, opt_shrink_vectors_load_const_trailing_component_only)
+{
+   /* Test that opt_shrink_vectors correctly removes unused trailing channels
+    * of load_const.
+    *
+    * vec4 32 ssa_1 = load_const (1.0, 2.0, 3.0, 4.0)
+    * vec1 32 ssa_2 = fmov ssa_1.x
+    *
+    * to
+    *
+    * vec1 32 ssa_1 = load_const (1.0)
+    * vec1 32 ssa_2 = fmov ssa_1.x
+    */
+
+   nir_ssa_def *imm_vec = nir_imm_vec4(&bld, 1.0, 2.0, 3.0, 4.0);
+
+   nir_ssa_def *alu_result = nir_build_alu1(&bld, nir_op_mov, imm_vec);
+   nir_alu_instr *alu_instr = nir_instr_as_alu(alu_result->parent_instr);
+   set_swizzle(&alu_instr->src[0], "x");
+   alu_result->num_components = 1;
+   alu_instr->dest.write_mask = BITFIELD_MASK(1);
+
+   nir_store_var(&bld, out_var, alu_result, 1);
+
+   ASSERT_TRUE(nir_opt_shrink_vectors(bld.shader));
+
+   nir_validate_shader(bld.shader, NULL);
+
+   ASSERT_TRUE(imm_vec->num_components == 1);
+   nir_load_const_instr * imm_vec_instr = nir_instr_as_load_const(imm_vec->parent_instr);
+   ASSERT_TRUE(nir_const_value_as_float(imm_vec_instr->value[0], 32) == 1.0);
+
+   ASSERT_FALSE(nir_opt_shrink_vectors(bld.shader));
+}
+
 TEST_F(nir_opt_shrink_vectors_test, opt_shrink_vectors_alu_trailing_component_only)
 {
    /* Test that opt_shrink_vectors correctly removes unused trailing channels