}
}
+ 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;
}
}
}
+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