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

            Bug ID: 116211
           Summary: C Functions returning a struct always manipulate the
                    stack pointer on RISC-V targets
           Product: gcc
           Version: 14.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gr.audio at gmail dot com
  Target Milestone: ---

Here's what I consider a "bug" for RISC-V targets (32 & 64) with GCC 14.1
(tested down to v8, so that's a long-standing one), even if it doesn't produce
incorrect code, it generates unnecessary code.

Any C function returning a struct, even when the stack is not used within said
function, generates instructions for reserving space on the stack, and
restoring sp afterwards. I don't see an ABI reason for doing so, and FYI, LLVM
doesn't generate such code.

Here is a minimal code that triggers this oddity;

[code]
#include <stdint.h>

typedef struct
{
        double x;
        uint64_t n;

}       Test_t;

Test_t Foo(double x1, uint64_t n1)
{
        return (Test_t){ .x = x1, .n = n1 };
}
[/code]

The generated assembly at -O1 to -O3 is:

[code]
Foo:
        addi    sp,sp,-32
        addi    sp,sp,32
        jr      ra
[/code]

Note that the struct needs to have at least 2 fields for this unncessary
manipulation of sp to happen.

Reply via email to