From: daniel tian <daniel.xntian@gmail.com>
To: gcc@gcc.gnu.org
Cc: peng.zheng@mavrixtech.com, yan.hu@mavrixtech.com.cn,
Dave Korn <dave.korn.cygwin@googlemail.com>,
Ian Lance Taylor <iant@google.com>
Subject: Insn missing in Size optimization(-Os)
Date: Wed, 02 Dec 2009 10:18:00 -0000 [thread overview]
Message-ID: <121fadb80912020218k6beb60aco49793e999091a747@mail.gmail.com> (raw)
Hi,
I met a bug in my gcc porting. It work fine when executing with -O0.
But with -Os, there is a insn missed. I dumped the RTL and checked them.
When in movebug.c.175r.lreg, it is fine. But in next phase --
movebug.c.176r.greg, the insn missed.
Here is the simple c program (movebug.c):
void fun() __attribute__((noinline));
void fun()
{
volatile int a=0;
}
int main()
{
int i;
for(i=2; i<16; ++i)
{
fun();
}
return 0;
}
In *.175r.lreg, the RTL code is:
(insn:HI 6 3 8 2 movebug.c:8 (set (reg/v:SI 37 [ i ])
(const_int 2 [0x2])) 2 {constant_load_si} (expr_list:REG_EQUAL
(const_int 2 [0x2])
(nil)))
(insn:HI 8 6 11 2 movebug.c:12 (set (reg/f:SI 42)
(symbol_ref:SI ("fun") [flags 0x3] <function_decl 0xb729ba10
fun>)) 15 {symbolic_address_load} (expr_list:REG_EQUIV (symbol_ref:SI
("fun") [flags 0x3] <function_decl 0xb729ba10 fun>)
(nil)))
(code_label:HI 11 8 7 3 4 "" [1 uses])
(note:HI 7 11 10 3 [bb 3] NOTE_INSN_BASIC_BLOCK)
(insn:HI 10 7 9 3 movebug.c:10 (set (reg/v:SI 37 [ i ])
(plus:SI (reg/v:SI 37 [ i ])
(const_int 1 [0x1]))) 45 {rice_addsi3} (nil))
(call_insn:HI 9 10 13 3 movebug.c:12 (parallel [
(call (mem:SI (reg/f:SI 42) [0 S4 A32])
(const_int 0 [0x0]))
(clobber (reg:SI 17 LINK))
]) 99 {call} (expr_list:REG_EH_REGION (const_int 0 [0x0])
(nil))
(nil))
The "fun" function address will be first loaded into register, and
then CALL insn will refer this register which means call the function.
The *.sched1 give the data flow:
;; ======================================================
;; -- basic block 2 from 6 to 8 -- before reload
;; ======================================================
;; 0--> 6 r37=0x2 :nothing
;; 1--> 8 r42=`fun' :nothing
;; Ready list (final):
;; total time = 1
;; new head = 6
;; new tail = 8
;; ======================================================
;; -- basic block 3 from 9 to 13 -- before reload
;; ======================================================
changing bb of uid 10
;; 0--> 10 r37=r37+0x1 :nothing
;; 1--> 9 call [r42] :nothing
;; 2--> 13 pc={(r37!=0x10)?L11:pc} :nothing
;; Ready list (final):
;; total time = 2
;; new head = 10
;; new tail = 13
;; ======================================================
;; -- basic block 4 from 19 to 25 -- before reload
;; ======================================================
;; 0--> 19 R2=0x0 :nothing
;; 1--> 25 use R2 :nothing
;; Ready list (final):
;; total time = 1
;; new head = 19
;; new tail = 25
But in movebug.c.176r.greg, the move function address into a register
insn disappeared. I don't know why the optimization step will take
this insn out of the program, because this will cause a logical error.
(insn:HI 6 3 37 2 movebug.c:8 (set (reg:SI 4 R4)
(const_int 2 [0x2])) 2 {constant_load_si} (expr_list:REG_EQUAL
(const_int 2 [0x2])
(nil)))
(insn 37 6 8 2 movebug.c:8 (set (mem/c:SI (reg/f:SI 15 R15) [3 i+0 S4 A32])
(reg:SI 4 R4)) 8 {store_si} (nil))
(note:HI 8 37 11 2 NOTE_INSN_DELETED)
(code_label:HI 11 8 7 3 4 "" [1 uses])
(note:HI 7 11 38 3 [bb 3] NOTE_INSN_BASIC_BLOCK)
(insn 38 7 10 3 movebug.c:10 (set (reg:SI 4 R4)
(mem/c:SI (reg/f:SI 15 R15) [3 i+0 S4 A32])) 11 {load_si} (nil))
(insn:HI 10 38 39 3 movebug.c:10 (set (reg:SI 4 R4)
(plus:SI (reg:SI 4 R4)
(const_int 1 [0x1]))) 45 {rice_addsi3} (nil))
(insn 39 10 9 3 movebug.c:10 (set (mem/c:SI (reg/f:SI 15 R15) [3 i+0 S4 A32])
(reg:SI 4 R4)) 8 {store_si} (nil))
(call_insn:HI 9 39 40 3 movebug.c:12 (parallel [
(call (mem:SI (reg:SI 0 R0) [0 S4 A32])
(const_int 0 [0x0]))
(clobber (reg:SI 17 LINK))
]) 99 {call} (expr_list:REG_EH_REGION (const_int 0 [0x0])
(nil))
(nil))
also in movebug.c.194r.sched2, there is an overview of the flowchart:
;; ======================================================
;; -- basic block 2 from 41 to 37 -- after reload
;; ======================================================
;; 0--> 41 [R15-0x4]=R14 :nothing
;; 1--> 42 R0=LINK :nothing
changing bb of uid 44
;; 2--> 44 R15=R15-0xc :nothing
;; 3--> 43 [R14-0x8]=R0 :nothing
changing bb of uid 6
;; 4--> 6 R4=0x2 :nothing
;; 5--> 45 R14=R15 :nothing
;; 6--> 37 [R15]=R4 :nothing
;; Ready list (final):
;; total time = 6
;; new head = 46
;; new tail = 37
;; ======================================================
;; -- basic block 3 from 38 to 13 -- after reload
;; ======================================================
;; 0--> 38 R4=[R15] :rice_load,nothing
;; 2--> 10 R4=R4+0x1 :nothing
;; 3--> 39 [R15]=R4 :nothing
;; 4--> 9 call [R0] :nothing
;; 5--> 40 R4=[R15] :rice_load,nothing
;; 7--> 13 pc={(R4!=0x10)?L11:pc} :nothing
;; Ready list (final):
;; total time = 7
;; new head = 38
;; new tail = 13
;; ======================================================
;; -- basic block 4 from 19 to 52 -- after reload
;; ======================================================
changing bb of uid 48
;; 0--> 48 R15=R14+0xc :nothing
changing bb of uid 50
;; 1--> 50 R0=[R15-0x8] :rice_load,nothing
;; 2--> 19 R2=0x0 :nothing
changing bb of uid 49
;; 3--> 49 R14=[R15-0x4] :rice_load,nothing
;; 4--> 25 use R2 :nothing
;; 4--> 51 LINK=R0 :nothing
;; 5--> 52 return :nothing
;; Ready list (final):
;; total time = 5
;; new head = 47
;; new tail = 52
You can it 's absolutely wrong due to missing R0 assignment. And the
CALL insn will jmp to a incorrect position.
I don't know why it causes this problem. Does anyone also meet this
kind of problem?
Any suggestion is appreciated.
Thanks very much.
daniel.tian
next reply other threads:[~2009-12-02 10:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-02 10:18 daniel tian [this message]
2009-12-02 12:29 ` daniel tian
2009-12-02 16:21 ` Ian Lance Taylor
2009-12-02 17:35 ` Jeff Law
2009-12-04 7:01 ` daniel tian
2009-12-05 8:01 ` daniel tian
2009-12-05 16:18 ` Jeff Law
2009-12-07 3:10 ` daniel tian
2009-12-08 4:04 ` Jeff Law
2009-12-08 6:11 ` daniel tian
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=121fadb80912020218k6beb60aco49793e999091a747@mail.gmail.com \
--to=daniel.xntian@gmail.com \
--cc=dave.korn.cygwin@googlemail.com \
--cc=gcc@gcc.gnu.org \
--cc=iant@google.com \
--cc=peng.zheng@mavrixtech.com \
--cc=yan.hu@mavrixtech.com.cn \
/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).