From: Steven Bosscher <stevenb.gcc@gmail.com>
To: Eric Botcazou <ebotcazou@adacore.com>
Cc: Dominique Dhumieres <dominiq@lps.ens.fr>,
gcc-patches@gcc.gnu.org, bonzini@gnu.org, hubicka@ucw.cz
Subject: Re: Fix twolf -funroll-loops -O3 miscompilation (a semi-latent web.c bug)
Date: Mon, 19 Nov 2012 21:20:00 -0000 [thread overview]
Message-ID: <CABu31nO2O_zH=wyk_MYqqn81AT4HComhkxXWomXpbsU-Qsgr1w@mail.gmail.com> (raw)
In-Reply-To: <CABu31nPfTSwrMvmk1BHmcz5iR=oO5CGz1q0eYAx9ezbhLZXiLA@mail.gmail.com>
On Mon, Nov 19, 2012 at 9:34 PM, Steven Bosscher wrote:
> On Mon, Nov 19, 2012 at 12:24 PM, Eric Botcazou wrote:
>>> Yes, I'll be looking into this soon.
>>
>> We have a related regression on SPARC:
>>
>> FAIL: gfortran.dg/minmaxloc_5.f90 -O3 -fomit-frame-pointer -funroll-loops
>> execution test
>> FAIL: gfortran.dg/minmaxloc_5.f90 -O3 -fomit-frame-pointer -funroll-all-loops
>> -finline-functions execution test
>> FAIL: gfortran.dg/minmaxloc_6.f90 -O3 -fomit-frame-pointer -funroll-loops
>> execution test
>> FAIL: gfortran.dg/minmaxloc_6.f90 -O3 -fomit-frame-pointer -funroll-all-loops
>> -finline-functions execution test
>>
>> whose failure mode is exactly the same as for Honza's testcase. I even have a
>> more reduced testcase (6 lines, attached) in case you'd prefer working on it.
>>
>> Reproducible with a cross to sparc-linux with -mcpu=v8 -O3 -funroll-loops and
>> grepping for mem:SF (const_int 0 [0]) in the RTL dumps.
>
> Thanks for this reduced test case, that's saving me a lot of work!
>
> Can you please try and see if the following C test case also fails?
>
> It looks like the memcpy is expanded to a loop that is unrolled, and
> then mis-optimized. I haven't found out yet why...
It's another case of an invalid REG_EQUAL note. Shown below is an
excerpt from the C test case .loop2_done dump (after calling
df_analyze to update liveness). The note on insn 172 uses (reg:SI 132)
which is not live on entry to basic block 25.
;; basic block 25, loop depth 0, count 0, freq 2485, maybe hot
;; prev block 20, next block 26, flags: (REACHABLE, RTL, MODIFIED)
;; pred: 11 [50.5%]
;; bb 25 artificial_defs: { }
;; bb 25 artificial_uses: { u-1(14){ }u-1(30){ }u-1(101){ }}
;; lr in 14 [%sp] 30 [%fp] 31 [%i7] 101 [%sfp] 138 158 165
;; lr use 14 [%sp] 30 [%fp] 101 [%sfp] 138 158
;; lr def 131 133
;; live in 14 [%sp] 101 [%sfp] 138 158 165
;; live gen 131 133
;; live kill
(code_label 179 149 173 25 22 "" [1 uses])
(note 173 179 171 25 [bb 25] NOTE_INSN_BASIC_BLOCK)
(insn 171 173 172 25 (set (reg/v:SI 133 [ idsD.1386 ])
(reg/v:SI 138 [ idsD.1386 ])) 40 {*movsi_insn}
(expr_list:REG_UNUSED (reg/v:SI 133 [ idsD.1386 ])
(nil)))
(insn 172 171 176 25 (set (reg/v:SF 131 [ limit3D.1388 ])
(reg:SF 158 [ limit3D.1388 ])) t.c:62 -1
(expr_list:REG_EQUAL (mem:SF (reg:SI 132 [ ivtmp.7D.1419 ]) [2
MEM[base: _23, offset: 0B]+0 S4 A32])
(expr_list:REG_DEAD (reg:SF 158 [ limit3D.1388 ])
(nil))))
;; lr out 14 [%sp] 30 [%fp] 31 [%i7] 101 [%sfp] 131 133 138 165
;; live out 14 [%sp] 101 [%sfp] 131 133 138 165
The use of the dead reg is renamed in the webizer:
(insn 172 171 176 25 (set (reg/v:SF 131 [ limit3D.1388 ])
(reg:SF 172 [ limit3D.1388 ])) t.c:62 66 {*movsf_insn}
(expr_list:REG_EQUAL (mem:SF (reg:SI 174 [ ivtmp.7D.1419 ]) [2
MEM[base: _23, offset: 0B]+0 S4 A32])
(expr_list:REG_DEAD (reg:SF 158 [ limit3D.1388 ])
(nil))))
Next, cse2 thinks it's a good idea to actually use the REG_EQUAL note,
turning the EQ-use of the uninitialized reg 174 into a real use:
(insn 172 171 176 17 (set (reg/v:SF 131 [ limit3D.1388 ])
(mem:SF (reg:SI 174 [ ivtmp.7D.1419 ]) [2 MEM[base: _23,
offset: 0B]+0 S4 A32])) t.c:62 66 {*movsf_insn}
(expr_list:REG_EQUAL (mem:SF (reg:SI 174 [ ivtmp.7D.1419 ]) [2
MEM[base: _23, offset: 0B]+0 S4 A32])
(expr_list:REG_DEAD (reg:SF 158 [ limit3D.1388 ])
(nil))))
Then init-regs concludes that reg 174 is used ininitialized:
adding initialization in ga4076 of reg 174 at in block 16 for insn 172.
(insn 206 171 172 16 (set (reg:SI 174 [ ivtmp.7D.1419 ])
(const_int 0 [0])) t.c:62 -1
(nil))
(insn 172 206 176 16 (set (reg/v:SF 131 [ limit3D.1388 ])
(mem:SF (reg:SI 174 [ ivtmp.7D.1419 ]) [2 MEM[base: _23,
offset: 0B]+0 S4 A32])) t.c:62 66 {*movsf_insn}
(expr_list:REG_DEAD (reg:SI 174 [ ivtmp.7D.1419 ])
(expr_list:REG_EQUAL (mem:SF (reg:SI 174 [ ivtmp.7D.1419 ]) [2
MEM[base: _23, offset: 0B]+0 S4 A32])
(nil))))
And finally, combine merges the above to yield the final result:
Trying 206 -> 172:
Successfully matched this instruction:
(set (reg/v:SF 131 [ limit3D.1388 ])
(mem:SF (const_int 0 [0]) [2 MEM[base: _23, offset: 0B]+0 S4 A32]))
The root cause is the bad REG_EQUAL note. I think the most robust
solution is to make the webizer re-compute notes before renaming.
Patch for that is attached.
Ciao!
Steven
PR rtl-optimization/55006
* web.c (web_main): Add the DF_NOTE problem, and explain whatfor.
Index: web.c
===================================================================
--- web.c (revision 193454)
+++ web.c (working copy)
@@ -335,9 +335,16 @@ web_main (void)
unsigned int uses_num = 0;
rtx insn;
+ /* Add the flags and problems we need. The DF_EQ_NOTES flag is set so
+ that uses of registers in REG_EQUAL and REG_EQUIV notes are included
+ in the web that their DEF belongs to, so that these uses are also
+ properly renamed. The DF_NOTE problem is added to make sure that
+ all notes are up-to-date and valid: Re-computing the notes problem
+ also cleans up all dead REG_EQUAL notes. */
df_set_flags (DF_NO_HARD_REGS + DF_EQ_NOTES);
df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
df_chain_add_problem (DF_UD_CHAIN);
+ df_note_add_problem ();
df_analyze ();
df_set_flags (DF_DEFER_INSN_RESCAN);
next prev parent reply other threads:[~2012-11-19 21:20 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-18 23:15 Dominique Dhumieres
2012-11-19 9:50 ` Steven Bosscher
2012-11-19 11:27 ` Eric Botcazou
2012-11-19 20:35 ` Steven Bosscher
2012-11-19 21:20 ` Steven Bosscher [this message]
2012-11-19 21:52 ` Eric Botcazou
2012-11-19 22:03 ` Steven Bosscher
2012-11-19 22:44 ` Eric Botcazou
2012-11-19 22:48 ` Steven Bosscher
2012-11-23 22:46 ` Steven Bosscher
2012-11-24 1:10 ` Steven Bosscher
2012-11-25 20:44 ` Steven Bosscher
2012-11-25 22:38 ` Steven Bosscher
2012-11-26 14:38 ` Dominique Dhumieres
2012-11-26 15:46 ` Steven Bosscher
2012-11-27 9:58 ` Eric Botcazou
2012-11-27 10:35 ` Steven Bosscher
2012-11-27 12:01 ` Steven Bosscher
2012-11-27 12:29 ` Steven Bosscher
2012-11-27 13:04 ` Steven Bosscher
2012-11-27 14:25 ` Dominique Dhumieres
2012-11-27 14:49 ` Steven Bosscher
2012-11-27 13:48 ` Dominique Dhumieres
2012-11-27 14:33 ` Paolo Bonzini
2012-11-27 16:59 ` Eric Botcazou
2012-11-27 23:29 ` Steven Bosscher
2012-11-27 23:50 ` Eric Botcazou
2012-11-27 23:54 ` Steven Bosscher
2012-11-27 23:59 ` Steven Bosscher
2012-11-28 0:43 ` Steven Bosscher
2012-11-28 7:46 ` Eric Botcazou
2012-11-28 15:57 ` Steven Bosscher
2012-11-28 22:12 ` Eric Botcazou
2012-11-28 23:54 ` Steven Bosscher
2012-12-01 14:57 ` Eric Botcazou
2012-12-01 16:45 ` Steven Bosscher
2012-12-03 18:26 ` Eric Botcazou
2012-12-03 20:20 ` Steven Bosscher
2012-12-03 21:12 ` Eric Botcazou
2012-12-03 23:28 ` Steven Bosscher
2012-12-03 20:15 ` Paolo Bonzini
2012-11-19 21:29 ` Eric Botcazou
-- strict thread matches above, loose matches on Subject: below --
2012-10-12 20:14 Jan Hubicka
2012-10-12 20:36 ` Markus Trippelsdorf
2012-10-12 20:44 ` Steven Bosscher
2012-10-12 21:16 ` Jan Hubicka
2012-10-12 21:19 ` Steven Bosscher
2012-10-12 21:31 ` Jan Hubicka
2012-10-12 22:41 ` Steven Bosscher
2012-10-14 9:13 ` Paolo Bonzini
2012-10-14 21:27 ` Steven Bosscher
2012-10-14 21:35 ` Eric Botcazou
2012-10-14 21:45 ` Steven Bosscher
2012-10-15 8:14 ` Paolo Bonzini
2012-10-15 8:23 ` Steven Bosscher
2012-10-15 8:35 ` Paolo Bonzini
2012-10-15 8:38 ` Steven Bosscher
2012-10-15 10:49 ` Steven Bosscher
2012-10-15 12:28 ` Paolo Bonzini
2012-10-15 13:19 ` Steven Bosscher
2012-10-15 13:29 ` Paolo Bonzini
2012-10-15 13:49 ` Steven Bosscher
2012-10-16 10:35 ` Steven Bosscher
2012-10-16 11:05 ` Steven Bosscher
2012-10-16 11:42 ` Paolo Bonzini
2012-10-16 22:57 ` Steven Bosscher
2012-10-19 5:14 ` Bin.Cheng
2012-10-12 21:05 ` Steven Bosscher
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='CABu31nO2O_zH=wyk_MYqqn81AT4HComhkxXWomXpbsU-Qsgr1w@mail.gmail.com' \
--to=stevenb.gcc@gmail.com \
--cc=bonzini@gnu.org \
--cc=dominiq@lps.ens.fr \
--cc=ebotcazou@adacore.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hubicka@ucw.cz \
/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).