为何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
相关产品推荐
相关产品推荐

