[DTrace-devel] [PATCH 1/4] clean up dt_cg_typecast(): unnecessary move from register to itself

eugene.loh at oracle.com eugene.loh at oracle.com
Tue Aug 11 15:11:09 PDT 2020


From: Eugene Loh <eugene.loh at oracle.com>

The unnecessary move is here:
    1147    instr = BPF_MOV_REG(dst->dn_reg, src->dn_reg);
    1148    dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));

This move is unnecessary because dt_cg_typeset()'s callers always
set dst->dn_reg=src->dn_reg:

    $ grep -B 1 dt_cg_typecast dtrace-user/libdtrace/dt_cg.c
    static void
    dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
    --
        isp->dis_args[i].dn_reg = dnp->dn_reg; /* re-use register */
        dt_cg_typecast(dnp, &isp->dis_args[i], dlp, drp);
    --
        mnp->dn_reg = mnp->dn_membexpr->dn_reg;
        dt_cg_typecast(mnp->dn_membexpr, mnp, dlp, drp);
    --
        dnp->dn_reg = inp->din_root->dn_reg;
        dt_cg_typecast(inp->din_root, dnp, dlp, drp);
    --
        dnp->dn_reg = dnp->dn_right->dn_reg;
        dt_cg_typecast(dnp->dn_right, dnp, dlp, drp);
    --
        dnp->dn_reg = mnp->dn_membexpr->dn_reg;
        dt_cg_typecast(mnp->dn_membexpr, dnp, dlp, drp);

Indeed, dt_cg_typecast() expects src and dst will already be in
the same register.  For example, there is no move from src->dn_reg
to dst->dn_reg if no extra typecast is needed.  And historically,
that register move never existed;  it was introduced in the port
to BPF:

    % git show ad8e9312f5c2
    [...]
    Convert the D compiler to generate BPF
    [...]
    diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
    [...]
    @@ -464,12 +482,13 @@ dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
    [...]

    +   instr = BPF_MOV_REG(dst->dn_reg, src->dn_reg);
    +   dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
    -   instr = DIF_INSTR_FMT(DIF_OP_SLL,
    -       src->dn_reg, reg, dst->dn_reg);
    +   instr = BPF_ALU64_REG(BPF_LSH, dst->dn_reg, reg);
        dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));

    -   instr = DIF_INSTR_FMT((dst->dn_flags & DT_NF_SIGNED) ?
    -       DIF_OP_SRA : DIF_OP_SRL, dst->dn_reg, reg, dst->dn_reg);
    +   instr = BPF_ALU64_REG((dst->dn_flags & DT_NF_SIGNED) ?
    +       BPF_ARSH : BPF_RSH, dst->dn_reg, reg);

        dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
        dt_regset_free(drp, reg);

Note that the left- and right-shift instructions are converted to
BPF;  meanwhile, the BPF_MOV_REG() instruction is introduced with
no precedent in legacy DTrace.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_cg.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 0b8cd1d6..4f657967 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1144,8 +1144,6 @@ dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
 
 		dt_cg_setx(dlp, reg, n);
 
-		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);
 		dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
 
-- 
2.18.4




More information about the DTrace-devel mailing list