public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug tree-optimization/106076] New: Sub-optimal code is generated for checking bitfields via proxy functions @ 2022-06-24 10:02 kyrylo.bohdanenko at gmail dot com 2022-06-24 10:11 ` [Bug tree-optimization/106076] " kyrylo.bohdanenko at gmail dot com ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: kyrylo.bohdanenko at gmail dot com @ 2022-06-24 10:02 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106076 Bug ID: 106076 Summary: Sub-optimal code is generated for checking bitfields via proxy functions Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: kyrylo.bohdanenko at gmail dot com Target Milestone: --- Consider the following struct: #include <cstdint> struct SomeClass { uint16_t dummy1 : 1; uint16_t cfg2 : 1; uint16_t cfg3 : 1; uint16_t dummy2 : 1; uint16_t dummy3 : 1; uint16_t dummy4 : 1; uint16_t cfg1 : 1; uint16_t dummy5 : 1; uint16_t cfg4 : 1; constexpr bool checkA() const { return cfg1 || cfg2 || cfg3; } constexpr bool checkB() const { return cfg4; } constexpr bool checkA_B() const { return (cfg1 || cfg2 || cfg3) || cfg4; } constexpr bool checkA_B_SLOW() const { return checkA() || checkB(); } }; For the following functions (which do the same thing) GCC generates different assembly. bool check(const SomeClass& rt) { return rt.checkA_B(); } bool check_SLOW(const SomeClass& rt) { return rt.checkA_B_SLOW(); } Compiled as: g++ -std=c++17 -S The assembly: ; demangled: check(SomeClass const&) _Z5checkRK9SomeClass: endbr64 testw $326, (%rdi) setne %al ret ; demangled: check_SLOW(SomeClass const&) _Z10check_SLOWRK9SomeClass: endbr64 movzwl (%rdi), %edx movl $1, %eax testb $70, %dl jne .L3 movzbl %dh, %eax andl $1, %eax .L3: ret As we can see, during check_SLOW GCC decided to check the result on byte-by-byte basis introducing a conditional jump in between. It looks like GCC did not fully analyse the code after inlining checkA() and checkB(). FYI, the same code on Clang produces the 1st option of ASM for both functions. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/106076] Sub-optimal code is generated for checking bitfields via proxy functions 2022-06-24 10:02 [Bug tree-optimization/106076] New: Sub-optimal code is generated for checking bitfields via proxy functions kyrylo.bohdanenko at gmail dot com @ 2022-06-24 10:11 ` kyrylo.bohdanenko at gmail dot com 2022-06-24 10:41 ` rguenth at gcc dot gnu.org ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: kyrylo.bohdanenko at gmail dot com @ 2022-06-24 10:11 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106076 --- Comment #1 from Kyrylo Bohdanenko <kyrylo.bohdanenko at gmail dot com> --- The provided assembly is for -O2/-O3 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/106076] Sub-optimal code is generated for checking bitfields via proxy functions 2022-06-24 10:02 [Bug tree-optimization/106076] New: Sub-optimal code is generated for checking bitfields via proxy functions kyrylo.bohdanenko at gmail dot com 2022-06-24 10:11 ` [Bug tree-optimization/106076] " kyrylo.bohdanenko at gmail dot com @ 2022-06-24 10:41 ` rguenth at gcc dot gnu.org 2022-10-24 5:09 ` pinskia at gcc dot gnu.org 2022-10-24 5:09 ` pinskia at gcc dot gnu.org 3 siblings, 0 replies; 5+ messages in thread From: rguenth at gcc dot gnu.org @ 2022-06-24 10:41 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106076 Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2022-06-24 Status|UNCONFIRMED |NEW Keywords| |missed-optimization --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. that's fold-const.c optimize_bit_field_compare that doesn't work on GIMPLE (after inlining). The fold-const.c part is also premature so moving it to GIMPLE would be appreciated. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/106076] Sub-optimal code is generated for checking bitfields via proxy functions 2022-06-24 10:02 [Bug tree-optimization/106076] New: Sub-optimal code is generated for checking bitfields via proxy functions kyrylo.bohdanenko at gmail dot com 2022-06-24 10:11 ` [Bug tree-optimization/106076] " kyrylo.bohdanenko at gmail dot com 2022-06-24 10:41 ` rguenth at gcc dot gnu.org @ 2022-10-24 5:09 ` pinskia at gcc dot gnu.org 2022-10-24 5:09 ` pinskia at gcc dot gnu.org 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-10-24 5:09 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106076 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org Status|NEW |ASSIGNED --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Mine. I am going to get this upstream finally for GCC 14. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/106076] Sub-optimal code is generated for checking bitfields via proxy functions 2022-06-24 10:02 [Bug tree-optimization/106076] New: Sub-optimal code is generated for checking bitfields via proxy functions kyrylo.bohdanenko at gmail dot com ` (2 preceding siblings ...) 2022-10-24 5:09 ` pinskia at gcc dot gnu.org @ 2022-10-24 5:09 ` pinskia at gcc dot gnu.org 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-10-24 5:09 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106076 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |enhancement ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-10-24 5:09 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-06-24 10:02 [Bug tree-optimization/106076] New: Sub-optimal code is generated for checking bitfields via proxy functions kyrylo.bohdanenko at gmail dot com 2022-06-24 10:11 ` [Bug tree-optimization/106076] " kyrylo.bohdanenko at gmail dot com 2022-06-24 10:41 ` rguenth at gcc dot gnu.org 2022-10-24 5:09 ` pinskia at gcc dot gnu.org 2022-10-24 5:09 ` pinskia at gcc dot gnu.org
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).