| Issue |
161482
|
| Summary |
RISC-V Inefficient Codegen with Scoped VLAs
|
| Labels |
backend:RISC-V,
missed-optimization,
llvm:codesize
|
| Assignees |
|
| Reporter |
lenary
|
https://godbolt.org/z/Tfn6s5rrc
The code here has a VLA inside an inner scope, so uses `@llvm.stacksave` and `@llvm.stackrestore` to save/restore the stack inside the code. The variable sized frame object is added during isel (`fi#0`).
At the end of the function, there is this perculiar sequence:
```
mv sp, a0
li a0, 1
addi sp, s0, -16
qc.cm.pop {ra, s0}, 16
```
The `mv` and the `addi` both put the same value back into `sp`. We don't need both from what I can see.
The `mv` comes from a COPY introduced by isel for `@llvm.stackrestore`. The `addi` is introduced by PEI.
---
I have also seen examples where the initial update of `SP` for the vla's dynamic allocation is done inefficiently: https://godbolt.org/z/3f3cec9jx
```
qc.cm.pushfp {ra, s0}, -16
mv a0, sp
mv a3, sp
addi a2, a3, -16
mv sp, a2
...
mv sp, a0
li a0, 1
addi sp, s0, -16
qc.cm.pop {ra, s0}, 16
```
The `mv; addi; mv` sequence could just be `addi sp, sp, -16`. It looks to be happening during ISel as well, rather than in PEI. I hope that can be made more efficient.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs