public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jeff Law <law@redhat.com>
To: "daniel.tian" <daniel.tian@mavrixtech.com.cn>
Cc: gcc@gcc.gnu.org, "'Peng Zheng'" <peng.zheng@mavrixtech.com>,
	        thomas.liau@mavrixtech.com,
	"'Ian Lance Taylor'" <iant@google.com>,
	        "'Michael Hope'" <michael.hope@gmail.com>,
	        "'Joern Rennecke'" <amylaar@spamcop.net>
Subject: Re: 答复: How to deal with unrecognizable RTL code
Date: Wed, 01 Jul 2009 01:57:00 -0000	[thread overview]
Message-ID: <4A4AC2AA.8010708@redhat.com> (raw)
In-Reply-To: <20090629093824.716BB3758001@mail.mavrixtech.com.cn>

daniel.tian wrote:
>
>
>   
>> This looks like a different problem. What pass generates insn 17? What
>> does insn 17 look like in the prior pass? If r14 is your stack/frame
>> pointer, this might point to a problem in how your port interacts with
>> register allocation/reload as reload can replace a pseudo with an
>> equivalent memory location.
>>
>>     
> Here is RTL in *.22.lreg:
> (insn:HI 12 13 20 0 (set (reg/v/f:SI 91 [ frame ])
>         (reg:SI 5 R5 [ frame ])) 14 {move_regs_si} (nil)
>     (expr_list:REG_DEAD (reg:SI 5 R5 [ frame ])
>         (nil)))
>
> (insn:HI 20 12 11 0 (set (reg:SI 88 [ D.1221 ])
>         (mem/s:SI (plus:SI (reg/v/f:SI 91 [ frame ])
>                 (const_int 4 [0x4])) [13 <variable>.mode+0 S4 A32])) 11
> {load_si} (insn_list:REG_DEP_TRUE 12 (nil))
>     (nil))
> You can see the two insns are right. Reg91 <-- R5,  Reg88 <-- (R91 + 4).
>
> But in *.23.greg, RTL is wrong:
> (insn:HI 12 13 545 0 (set (reg:SI 5 R5)
>         (reg:SI 5 R5 [ frame ])) 14 {move_regs_si} (nil)
>     (nil))
>
> (insn 545 12 20 0 (set (mem/f:SI (plus:SI (reg/f:SI 14 R14)
>                 (const_int 172 [0xac])) [35 frame+0 S4 A32])
>         (reg:SI 5 R5)) 8 {store_si} (nil)
>     (nil))
>
> (insn:HI 20 545 11 0 (set (reg:SI 6 R6 [orig:88 D.1221 ] [88])
>         (mem/s:SI (plus:SI (mem/f:SI (plus:SI (reg/f:SI 14 R14)
>                         (const_int 172 [0xac])) [35 frame+0 S4 A32])
>                 (const_int 4 [0x4])) [13 <variable>.mode+0 S4 A32])) 11
> {load_si} (insn_list:REG_DEP_TRUE 12 (nil))
>     (nil))
>
> Why there is a crap insn existence: R5 <-- R5?? 
>   
I wouldn't worry too much about that insn, it's a nop move and will be
eliminated. However...

> The following RTL insn is right which means storing R5 register to a
> specific memory location.
>   
Which means that reg 91 was spilled (ie, it did not get a hard register
assigned). You can verify this by looking at reg_equiv_mem[91] just
before this loop in reload1.c:

/* This loop scans the entire function each go-round
and repeats until one repetition spills no additional hard regs. */
for (;;)

Presumably reload then replaced reg91 with its equivalent memory
location in insn 20, thus giving you the somewhat strange looking (mem
(plus (mem (...)). This is normal behaviour so far. Presumably your port
rejects (plus (mem (...)) in GO_IF_LEGITIMATE_ADDRESS?


You'll probably want to put a breakpoint at this point in reload1.c:
/* Now eliminate all pseudo regs by modifying them into
their equivalent memory references.
The REG-rtx's for the pseudos are modified in place,
so all insns that used to refer to them now refer to memory.

For a reg that has a reg_equiv_address, all those insns
were changed by reloading so that no insns refer to it any longer;
but the DECL_RTL of a variable decl may refer to it,
and if so this causes the debugging info to mention the variable. */

When you hit that breakpoint look at insn 20. If it still references
reg91, then reload thinks that (plus (mem (...))) is a valid address,
most likely due to a botched GO_IF_LEGITIMATE_ADDRESS macro.

Jeff


  reply	other threads:[~2009-07-01  1:57 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-19  8:08 田晓南
2009-06-19 11:56 ` Paolo Bonzini
2009-06-24  9:35   ` daniel.tian
2009-06-24  9:36     ` Dave Korn
2009-06-24  9:37       ` Paolo Bonzini
2009-06-24 10:16         ` Dave Korn
2009-06-25 18:43 ` Jeff Law
2009-06-29 10:40   ` 答复: " daniel.tian
2009-07-01  1:57     ` Jeff Law [this message]
2009-06-29 10:52   ` daniel.tian
2009-06-29 21:11     ` How " Ian Lance Taylor
2009-06-30  6:20     ` Jim Wilson
2009-06-30 14:22   ` daniel.tian
2009-07-01  2:05     ` Jeff Law

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=4A4AC2AA.8010708@redhat.com \
    --to=law@redhat.com \
    --cc=amylaar@spamcop.net \
    --cc=daniel.tian@mavrixtech.com.cn \
    --cc=gcc@gcc.gnu.org \
    --cc=iant@google.com \
    --cc=michael.hope@gmail.com \
    --cc=peng.zheng@mavrixtech.com \
    --cc=thomas.liau@mavrixtech.com \
    /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).