qemu-devel
[Top][All Lists]
Advanced

[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: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
Date: Wed, 10 Oct 2012 09:49:53 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120911 Thunderbird/15.0.1

Il 10/10/2012 09:42, Aurelien Jarno ha scritto:
> 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).

I'm not talking of spills; only saves of dead globals and local temps.
These can be computed before the optimizer runs, right?

> 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.

Note that the above was without your series.

>> - 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().

Yes, that would be simple.

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]