Richard Henderson <r...@twiddle.net> writes:

> Signed-off-by: Richard Henderson <r...@twiddle.net>
> ---
>  tcg/optimize.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
>
> diff --git a/tcg/optimize.c b/tcg/optimize.c
> index f41ed2c..9e26bb7 100644
> --- a/tcg/optimize.c
> +++ b/tcg/optimize.c
> @@ -1105,6 +1105,21 @@ void tcg_optimize(TCGContext *s)
>                  tcg_opt_gen_mov(s, op, args, args[0], args[4-tmp]);
>                  break;
>              }
> +            if (temp_is_const(args[3]) && temp_is_const(args[4])) {
> +                tcg_target_ulong tv = temps[args[3]].val;
> +                tcg_target_ulong fv = temps[args[4]].val;
> +                TCGCond cond = args[5];
> +                if (fv == 1 && tv == 0) {
> +                    cond = tcg_invert_cond(cond);
> +                } else if (!(tv == 1 && fv == 0)) {
> +                    goto do_default;
> +                }

Why the weird exit early here on an inverted test. Couldn't it just be

                } else if (tv == 1 && fv == 0) {
                    args[3] = cond;
                    op->opc = opc = (opc == INDEX_op_movcond_i32
                                     ? INDEX_op_setcond_i32
                                     : INDEX_op_setcond_i64);
                    nb_iargs = 2;
                }

And fall through to the goto do_default as before?

>              goto do_default;
>
>          case INDEX_op_add2_i32:


--
Alex Bennée

Reply via email to