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

            Bug ID: 119679
           Summary: [RISC-V] Compiler adds and removes stack to functions
                    even when not needed
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vincenzo.romano at gmail dot com
  Target Milestone: ---

This C code:

typedef struct {
  unsigned long one;
  unsigned long two;
} twin;

twin function( twin t ) {
  return (twin){ 0,0 };
}

results in this assembly file:

        .file   "p.c"
        .option nopic
        .attribute arch,
"rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0"
        .attribute unaligned_access, 0
        .attribute stack_align, 16
        .text
        .align  1
        .globl  function
        .type   function, @function
function:
        addi    sp,sp,-32
        li      a0,0
        li      a1,0
        addi    sp,sp,32
        jr      ra
        .size   function, .-function
        .ident  "GCC: (g04696df09) 14.2.0"
        .section        .note.GNU-stack,"",@progbits

when passed through "riscv64-unknown-elf-gcc (g04696df09) 14.2.0" with "-O",
"-O2", "-O3" and "-Os" optimization options.

The generated code just uses "a0" and "a1" registers and needs no local stack
("sp") inside the function body.

So those two instructions on "sp" register are pretty useless nd get generated
also with "-fomit-frame-pointer" option.

As a comparison, clang v20.1.0 works in an expected way.

You can check this also on GodBolt:

https://godbolt.org/z/11Gedzn4Y

Reply via email to