public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "manolis.tsamis at vrull dot eu" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/109393] New: Very trivial address calculation does not fold Date: Mon, 03 Apr 2023 17:57:46 +0000 [thread overview] Message-ID: <bug-109393-4@http.gcc.gnu.org/bugzilla/> (raw) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109393 Bug ID: 109393 Summary: Very trivial address calculation does not fold Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: manolis.tsamis at vrull dot eu Target Milestone: --- The following function int func(int *a, int j) { int k = j - 1; return a[j - 1] == a[k]; } surprisingly does not fold to `return 1;` at -O2 or higher (with any GCC version). It can also be seen here: https://godbolt.org/z/cqr43q7fq There are a lot of variants for this behaviour but this is the most apparent. As can be seen in the godbolt link, the issue seems to be a combination of: 1) The -1 in a[j - 1] is turned into GIMPLE equivalent with *((a + (ulong) j) + (ulong) -1) but a[k] is turned into *(a + (ulong) (j - 1)). 2) The -1 is never propagated outside of the (long unsigned int) casts even if it's completely legal/possible. I feel that I'm missing something here about pointer rules / historical context of these choices and I would appreciate if someone more knowlegable could explain this combination to me. There are a lot of cases where this can lead to inefficient codegen but most prominently this is the reason for a additional redundant load in a hot loop of SPEC2017's nab in the function downheap_pairs and similar missed optimizations in omnetpp's shiftup function. Hence this issue can both cause very unexpected missed optimization (as in the example) and also decreases the performance of important benchmarks. Note: The testcase is not optimized even with -fno-wrapv or -fstrict-overflow, but does optimize with -fwrapv which is the reverse of what I would expect since -fno-wrapv should be more permissive?
next reply other threads:[~2023-04-03 17:57 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-04-03 17:57 manolis.tsamis at vrull dot eu [this message] 2023-04-03 18:07 ` [Bug tree-optimization/109393] " pinskia at gcc dot gnu.org 2023-04-04 12:12 ` manolis.tsamis at vrull dot eu 2023-04-11 12:16 ` [Bug c/109393] " rguenth at gcc dot gnu.org 2023-05-10 12:55 ` manolis.tsamis at vrull dot eu 2023-05-11 12:47 ` rguenth at gcc dot gnu.org 2023-05-11 12:59 ` manolis.tsamis at vrull dot eu 2023-09-04 11:38 ` manolis.tsamis at vrull dot eu 2023-09-04 13:06 ` philipp.tomsich at vrull dot eu 2023-09-08 13:14 ` manolis.tsamis at vrull dot eu
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=bug-109393-4@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@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: linkBe 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).