[LoongArch] Override TargetFrameLowering::spillCalleeSavedRegisters
authorwanglei <wanglei@loongson.cn>
Thu, 10 Nov 2022 13:01:05 +0000 (21:01 +0800)
committerwanglei <wanglei@loongson.cn>
Thu, 10 Nov 2022 13:14:27 +0000 (21:14 +0800)
commitd20c54cbdb9a4a12bbfb1d51c72e52abd3f039a6
tree5ee812ddc99bdfba7d3e41c556d603807c5c30ac
parent5bc36c8cb483413bc127960552cd00f168475fc0
[LoongArch] Override TargetFrameLowering::spillCalleeSavedRegisters

When using `llvm.returnaddress` intrinsic, special handling is required
for the spill of the `RA` register. Otherwise it will cause the verifier
fail in some cases (e.g. pr17377.c of the GCC C Torture Suite).

Specifically:
```
*** Bad machine code: Using an undefined physical register ***
- function:    f
- basic block: %bb.0 entry (0xd94d18)
- instruction: ST_D killed $r1, $r22, -40 :: (store (s64) into %stack.2)
- operand 0:   killed $r1
```

Reviewed By: SixWeining

Differential Revision: https://reviews.llvm.org/D137387
llvm/lib/Target/LoongArch/LoongArchFrameLowering.cpp
llvm/lib/Target/LoongArch/LoongArchFrameLowering.h
llvm/test/CodeGen/LoongArch/spill-ra-without-kill.ll [new file with mode: 0644]