[Mesa-dev] [PATCH 2/2] r300/compiler: copy-propagate saturate mode when possible

Tom Stellard tom at stellard.net
Mon Feb 4 09:24:26 PST 2013


On Sun, Feb 03, 2013 at 06:22:42PM +0100, Marek Olšák wrote:
> ---

Hi Marek,

If you are interested in expanding the propagation of _SAT to instructions
besides MOV, you can look at peephole_mul_omod() as an example of how to
do this.

Anyway, these patches look good.

For the series:
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>



>  .../drivers/r300/compiler/radeon_optimize.c        |   21 ++++++++++++++++++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/drivers/r300/compiler/radeon_optimize.c b/src/gallium/drivers/r300/compiler/radeon_optimize.c
> index 0714d79..7be9d9e 100644
> --- a/src/gallium/drivers/r300/compiler/radeon_optimize.c
> +++ b/src/gallium/drivers/r300/compiler/radeon_optimize.c
> @@ -143,8 +143,7 @@ static void copy_propagate(struct radeon_compiler * c, struct rc_instruction * i
>  	unsigned int i;
>  
>  	if (inst_mov->U.I.DstReg.File != RC_FILE_TEMPORARY ||
> -	    inst_mov->U.I.WriteALUResult ||
> -	    inst_mov->U.I.SaturateMode)
> +	    inst_mov->U.I.WriteALUResult)
>  		return;
>  
>  	/* Get a list of all the readers of this MOV instruction. */
> @@ -156,6 +155,22 @@ static void copy_propagate(struct radeon_compiler * c, struct rc_instruction * i
>  	if (reader_data.Abort || reader_data.ReaderCount == 0)
>  		return;
>  
> +	/* We can propagate SaturateMode if all the readers are MOV instructions
> +	 * without a presubtract operation, source negation and absolute.
> +	 * In that case, we just move SaturateMode to all readers. */
> +        if (inst_mov->U.I.SaturateMode) {
> +		for (i = 0; i < reader_data.ReaderCount; i++) {
> +			struct rc_instruction * inst = reader_data.Readers[i].Inst;
> +
> +			if (inst->U.I.Opcode != RC_OPCODE_MOV ||
> +			    inst->U.I.SrcReg[0].File == RC_FILE_PRESUB ||
> +			    inst->U.I.SrcReg[0].Abs ||
> +			    inst->U.I.SrcReg[0].Negate) {
> +				return;
> +			}
> +		}
> +	}
> +
>  	/* Propagate the MOV instruction. */
>  	for (i = 0; i < reader_data.ReaderCount; i++) {
>  		struct rc_instruction * inst = reader_data.Readers[i].Inst;
> @@ -163,6 +178,8 @@ static void copy_propagate(struct radeon_compiler * c, struct rc_instruction * i
>  
>  		if (inst_mov->U.I.SrcReg[0].File == RC_FILE_PRESUB)
>  			inst->U.I.PreSub = inst_mov->U.I.PreSub;
> +		if (!inst->U.I.SaturateMode)
> +			inst->U.I.SaturateMode = inst_mov->U.I.SaturateMode;
>  	}
>  
>  	/* Finally, remove the original MOV instruction */
> -- 
> 1.7.10.4
> 


More information about the mesa-dev mailing list