public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion
@ 2024-06-21  7:44 jzwinck at gmail dot com
  2024-06-21  7:49 ` [Bug c++/115576] " pinskia at gcc dot gnu.org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: jzwinck at gmail dot com @ 2024-06-21  7:44 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115576

            Bug ID: 115576
           Summary: [14 regression] Worse code generated for simple struct
                    conversion
           Product: gcc
           Version: 14.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jzwinck at gmail dot com
  Target Milestone: ---

Here is some simple code from a real application which converts one struct to a
similar but larger one:

    #include <cstdint>

    struct S64
    {
        uint64_t a;
        int8_t b;
        int8_t c;
        uint16_t d;
    };

    struct S32
    {
        uint32_t a;
        int8_t b;
        int8_t c;
        uint16_t d;

        S64 To64() const;
    };

    S64 S32::To64() const
    {
        return S64{a, b, c, d};
    }

GCC 13 and earlier emitted good code for this (as does Clang):

    S32::To64() const:
        mov     eax, DWORD PTR [rdi]
        mov     edx, DWORD PTR [rdi+4]
        ret

GCC 14 is much worse:

    S32::To64() const:
        xor     edx, edx
        mov     esi, DWORD PTR [rdi+4]
        mov     eax, DWORD PTR [rdi]
        movabs  rdi, -4294967296
        mov     rcx, rdx
        and     rcx, rdi
        or      rcx, rsi
        mov     rdx, rcx
        ret

Demo: https://godbolt.org/z/YbenMeEPq

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/115576] [14 regression] Worse code generated for simple struct conversion
  2024-06-21  7:44 [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion jzwinck at gmail dot com
@ 2024-06-21  7:49 ` pinskia at gcc dot gnu.org
  2024-06-21  7:52 ` [Bug c++/115576] [14/15 " rguenth at gcc dot gnu.org
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-21  7:49 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115576

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|target                      |c++

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Looks like the padding is being zeroed.

Are you sure that is zeroing the padding here is what is expected of this.
Code?

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/115576] [14/15 regression] Worse code generated for simple struct conversion
  2024-06-21  7:44 [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion jzwinck at gmail dot com
  2024-06-21  7:49 ` [Bug c++/115576] " pinskia at gcc dot gnu.org
@ 2024-06-21  7:52 ` rguenth at gcc dot gnu.org
  2024-06-21 17:44 ` [Bug target/115576] " pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-06-21  7:52 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115576

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2024-06-21
                 CC|                            |sayle at gcc dot gnu.org
      Known to work|                            |13.3.0
   Target Milestone|---                         |14.2
           Keywords|                            |missed-optimization,
                   |                            |needs-bisection
             Status|UNCONFIRMED                 |NEW
      Known to fail|                            |14.1.0, 15.0
             Target|X86_64                      |x86_64-*-*
           Priority|P3                          |P2
            Summary|[14 regression] Worse code  |[14/15 regression] Worse
                   |generated for simple struct |code generated for simple
                   |conversion                  |struct conversion

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  Probably the TImode enhancements.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/115576] [14/15 regression] Worse code generated for simple struct conversion
  2024-06-21  7:44 [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion jzwinck at gmail dot com
  2024-06-21  7:49 ` [Bug c++/115576] " pinskia at gcc dot gnu.org
  2024-06-21  7:52 ` [Bug c++/115576] [14/15 " rguenth at gcc dot gnu.org
@ 2024-06-21 17:44 ` pinskia at gcc dot gnu.org
  2024-06-25  8:17 ` user202729 at protonmail dot com
  2024-06-26  7:10 ` [Bug target/115576] [14/15 regression] Worse code generated for simple struct conversion since r14-2386-gbdf2737cda53a8 user202729 at protonmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-06-21 17:44 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115576

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|c++                         |target

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #2)
> Confirmed.  Probably the TImode enhancements.

Actually you might be right since the IR from the gimple level is the same
between GCC 13 and 14. And aarch64 code generation didn't change.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/115576] [14/15 regression] Worse code generated for simple struct conversion
  2024-06-21  7:44 [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion jzwinck at gmail dot com
                   ` (2 preceding siblings ...)
  2024-06-21 17:44 ` [Bug target/115576] " pinskia at gcc dot gnu.org
@ 2024-06-25  8:17 ` user202729 at protonmail dot com
  2024-06-26  7:10 ` [Bug target/115576] [14/15 regression] Worse code generated for simple struct conversion since r14-2386-gbdf2737cda53a8 user202729 at protonmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: user202729 at protonmail dot com @ 2024-06-25  8:17 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115576

user202729 <user202729 at protonmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |user202729 at protonmail dot com

--- Comment #4 from user202729 <user202729 at protonmail dot com> ---
Doing a binary search reveals that the patch that causes the issue is
https://gcc.gnu.org/pipermail/gcc-patches/2023-July/623766.html  .

Looking at the optimization process, the working is roughly the following:

Before the change, the expand pass generates code that uses (set (subreg ...)).
Then the split pass splits the register that is being used in subreg into two
registers, then the combine pass do "constant propagation" and simplifies the
code.

After the change, the expand pass generates code that uses (set reg (ior (and
reg 0xffff0000) value)). Thus the split pass cannot split the register (it does
not know how to deal with "and", and the combine pass is similarly stuck.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug target/115576] [14/15 regression] Worse code generated for simple struct conversion since r14-2386-gbdf2737cda53a8
  2024-06-21  7:44 [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion jzwinck at gmail dot com
                   ` (3 preceding siblings ...)
  2024-06-25  8:17 ` user202729 at protonmail dot com
@ 2024-06-26  7:10 ` user202729 at protonmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: user202729 at protonmail dot com @ 2024-06-26  7:10 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115576

--- Comment #5 from user202729 <user202729 at protonmail dot com> ---
I think this can be resolved by implementing some code in combine.cc to
replace:

(set:TI (reg:TI 101) (zero_extend:TI (...:DI ...)))
(set:DI (reg:DI ...) (subreg:DI (reg:TI 101) 8))

with

(set:TI (reg:TI 101) (zero_extend:TI (...:DI ...)))
(set:DI (reg:DI ...) (const_int 0))

This certainly is always an improvement, because 0 is simpler than extracting
the subregister.

After that, a few other passes of combine rescanning should be able to constant
fold the 0 forward.

Unfortunately, I don't know how to modify combine.cc or some other files to
handle this pattern. Can anyone give a suggestion? (maybe add a
define_peephole2 in common.md ? )

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-06-26  7:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-21  7:44 [Bug rtl-optimization/115576] New: [14 regression] Worse code generated for simple struct conversion jzwinck at gmail dot com
2024-06-21  7:49 ` [Bug c++/115576] " pinskia at gcc dot gnu.org
2024-06-21  7:52 ` [Bug c++/115576] [14/15 " rguenth at gcc dot gnu.org
2024-06-21 17:44 ` [Bug target/115576] " pinskia at gcc dot gnu.org
2024-06-25  8:17 ` user202729 at protonmail dot com
2024-06-26  7:10 ` [Bug target/115576] [14/15 regression] Worse code generated for simple struct conversion since r14-2386-gbdf2737cda53a8 user202729 at protonmail dot com

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).