From: Jeff Law <jeffreyalaw@gmail.com>
To: Aldy Hernandez <aldyh@redhat.com>
Cc: Richard Biener <richard.guenther@gmail.com>,
Michael Matz <matz@suse.de>,
Andrew MacLeod <amacleod@redhat.com>,
GCC patches <gcc-patches@gcc.gnu.org>
Subject: Re: [RFC] More jump threading restrictions in the presence of loops.
Date: Mon, 4 Oct 2021 09:30:09 -0600 [thread overview]
Message-ID: <cb648e5e-44c7-8a0a-e6b5-083f107ae36d@gmail.com> (raw)
In-Reply-To: <CAGm3qMUKGiHJZ=ySeRgfy45eCYdP1_3o5t7KRKz7TrvQcStq6A@mail.gmail.com>
On 10/4/2021 7:36 AM, Aldy Hernandez wrote:
> Note that none of the other tests have been adjusted so it'll likely
> result in multiple threading regressions.
Yea ;-) So maybe we first focus on how those affect visium since that's
what started us down this path.
The original test of regressions for visium were:
visium-sim: gcc.c-torture/execute/960218-1.c -Os (test for excess errors)
visium-sim: gcc.c-torture/execute/961125-1.c -O3 -fomit-frame-pointer
-funroll-loops -fpeel-loops -ftracer -finline-functions (test for
excess errors)
visium-sim: gcc.c-torture/execute/961125-1.c -O3 -g (test for excess
errors)
visium-sim: gcc.c-torture/execute/pending-4.c -O1 (test for excess
errors)
visium-sim: gcc.c-torture/execute/pr58209.c -O2 (test for excess errors)
visium-sim: gcc.c-torture/execute/pr58209.c -O2 -flto
-fno-use-linker-plugin -flto-partition=none (test for excess errors)
visium-sim: gcc.c-torture/execute/pr58209.c -O2 -flto
-fuse-linker-plugin -fno-fat-lto-objects (test for excess errors)
visium-sim: gcc.c-torture/execute/pr58209.c -O3 -g (test for excess
errors)
visium-sim: gcc.c-torture/execute/pr68911.c -O1 (test for excess errors)
I'm pretty confident these are all cases where we previously threaded
one or more jumps and as a result we were able to remove all calls to
abort (). Your change doesn't affect any of those :(
So probably the first thing to do is get a patch that fixes one or more
of those failures *or* make a determination that one or more of those
tests are things we do not want to optimize. The one we had previously
looked at (960218-1) had a thread path from inside the loop to a point
outside the loop. My sense is we probably want to allow that.
And just in case it got lost. Here's the analysis on 960218-1 on visium:
We've got this going into ethread:
int f (int x)
{
int D.1420;
int a;
;; basic block 2, loop depth 0, maybe hot
;; prev block 0, next block 3, flags: (NEW, REACHABLE, VISITED)
;; pred: ENTRY (FALLTHRU,EXECUTABLE)
a_4 = ~x_3(D);
goto <bb 4>; [INV]
;; succ: 4 (FALLTHRU,EXECUTABLE)
;; basic block 3, loop depth 1, maybe hot
;; prev block 2, next block 4, flags: (NEW, REACHABLE, VISITED)
;; pred: 4 (TRUE_VALUE,EXECUTABLE)
gl = a_1;
;; succ: 4 (FALLTHRU,DFS_BACK,EXECUTABLE)
;; basic block 4, loop depth 1, maybe hot
;; prev block 3, next block 5, flags: (NEW, REACHABLE, VISITED)
;; pred: 2 (FALLTHRU,EXECUTABLE)
;; 3 (FALLTHRU,DFS_BACK,EXECUTABLE)
# a_1 = PHI <a_4(2), 0(3)>
if (a_1 != 0)
goto <bb 3>; [INV]
else
goto <bb 5>; [INV]
;; succ: 3 (TRUE_VALUE,EXECUTABLE)
;; 5 (FALSE_VALUE,EXECUTABLE)
;; basic block 5, loop depth 0, maybe hot
;; prev block 4, next block 1, flags: (NEW, REACHABLE, VISITED)
;; pred: 4 (FALSE_VALUE,EXECUTABLE)
return;
;; succ: EXIT
}
There's a pretty obvious jump thread in there. 3->4->5. We used to
allow this, but it's currently being rejected and I'm not sure it should.
In simplest terms we're threading from inside the loop, through the
latch to a point outside the loop. At first glance, that seems safe.
960218-1.c, compiled with -Os
int gl;
g (x)
{
gl = x;
return 0;
}
f (x)
{
int a = ~x;
while (a)
a = g (a);
}
main ()
{
f (3);
if (gl != -4)
abort ();
exit (0);
}
Ideally in the final assembly there would be no calls to abort since it
can be determined at compile-time that the call can never happen.
jeff
next prev parent reply other threads:[~2021-10-04 15:30 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-04 9:43 Aldy Hernandez
2021-10-04 13:31 ` Jeff Law
2021-10-04 13:36 ` Aldy Hernandez
2021-10-04 15:30 ` Jeff Law [this message]
2021-10-04 16:29 ` Michael Matz
2021-10-05 11:22 ` Richard Biener
2021-10-05 12:43 ` Michael Matz
2021-10-05 14:56 ` Jeff Law
2021-10-05 13:33 ` Aldy Hernandez
2021-10-05 15:10 ` Jeff Law
2021-10-05 16:08 ` Jeff Law
2021-10-05 16:22 ` Aldy Hernandez
2021-10-06 13:15 ` Andreas Schwab
2021-10-06 13:47 ` Aldy Hernandez
2021-10-06 15:03 ` Martin Sebor
2021-10-06 16:22 ` Aldy Hernandez
2021-10-06 17:03 ` Aldy Hernandez
2021-10-06 19:11 ` Martin Sebor
2021-10-06 23:00 ` Jeff Law
2021-10-06 23:06 ` Jeff Law
2021-10-07 8:15 ` Aldy Hernandez
2021-10-07 13:35 ` Jeff Law
2021-10-06 10:22 ` Aldy Hernandez
2021-10-14 9:25 ` Aldy Hernandez
2021-10-14 14:23 ` Jeff Law
2021-10-17 1:32 ` Jeff Law
2021-10-18 10:14 ` Aldy Hernandez
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=cb648e5e-44c7-8a0a-e6b5-083f107ae36d@gmail.com \
--to=jeffreyalaw@gmail.com \
--cc=aldyh@redhat.com \
--cc=amacleod@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=matz@suse.de \
--cc=richard.guenther@gmail.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).