diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2012-09-11 16:18:49 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2012-09-22 15:10:21 +0200 |
commit | 1ff8c5418a680d6766493908eaa07cc11dce7f13 (patch) | |
tree | 8074dd34947a6d0e41140b3dc6565e86f1d05b06 | |
parent | e590d4e6b3c73b38a9d9ed10c898f73ed8a29f1d (diff) | |
download | qemu-1ff8c5418a680d6766493908eaa07cc11dce7f13.zip qemu-1ff8c5418a680d6766493908eaa07cc11dce7f13.tar.gz qemu-1ff8c5418a680d6766493908eaa07cc11dce7f13.tar.bz2 |
tcg/optimize: do copy propagation for all operations
It is possible to due copy propagation for all operations, even the one
that have side effects or clobber arguments (it only concerns input
arguments). That said, the call operation should be handled differently
due to the variable number of arguments.
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r-- | tcg/optimize.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c index 1904b39..aeb2225 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -378,8 +378,15 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, op = gen_opc_buf[op_index]; def = &tcg_op_defs[op]; /* Do copy propagation */ - if (!(def->flags & (TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS))) { - assert(op != INDEX_op_call); + if (op == INDEX_op_call) { + int nb_oargs = args[0] >> 16; + int nb_iargs = args[0] & 0xffff; + for (i = nb_oargs + 1; i < nb_oargs + nb_iargs + 1; i++) { + if (temps[args[i]].state == TCG_TEMP_COPY) { + args[i] = find_better_copy(s, args[i]); + } + } + } else { for (i = def->nb_oargs; i < def->nb_oargs + def->nb_iargs; i++) { if (temps[args[i]].state == TCG_TEMP_COPY) { args[i] = find_better_copy(s, args[i]); |