From: David Miller <davem@davemloft.net>
To: ebotcazou@adacore.com
Cc: gcc@gcc.gnu.org
Subject: Re: cprop_reg problem on sparc
Date: Thu, 27 Oct 2011 21:56:00 -0000 [thread overview]
Message-ID: <20111027.163010.280121975300902171.davem@davemloft.net> (raw)
In-Reply-To: <201110271517.40811.ebotcazou@adacore.com>
From: Eric Botcazou <ebotcazou@adacore.com>
Date: Thu, 27 Oct 2011 15:17:40 +0200
>> On 64-bit sparc, integer regs are 64-bit and float regs are
>> (basically) 32-bit. So HARD_REGNO_NREGS(float_reg, DFmode) is 2, and
>> HARD_REGNO_NREGS(integer_reg, DImode) is 1.
>>
>> cprop sees the sequence:
>>
>> (insn 330 172 230 .. (set (reg:DI %g2) const_int)
>> (insn 171 330 173 .. (set (reg:DF %f10) (reg:DF %g2)))
>> (insn 173 171 222 .. (set (reg:DF %f2) (reg:DF %f10)))
>> (insn 222 173 223 .. (set (MEM:SI ..) (reg:SI %f10)))
>> (insn 223 222 174 .. (set (MEM:SI ..) (reg:SI %f11)))
>>
>> And then it believes that in insn 222 it can replace %f10 with %g2,
>> but this is not a correct transformation.
>>
>> cprop uses hard_regno_nregs[][] to attempt to detect illegal cases
>> like this one, but such checks will not trigger here because
>> hard_regno_nregs[][] is '1' for all of the registers being inspected:
>>
>> hard_regno_nregs[][] (reg:SI f10) 1
>> hard_regno_nregs[][] (reg:DI g2) 1
>
> There seems to be a hole in the checks, as the number of registers is 2 for
> some of the intermediate steps.
I think cprop_reg can legitimately only consider the candidate read
replacement (reg:SI %f10) with the most recent store to it's
equivalent value (reg:DI %g2).
In fact, that's exactly what cprop_reg's core algorithm is :-)
The issue is how to test properly that accesses to a value in two
register accesses is equivalent after a move. This pass is currently
using hard_regno_nregs[][] and a paradoxical subreg test to achieve
that, but it's obviously not sufficient.
Note that it would actually be legal to make the transformation on
insn 223, replacing %f11 with %g2.
But I'll note that if IRA had properly spilled %f10 to the stack using
an 8-byte aligned stack slot and DFmode, we wouldn't even be having to
consider this situation.
I think cprop_reg should cope with this properly, but I also think that
it would be nice if we worked to minimize unnecessary mode changes like
those seen here. The const-->DFmode splitter in sparc.md is partly to
blame, as is IRA.
prev parent reply other threads:[~2011-10-27 20:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-27 12:06 David Miller
2011-10-27 18:21 ` Eric Botcazou
2011-10-27 19:36 ` David Miller
2011-10-27 22:42 ` Eric Botcazou
2011-10-28 0:58 ` David Miller
2011-10-28 2:17 ` Eric Botcazou
2011-10-28 5:06 ` David Miller
2011-10-27 21:56 ` David Miller [this message]
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=20111027.163010.280121975300902171.davem@davemloft.net \
--to=davem@davemloft.net \
--cc=ebotcazou@adacore.com \
--cc=gcc@gcc.gnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).