[Mesa-dev] [PATCH 1/2] i965/vec4: Add a pass to reduce swizzles.
Kenneth Graunke
kenneth at whitecape.org
Mon Aug 18 17:22:32 PDT 2014
On Monday, August 18, 2014 12:24:14 PM Matt Turner wrote:
> total instructions in shared programs: 4344280 -> 4288033 (-1.29%)
> instructions in affected programs: 397468 -> 341221 (-14.15%)
> ---
> Suggestions for a better name are welcome.
I like the name.
>
> src/mesa/drivers/dri/i965/brw_vec4.cpp | 98 ++++++++++++++++++++++++++++++++++
> src/mesa/drivers/dri/i965/brw_vec4.h | 1 +
> 2 files changed, 99 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> index 5d4a92c..c1363ca 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -311,6 +311,103 @@ src_reg::equals(const src_reg &r) const
> sizeof(fixed_hw_reg)) == 0);
> }
>
> +/* Replaces unused channels of a swizzle with channels that are used.
> + *
> + * For instance, this pass transforms
> + *
> + * mov vgrf4.yz, vgrf5.wxzy
> + *
> + * into
> + *
> + * mov vgrf4.yz, vgrf5.xxzx
> + *
> + * This eliminates false uses of some channels, letting dead code elimination
> + * remove the instructions that wrote them.
> + */
> +bool
> +vec4_visitor::opt_reduce_swizzle()
> +{
> + bool progress = false;
> +
> + foreach_in_list_safe(vec4_instruction, inst, &instructions) {
> + if (inst->dst.file == BAD_FILE || inst->dst.file == HW_REG)
> + continue;
> +
> + int swizzle[4];
> +
> + /* Determine which channels of the sources are read. */
> + switch (inst->opcode) {
> + case BRW_OPCODE_DP4:
> + case BRW_OPCODE_DPH: /* FINISHME: DPH reads only three channels of src0,
> + * but all four of src1.
> + */
> + swizzle[0] = 0;
> + swizzle[1] = 1;
> + swizzle[2] = 2;
> + swizzle[3] = 3;
> + break;
> + case BRW_OPCODE_DP3:
> + swizzle[0] = 0;
> + swizzle[1] = 1;
> + swizzle[2] = 2;
> + swizzle[3] = -1;
> + break;
> + case BRW_OPCODE_DP2:
> + swizzle[0] = 0;
> + swizzle[1] = 1;
> + swizzle[2] = -1;
> + swizzle[3] = -1;
> + break;
> + default:
> + swizzle[0] = inst->dst.writemask & WRITEMASK_X ? 0 : -1;
> + swizzle[1] = inst->dst.writemask & WRITEMASK_Y ? 1 : -1;
> + swizzle[2] = inst->dst.writemask & WRITEMASK_Z ? 2 : -1;
> + swizzle[3] = inst->dst.writemask & WRITEMASK_W ? 3 : -1;
> + break;
> + }
> +
> + /* Resolve unread channels (-1) by assigning them the swizzle of the
> + * first channel that is used.
> + */
> + int chosen = 0;
Perhaps "int first_used_channel = 0;"?
Either way, this patch is:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Great work! :)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140818/1672df61/attachment-0001.sig>
More information about the mesa-dev
mailing list