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

            Bug ID: 118109
           Summary: RISC-V: Empty Variadic Function Redundantly Pushes
                    Argument Registers onto Stack
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jonathan.gruber.jg at gmail dot com
  Target Milestone: ---

Created attachment 59910
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59910&action=edit
Minimal test case.

When an empty variadic function is compiled to RISC-V, the argument registers
a1-a7 are redundantly pushed onto the stack. I only tested with 64-bit RISC-V,
but I would not be surprised if 32-bit RISC-V has the same problem.

Minimal test case:

#include <stdarg.h>

void test(int dummy, ...) {
        /* Empty. */
}


riscv64 assembly, with -Oz, -Os, -O1, -O2, or -O3:

test:
        .cfi_startproc
        addi    sp,sp,-64
        .cfi_def_cfa_offset 64
        sd      a1,8(sp)
        sd      a2,16(sp)
        sd      a3,24(sp)
        sd      a4,32(sp)
        sd      a5,40(sp)
        sd      a6,48(sp)
        sd      a7,56(sp)
        addi    sp,sp,64
        .cfi_def_cfa_offset 0
        jr      ra
        .cfi_endproc


Host system type: Arch Linux, x86_64.

riscv64-linux-gnu-gcc information:
Version: 14.2.0.
Configured with: /build/riscv64-linux-gnu-gcc/src/gcc-14.2.0/configure
--prefix=/usr --program-prefix=riscv64-linux-gnu-
--with-local-prefix=/usr/riscv64-linux-gnu
--with-sysroot=/usr/riscv64-linux-gnu
--with-build-sysroot=/usr/riscv64-linux-gnu --libdir=/usr/lib
--libexecdir=/usr/lib --target=riscv64-linux-gnu --host=x86_64-pc-linux-gnu
--build=x86_64-pc-linux-gnu --with-system-zlib --with-isl
--with-linker-hash-style=gnu --disable-nls --disable-libunwind-exceptions
--disable-libstdcxx-pch --disable-libssp --disable-multilib --disable-werror
--enable-languages=c,c++ --enable-shared --enable-threads=posix
--enable-__cxa_atexit --enable-clocale=gnu --enable-gnu-unique-object
--enable-linker-build-id --enable-lto --enable-plugin
--enable-install-libiberty --enable-gnu-indirect-function --enable-default-pie
--enable-checking=release

Reply via email to