[DTrace-devel] [PATCH 2/2] Optimize dt_cg_typecast() since shift amount is known

Kris Van Hees kris.van.hees at oracle.com
Tue Aug 25 18:44:03 PDT 2020


On Tue, Aug 25, 2020 at 05:55:27PM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> The typecast consists of shifting left and then right.  Since the shift
> amount is known at the time of code generation, some optimizations are
> possible.
> 
> Specifically, use IMM instructions to shift, thereby saving a register
> and the instruction needed to load it.
> 
> Further, if the shift amount is zero, generate no shift instructions
> at all.  This change happens to eliminate the BPF error encountered in
> test/unittest/variables/bvar/tst.curcpu.d so that it now passes.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

> ---
>  libdtrace/dt_cg.c                         | 28 ++++++++---------------
>  test/unittest/variables/bvar/tst.curcpu.d |  1 -
>  2 files changed, 10 insertions(+), 19 deletions(-)
> 
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index b9052b26..0d3463c1 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -1488,7 +1488,7 @@ dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
>  	size_t srcsize;
>  	size_t dstsize;
>  	struct bpf_insn instr;
> -	int reg, n;
> +	int n;
>  
>  	/* If the destination type is '@' (any type) we need not cast. */
>  	if (dst->dn_ctfp == NULL && dst->dn_type == CTF_ERR)
> @@ -1497,28 +1497,20 @@ dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
>  	srcsize = dt_node_type_size(src);
>  	dstsize = dt_node_type_size(dst);
>  
> -	if (dt_node_is_scalar(dst) && (dstsize < srcsize ||
> -	    (src->dn_flags & DT_NF_SIGNED) ^ (dst->dn_flags & DT_NF_SIGNED))) {
> -		if ((reg = dt_regset_alloc(drp)) == -1)
> -			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> -
> -		if (dstsize < srcsize)
> -			n = sizeof (uint64_t) * NBBY - dstsize * NBBY;
> -		else
> -			n = sizeof (uint64_t) * NBBY - srcsize * NBBY;
> -
> -		dt_cg_setx(dlp, reg, n);
> +	if (dstsize < srcsize)
> +		n = sizeof (uint64_t) * NBBY - dstsize * NBBY;
> +	else
> +		n = sizeof (uint64_t) * NBBY - srcsize * NBBY;
>  
> +	if (dt_node_is_scalar(dst) && n != 0 && (dstsize < srcsize ||
> +	    (src->dn_flags & DT_NF_SIGNED) ^ (dst->dn_flags & DT_NF_SIGNED))) {
>  		instr = BPF_MOV_REG(dst->dn_reg, src->dn_reg);
>  		dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> -		instr = BPF_ALU64_REG(BPF_LSH, dst->dn_reg, reg);
> +		instr = BPF_ALU64_IMM(BPF_LSH, dst->dn_reg, n);
>  		dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> -
> -		instr = BPF_ALU64_REG((dst->dn_flags & DT_NF_SIGNED) ?
> -		    BPF_ARSH : BPF_RSH, dst->dn_reg, reg);
> -
> +		instr = BPF_ALU64_IMM((dst->dn_flags & DT_NF_SIGNED) ?
> +		    BPF_ARSH : BPF_RSH, dst->dn_reg, n);
>  		dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> -		dt_regset_free(drp, reg);
>  	}
>  }
>  
> diff --git a/test/unittest/variables/bvar/tst.curcpu.d b/test/unittest/variables/bvar/tst.curcpu.d
> index 7e232e09..e0e266ff 100644
> --- a/test/unittest/variables/bvar/tst.curcpu.d
> +++ b/test/unittest/variables/bvar/tst.curcpu.d
> @@ -4,7 +4,6 @@
>   * Licensed under the Universal Permissive License v 1.0 as shown at
>   * http://oss.oracle.com/licenses/upl.
>   */
> -/* @@xfail: dtv2 */
>  
>  /*
>   * ASSERTION: The 'curcpu' variable can be accessed and is not -1.
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list