[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