You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何RISC-V GCC会在返回小型结构体的函数中无用预留栈空间?

冗余栈操作的GCC问题

对应的C代码

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

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

生成的RISC-V汇编代码

.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

编译环境

使用编译器 riscv64-unknown-elf-gcc (g04696df09) 14.2.0,开启 -O3、-O2、-O1 或 -Os 优化等级时,会生成上述汇编代码。

疑问

这段代码的返回值实际是通过寄存器 a0 和 a1 传递的,却额外执行了栈指针加减32字节的操作,这两条指令看起来完全冗余。这是编译器的Bug,还是有什么被忽略的细节?

更新

[更新] 经确认,这确实是一个GCC的Bug。


内容的提问来源于Stack Exchange,提问作者EnzoR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:28:09