https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87690
--- Comment #2 from Alex Bradbury <asb at lowrisc dot org> ---
Better example demonstrating the problem exists for returns too:
$ cat foo.c
struct float_struct { float v; };
struct char_struct { char v; };
struct float_struct callee(float, char);
float caller(struct float_struct fs, struct char_struct cs) {
return callee(fs.v, cs.v).v;
}
$ ./riscv32-unknown-elf-gcc -march=rv64i -mabi=lp64 -S -o - foo.c -O2
.file "foo.c"
.option nopic
.text
.align 2
.globl caller
.type caller, @function
caller:
addi sp,sp,-16
andi a1,a1,0xff
sd ra,8(sp)
call callee
ld ra,8(sp)
addi sp,sp,16
jr ra
.size caller, .-caller
.ident "GCC: (GNU) 9.0.0 20180922 (experimental)"