On Tue, Feb 19, 2013 at 7:03 PM, Richard Henderson <r...@twiddle.net> wrote: > Signed-off-by: Richard Henderson <r...@twiddle.net> > --- > tcg/optimize.c | 33 ++++++++++++++++++++++++++++++++- > 1 file changed, 32 insertions(+), 1 deletion(-) > > I noticed this while looking at other dumps. This seems like it > should be considered independently of the other patch series.
This breaks Sparc32 boot, only a few first instructions are executed. > > r~ > > > diff --git a/tcg/optimize.c b/tcg/optimize.c > index 973d2d6..7c172c5 100644 > --- a/tcg/optimize.c > +++ b/tcg/optimize.c > @@ -575,7 +575,8 @@ static TCGArg *tcg_constant_folding(TCGContext *s, > uint16_t *tcg_opc_ptr, > break; > } > > - /* Simplify expressions for "shift/rot r, 0, a => movi r, 0" */ > + /* Simplify expressions for "shift/rot r, 0, a => movi r, 0", > + and "sub r, 0, a => neg r, a" case. */ > switch (op) { > CASE_OP_32_64(shl): > CASE_OP_32_64(shr): > @@ -591,6 +592,36 @@ static TCGArg *tcg_constant_folding(TCGContext *s, > uint16_t *tcg_opc_ptr, > continue; > } > break; > + CASE_OP_32_64(sub): > + { > + TCGOpcode neg_op; > + bool have_neg; > + > + if (temps[args[2]].state == TCG_TEMP_CONST) { > + /* Proceed with possible constant folding. */ > + break; > + } > + if (op == INDEX_op_sub_i32) { > + neg_op = INDEX_op_neg_i32; > + have_neg = TCG_TARGET_HAS_neg_i32; > + } else { > + neg_op = INDEX_op_neg_i64; > + have_neg = TCG_TARGET_HAS_neg_i64; > + } > + if (!have_neg) { > + break; > + } > + if (temps[args[1]].state == TCG_TEMP_CONST > + && temps[args[1]].val == 0) { > + s->gen_opc_buf[op_index] = neg_op; > + gen_args[0] = args[0]; > + gen_args[1] = args[2]; > + args += 3; > + gen_args += 2; > + continue; > + } > + } > + break; > default: > break; > } > -- > 1.8.1.2 >