[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and regi
From: |
Aurelien Jarno |
Subject: |
Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator |
Date: |
Wed, 10 Oct 2012 09:42:07 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Wed, Oct 10, 2012 at 08:59:43AM +0200, Paolo Bonzini wrote:
> Il 09/10/2012 21:55, Aurelien Jarno ha scritto:
> > This patch series rework the liveness analysis and register allocator
> > in order to generate more optimized code, by avoiding a lot of move
> > instructions. I have measured a 9% performance improvement in user mode
> > and 4% in system mode.
> >
> > The idea behind this patch series is to free registers as soon as the
> > temps are not used anymore instead of waiting for a basic block end or
> > an op with side effects.
>
> Would it make any sense to express the saves as real TCG ops? This
> would have a couple of advantages:
It depends what you mean by that. Spills are decided more or less at the
last moment (no free registers available, clobbered registers in a
function call). If it is about calling the same code in tcg-target.c for
register spills than for TCG ops, it's doable, though it might be easier
to provide a spill immediate function.
If it's about inserting them in the TCG stream, as it is done at the
last step, ie after copy propagation and dead code elimination, it's not
really useful anymore.
> - more copy propagation and dead code elimination. Something like this:
>
> mov_i64 cc_dst,rax
>
> right now is compiled as follows:
>
> 0x5555557ac37a: mov %rbp,(%r14) # spill rax
> 0x5555557ac381: mov (%r14),%rbp # load rax from memory
> 0x5555557ac38f: mov %rbp,0x98(%r14) # spill cc_dst to memory
I am surprised by this kind of code, and I think there's a bug somewhere
in TCG. With the current TCG code, given rax is not dead, it should be
spilled only after the move of cc_dst to memory, and thus second line is
not supposed to be emitted. With this patch series applied the second
line should simply be removed.
> while expressing spills as TCG ops would turn the above into effectively
>
> st_i64 rax, env, $0x98
Which is basically the last assembly line of your example above.
> - constant propagation using constraints. This would let tcg-i386 use
> effectively the mov $imm,(addr) instruction for spills of known-constant
> values.
This is indeed something quite frustrating and even more when the
same immediate value is loaded multiple time. One way to do that would
be to provide an optional tcg_out_st_immediate().
--
Aurelien Jarno GPG: 1024D/F1BCDB73
address@hidden http://www.aurel32.net
- [Qemu-devel] [PATCH v2 16/26] target-arm: rename helper flags, (continued)
- [Qemu-devel] [PATCH v2 16/26] target-arm: rename helper flags, Aurelien Jarno, 2012/10/09
- [Qemu-devel] [PATCH v2 05/26] tcg: rework liveness analysis, Aurelien Jarno, 2012/10/09
- [Qemu-devel] [PATCH v2 01/26] tcg: add temp_dead(), Aurelien Jarno, 2012/10/09
- [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request, Aurelien Jarno, 2012/10/09
- [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects, Aurelien Jarno, 2012/10/09
- [Qemu-devel] [PATCH v2 23/26] target-sh4: rename helper flags, Aurelien Jarno, 2012/10/09
- [Qemu-devel] [PATCH v2 09/26] tcg: start with local temps in TEMP_VAL_MEM state, Aurelien Jarno, 2012/10/09
- Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator, Paolo Bonzini, 2012/10/10
- Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator, Richard Henderson, 2012/10/10