All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <rth@twiddle.net>
To: Aurelien Jarno <aurelien@aurel32.net>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 07/13] tcg: rewrite tcg_reg_alloc_mov()
Date: Thu, 27 Sep 2012 12:09:35 -0700	[thread overview]
Message-ID: <5064A46F.30105@twiddle.net> (raw)
In-Reply-To: <1348766113-18373-8-git-send-email-aurelien@aurel32.net>

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.

Why are you handling NEED_SYNC_ARG before the move, rather than after?

> +    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?

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

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


r~

  reply	other threads:[~2012-09-27 19:09 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 [this message]
2012-09-27 20:17     ` Aurelien Jarno
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=5064A46F.30105@twiddle.net \
    --to=rth@twiddle.net \
    --cc=aurelien@aurel32.net \
    --cc=qemu-devel@nongnu.org \
    /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.