[Bug target/112478] riscv: asm clobbers not honored
kito at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Nov 14 02:10:04 GMT 2023
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112478
Kito Cheng <kito at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
CC| |kito at gcc dot gnu.org
Last reconfirmed| |2023-11-14
Status|UNCONFIRMED |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |kito at gcc dot gnu.org
--- Comment #6 from Kito Cheng <kito at gcc dot gnu.org> ---
Oh, I guess I know what happened, I was confused by the commit you refer (but
it's the root cause as you pointed out!) since I thought it may related to far
jumps, but...actually not, the problem is something you describe in the title,
and can be demonstrate by following small program:
```c
void foo() {
asm volatile("# " : ::"ra");
}
```
Before that commit:
```asm
foo:
addi sp,sp,-16
sd ra,8(sp)
#APP
# 2 "x.c" 1
#
# 0 "" 2
#NO_APP
ld ra,8(sp)
addi sp,sp,16
jr ra
```
After that commit:
```asm
foo:
.LFB0:
.cfi_startproc
#APP
# 2 "x.c" 1
#
# 0 "" 2
#NO_APP
ret
```
But why? because ra is accidentally become caller save register by following
change:
https://github.com/gcc-mirror/gcc/commit/71f906498ada9ec2780660b03bd6e27a93ad350c#diff-4083cffa971a940af1d435359a45dbfd4d5934384275b0ae5e0c71dece5fd866R331
So we no longer save it at prologue and epilogue longer...anyway I will take
this and send a patch to fix that soon.
More information about the Gcc-bugs
mailing list