tcg/optimize: Split out fold_xx_to_x

Pull the "op r, a, a => mov r, a" optimization into a function,
and use it in the outer opcode fold functions.

Reviewed-by: Luis Pires <luis.pires@eldorado.org.br>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2021-08-25 13:14:21 -07:00
parent cbe42fb2f2
commit ca7bb049a0

View File

@ -704,8 +704,22 @@ static bool fold_xx_to_i(OptContext *ctx, TCGOp *op, uint64_t i)
return false;
}
/* If the binary operation has both arguments equal, fold to identity. */
static bool fold_xx_to_x(OptContext *ctx, TCGOp *op)
{
if (args_are_copies(op->args[1], op->args[2])) {
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
}
return false;
}
/*
* These outermost fold_<op> functions are sorted alphabetically.
*
* The ordering of the transformations should be:
* 1) those that produce a constant
* 2) those that produce a copy
* 3) those that produce information about the result value.
*/
static bool fold_add(OptContext *ctx, TCGOp *op)
@ -748,7 +762,11 @@ static bool fold_add2_i32(OptContext *ctx, TCGOp *op)
static bool fold_and(OptContext *ctx, TCGOp *op)
{
return fold_const2(ctx, op);
if (fold_const2(ctx, op) ||
fold_xx_to_x(ctx, op)) {
return true;
}
return false;
}
static bool fold_andc(OptContext *ctx, TCGOp *op)
@ -1111,7 +1129,11 @@ static bool fold_not(OptContext *ctx, TCGOp *op)
static bool fold_or(OptContext *ctx, TCGOp *op)
{
return fold_const2(ctx, op);
if (fold_const2(ctx, op) ||
fold_xx_to_x(ctx, op)) {
return true;
}
return false;
}
static bool fold_orc(OptContext *ctx, TCGOp *op)
@ -1747,19 +1769,6 @@ void tcg_optimize(TCGContext *s)
break;
}
/* Simplify expression for "op r, a, a => mov r, a" cases */
switch (opc) {
CASE_OP_32_64_VEC(or):
CASE_OP_32_64_VEC(and):
if (args_are_copies(op->args[1], op->args[2])) {
tcg_opt_gen_mov(&ctx, op, op->args[0], op->args[1]);
continue;
}
break;
default:
break;
}
/*
* Process each opcode.
* Sorted alphabetically by opcode as much as possible.