Message ID | 20250415192515.232910-113-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | tcg: Convert to TCGOutOp structures | expand |
On 4/15/25 12:24, Richard Henderson wrote: > Sink the sets of the def, nb_iargs, nb_oargs variables to > the default and do_not_remove labels. They're not really > needed beforehand, and it avoids preceding code from having > to keep them up-to-date. Note that def was *not* kept > up-to-date; thankfully only def->flags had been used and > those bits were constant between opcode changes. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/tcg.c | 20 +++++++------------- > 1 file changed, 7 insertions(+), 13 deletions(-) > > diff --git a/tcg/tcg.c b/tcg/tcg.c > index 9da6c8bb4d..381e76cfc8 100644 > --- a/tcg/tcg.c > +++ b/tcg/tcg.c > @@ -4071,8 +4071,6 @@ liveness_pass_1(TCGContext *s) > case INDEX_op_sub2_i64: > opc_new = INDEX_op_sub; > do_addsub2: > - nb_iargs = 4; > - nb_oargs = 2; > /* Test if the high part of the operation is dead, but not > the low part. The result can be optimized to a simple > add or sub. This happens often for x86_64 guest when the > @@ -4087,8 +4085,6 @@ liveness_pass_1(TCGContext *s) > op->args[1] = op->args[2]; > op->args[2] = op->args[4]; > /* Fall through and mark the single-word operation live. */ > - nb_iargs = 2; > - nb_oargs = 1; > } > goto do_not_remove; > > @@ -4100,8 +4096,6 @@ liveness_pass_1(TCGContext *s) > opc_new = INDEX_op_mul; > opc_new2 = INDEX_op_muluh; > do_mul2: > - nb_iargs = 2; > - nb_oargs = 2; > if (arg_temp(op->args[1])->state == TS_DEAD) { > if (arg_temp(op->args[0])->state == TS_DEAD) { > /* Both parts of the operation are dead. */ > @@ -4122,19 +4116,15 @@ liveness_pass_1(TCGContext *s) > goto do_not_remove; > } > /* Mark the single-word operation live. */ > - nb_oargs = 1; > goto do_not_remove; > > default: > - /* XXX: optimize by hardcoding common cases (e.g. triadic ops) */ > - nb_iargs = def->nb_iargs; > - nb_oargs = def->nb_oargs; > - > /* Test if the operation can be removed because all > its outputs are dead. We assume that nb_oargs == 0 > implies side effects */ > - if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && nb_oargs != 0) { > - for (int i = 0; i < nb_oargs; i++) { > + def = &tcg_op_defs[opc]; > + if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && def->nb_oargs != 0) { > + for (int i = def->nb_oargs - 1; i >= 0; i--) { > if (arg_temp(op->args[i])->state != TS_DEAD) { > goto do_not_remove; > } > @@ -4148,6 +4138,10 @@ liveness_pass_1(TCGContext *s) > break; > > do_not_remove: > + def = &tcg_op_defs[opc]; > + nb_iargs = def->nb_iargs; > + nb_oargs = def->nb_oargs; > + > for (int i = 0; i < nb_oargs; i++) { > ts = arg_temp(op->args[i]); > Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff --git a/tcg/tcg.c b/tcg/tcg.c index 9da6c8bb4d..381e76cfc8 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -4071,8 +4071,6 @@ liveness_pass_1(TCGContext *s) case INDEX_op_sub2_i64: opc_new = INDEX_op_sub; do_addsub2: - nb_iargs = 4; - nb_oargs = 2; /* Test if the high part of the operation is dead, but not the low part. The result can be optimized to a simple add or sub. This happens often for x86_64 guest when the @@ -4087,8 +4085,6 @@ liveness_pass_1(TCGContext *s) op->args[1] = op->args[2]; op->args[2] = op->args[4]; /* Fall through and mark the single-word operation live. */ - nb_iargs = 2; - nb_oargs = 1; } goto do_not_remove; @@ -4100,8 +4096,6 @@ liveness_pass_1(TCGContext *s) opc_new = INDEX_op_mul; opc_new2 = INDEX_op_muluh; do_mul2: - nb_iargs = 2; - nb_oargs = 2; if (arg_temp(op->args[1])->state == TS_DEAD) { if (arg_temp(op->args[0])->state == TS_DEAD) { /* Both parts of the operation are dead. */ @@ -4122,19 +4116,15 @@ liveness_pass_1(TCGContext *s) goto do_not_remove; } /* Mark the single-word operation live. */ - nb_oargs = 1; goto do_not_remove; default: - /* XXX: optimize by hardcoding common cases (e.g. triadic ops) */ - nb_iargs = def->nb_iargs; - nb_oargs = def->nb_oargs; - /* Test if the operation can be removed because all its outputs are dead. We assume that nb_oargs == 0 implies side effects */ - if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && nb_oargs != 0) { - for (int i = 0; i < nb_oargs; i++) { + def = &tcg_op_defs[opc]; + if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && def->nb_oargs != 0) { + for (int i = def->nb_oargs - 1; i >= 0; i--) { if (arg_temp(op->args[i])->state != TS_DEAD) { goto do_not_remove; } @@ -4148,6 +4138,10 @@ liveness_pass_1(TCGContext *s) break; do_not_remove: + def = &tcg_op_defs[opc]; + nb_iargs = def->nb_iargs; + nb_oargs = def->nb_oargs; + for (int i = 0; i < nb_oargs; i++) { ts = arg_temp(op->args[i]);
Sink the sets of the def, nb_iargs, nb_oargs variables to the default and do_not_remove labels. They're not really needed beforehand, and it avoids preceding code from having to keep them up-to-date. Note that def was *not* kept up-to-date; thankfully only def->flags had been used and those bits were constant between opcode changes. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/tcg.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)