[llvm] [RISCV] Support floating point registers with -fzero-call-used-regs (PR #204929)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 21 17:14:23 PDT 2026


================
@@ -1432,6 +1432,34 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
   emitSiFiveCLICStackSwap(MF, MBB, MBBI, DL);
 }
 
+static MCRegister getLargestFPRegisterOrZero(const RISCVSubtarget &STI,
+                                             const TargetRegisterInfo &TRI,
+                                             MCRegister Reg) {
+  if (!STI.hasStdExtF())
+    return 0;
+
+  TargetRegisterClass LargestFPRegClass = STI.getLargestFPRegClass().value();
+
+  if (LargestFPRegClass.contains(Reg))
+    return Reg;
+
+  std::array<TargetRegisterClass, 3> RegisterClasses = {
+      RISCV::FPR16RegClass, RISCV::FPR32RegClass, RISCV::FPR64RegClass};
+  std::array<int, 3> SubIdx = {RISCV::sub_16, RISCV::sub_32, RISCV::sub_64};
+
+  for (unsigned i = 0; i < RegisterClasses.size(); ++i) {
----------------
topperc wrote:

You can use `zip` to make this a range loop. Something like

```
for (auto [RegClass, SubReg] : zip(RegisterClasses, SubIdx))
```

https://github.com/llvm/llvm-project/pull/204929


More information about the llvm-commits mailing list