From: Aurelien Jarno <aurelien@aurel32.net>
To: Richard Henderson <rth@twiddle.net>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 07/13] tcg: rewrite tcg_reg_alloc_mov()
Date: Thu, 27 Sep 2012 22:17:28 +0200 [thread overview]
Message-ID: <20120927201728.GK20151@ohm.aurel32.net> (raw)
In-Reply-To: <5064A46F.30105@twiddle.net>
On Thu, Sep 27, 2012 at 12:09:35PM -0700, Richard Henderson wrote:
> On 09/27/2012 10:15 AM, Aurelien Jarno wrote:
> > + /* We have to load the value in a register for moving it to another
> > + or for saving it. We assume it's better to keep it there than to
> > + reload it later. */
> > + if ((NEED_SYNC_ARG(0) && ts->val_type != TEMP_VAL_REG)
> > + || ts->val_type == TEMP_VAL_MEM) {
> > + ts->reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs);
> > + if (ts->val_type == TEMP_VAL_MEM) {
> > + tcg_out_ld(s, ts->type, ts->reg, ts->mem_reg, ts->mem_offset);
> > + } else if (ts->val_type == TEMP_VAL_CONST) {
> > + tcg_out_movi(s, ts->type, ts->reg, ts->val);
> > + }
> > + s->reg_to_temp[ts->reg] = args[1];
> > + ts->val_type = TEMP_VAL_REG;
> > + ts->mem_coherent = 1;
> > + }
>
> I don't understand this block. In particular, the ts->mem_coherent = 1
> in the TEMP_VAL_CONST case looks wrong.
Indeed the ts->mem_coherent = 1 is wrong in the TEMP_VAL_CONST.
> Why are you handling NEED_SYNC_ARG before the move, rather than after?
Because the move is likely to be eliminated by the code below,
especially if the temp is dead in addition.
> > + if (IS_DEAD_ARG(0) && !ots->fixed_reg) {
> > + /* mov to a non-saved dead register makes no sense (even with
> > + liveness analysis disabled). */
> > + assert(NEED_SYNC_ARG(0));
> > + /* The code above should have moved the temp to a register. */
> > + assert(ts->val_type == TEMP_VAL_REG);
> > + if (!ots->mem_allocated) {
> > + temp_allocate_frame(s, args[0]);
> > }
> > + if (ts->val_type == TEMP_VAL_REG) {
> > + tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
> > + if (IS_DEAD_ARG(1)) {
> > + temp_dead(s, args[1]);
> > + }
> > }
> > + temp_dead(s, args[0]);
>
> Isn't this store going to happen via temp_dead -> temp_sync -> tcg_reg_sync?
temp_dead only mark the temp as dead, it doesn't save it.
> > } else if (ts->val_type == TEMP_VAL_CONST) {
> > if (ots->fixed_reg) {
> > + tcg_out_movi(s, ots->type, ots->reg, ts->val);
> > + s->reg_to_temp[ots->reg] = args[0];
> > } else {
> > /* propagate constant */
> > + if (ots->val_type == TEMP_VAL_REG) {
> > s->reg_to_temp[ots->reg] = -1;
> > + }
> > ots->val_type = TEMP_VAL_CONST;
> > ots->val = ts->val;
> > }
>
> How much of the first block above is redundant with this?
> Especially given that I think there's a missing sync.
The goal of to first block is to move the value to a register in case a
sync is needed, and the sync is done at this moment. The ots->fixed_reg
can indeed by merged into the first block, but the rest has to stay there.
> > } else {
> > + /* The code above should have moved the temp to a register. */
> > + assert(ts->val_type == TEMP_VAL_REG);
> > + if (IS_DEAD_ARG(1) && !ts->fixed_reg && !ots->fixed_reg) {
> > + /* the mov can be suppressed */
> > + if (ots->val_type == TEMP_VAL_REG) {
> > + s->reg_to_temp[ots->reg] = -1;
> > + }
> > + ots->reg = ts->reg;
> > + temp_dead(s, args[1]);
> > + } else {
> > + if (ots->val_type != TEMP_VAL_REG) {
> > + /* When allocating a new register, make sure to not spill the
> > + input one. */
> > + tcg_regset_set_reg(allocated_regs, ts->reg);
> > + ots->reg = tcg_reg_alloc(s, oarg_ct->u.regs, allocated_regs);
> > + }
> > + tcg_out_mov(s, ots->type, ots->reg, ts->reg);
> > + }
> > + ots->val_type = TEMP_VAL_REG;
> > + ots->mem_coherent = 0;
> > + s->reg_to_temp[ots->reg] = args[0];
> > + if (NEED_SYNC_ARG(0)) {
> > + tcg_reg_sync(s, ots->reg);
> > + }
>
> ... as we do here.
The sync is done here because it has not been done in the first block.
It's different than in the ts->val_type == TEMP_VAL_CONST
--
Aurelien Jarno GPG: 1024D/F1BCDB73
aurelien@aurel32.net http://www.aurel32.net
next prev parent reply other threads:[~2012-09-27 20:17 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-27 17:15 [Qemu-devel] [PATCH 00/13] tcg: rework liveness analysis and register allocator Aurelien Jarno
2012-09-27 17:15 ` [Qemu-devel] [PATCH 01/13] tcg: add temp_dead() Aurelien Jarno
2012-09-27 18:19 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 02/13] tcg: add tcg_reg_sync() Aurelien Jarno
2012-09-27 18:24 ` Richard Henderson
2012-09-27 20:00 ` Aurelien Jarno
2012-09-27 17:15 ` [Qemu-devel] [PATCH 03/13] tcg: add temp_sync() Aurelien Jarno
2012-09-27 18:30 ` Richard Henderson
2012-09-27 20:02 ` Aurelien Jarno
2012-09-27 17:15 ` [Qemu-devel] [PATCH 04/13] tcg: sync output arguments on liveness request Aurelien Jarno
2012-09-27 18:39 ` Richard Henderson
2012-09-27 20:05 ` Aurelien Jarno
2012-09-27 20:10 ` Richard Henderson
2012-09-27 20:25 ` Aurelien Jarno
2012-09-27 17:15 ` [Qemu-devel] [PATCH 05/13] tcg: rework liveness analysis Aurelien Jarno
2012-09-27 18:54 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 06/13] tcg: improve tcg_reg_alloc_movi() Aurelien Jarno
2012-09-27 18:55 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 07/13] tcg: rewrite tcg_reg_alloc_mov() Aurelien Jarno
2012-09-27 19:09 ` Richard Henderson
2012-09-27 20:17 ` Aurelien Jarno [this message]
2012-09-27 22:18 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 08/13] tcg: always mark dead input arguments as dead Aurelien Jarno
2012-09-27 19:10 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 09/13] tcg: start with local temps in TEMP_VAL_MEM state Aurelien Jarno
2012-09-27 19:10 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 10/13] tcg: don't explicitely save globals and temps Aurelien Jarno
2012-09-27 19:13 ` Richard Henderson
2012-09-27 20:23 ` Aurelien Jarno
2012-09-27 17:15 ` [Qemu-devel] [PATCH 11/13] tcg: sync globals for pure helpers instead of saving them Aurelien Jarno
2012-09-27 19:39 ` Richard Henderson
2012-09-27 20:34 ` Aurelien Jarno
2012-09-27 22:02 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 12/13] tcg: fix some op flags Aurelien Jarno
2012-09-27 19:44 ` Richard Henderson
2012-09-27 17:15 ` [Qemu-devel] [PATCH 13/13] tcg: rework TCG ops flags Aurelien Jarno
2012-09-27 19:56 ` Richard Henderson
2012-09-27 20:37 ` Aurelien Jarno
2012-09-27 22:00 ` Richard Henderson
2012-09-27 23:08 ` Aurelien Jarno
2012-09-27 23:11 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120927201728.GK20151@ohm.aurel32.net \
--to=aurelien@aurel32.net \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.