Skip to content

[RISCV] Remove X16-31 from interrupt callee saved register list for RVE+D. #139213

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 9, 2025

Conversation

topperc
Copy link
Collaborator

@topperc topperc commented May 9, 2025

No description provided.

@llvmbot
Copy link
Member

llvmbot commented May 9, 2025

@llvm/pr-subscribers-backend-risc-v

Author: Craig Topper (topperc)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/139213.diff

2 Files Affected:

  • (modified) llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp (+2-1)
  • (modified) llvm/test/CodeGen/RISCV/interrupt-attr.ll (+47-111)
diff --git a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
index b3340b97f4b09..c6f6c9007b2b1 100644
--- a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
@@ -67,7 +67,8 @@ RISCVRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
     return CSR_NoRegs_SaveList;
   if (MF->getFunction().hasFnAttribute("interrupt")) {
     if (Subtarget.hasStdExtD())
-      return CSR_XLEN_F64_Interrupt_SaveList;
+      return Subtarget.hasStdExtE() ? CSR_XLEN_F64_Interrupt_RVE_SaveList
+                                    : CSR_XLEN_F64_Interrupt_SaveList;
     if (Subtarget.hasStdExtF())
       return Subtarget.hasStdExtE() ? CSR_XLEN_F32_Interrupt_RVE_SaveList
                                     : CSR_XLEN_F32_Interrupt_SaveList;
diff --git a/llvm/test/CodeGen/RISCV/interrupt-attr.ll b/llvm/test/CodeGen/RISCV/interrupt-attr.ll
index 739c9d8d0b0ac..ba20ba77e6b26 100644
--- a/llvm/test/CodeGen/RISCV/interrupt-attr.ll
+++ b/llvm/test/CodeGen/RISCV/interrupt-attr.ll
@@ -1442,33 +1442,17 @@ define void @foo_with_call() #1 {
 ;
 ; CHECK-RV64E-FD-LABEL: foo_with_call:
 ; CHECK-RV64E-FD:       # %bb.0:
-; CHECK-RV64E-FD-NEXT:    addi sp, sp, -464
-; CHECK-RV64E-FD-NEXT:    sd ra, 456(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t0, 448(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t1, 440(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t2, 432(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a0, 424(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a1, 416(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a2, 408(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a3, 400(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a4, 392(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a5, 384(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a6, 376(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a7, 368(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s2, 360(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s3, 352(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s4, 344(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s5, 336(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s6, 328(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s7, 320(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s8, 312(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s9, 304(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s10, 296(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s11, 288(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t3, 280(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t4, 272(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t5, 264(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t6, 256(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    addi sp, sp, -336
+; CHECK-RV64E-FD-NEXT:    sd ra, 328(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd t0, 320(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd t1, 312(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd t2, 304(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a0, 296(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a1, 288(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a2, 280(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a3, 272(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a4, 264(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a5, 256(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft0, 248(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft1, 240(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft2, 232(sp) # 8-byte Folded Spill
@@ -1502,32 +1486,16 @@ define void @foo_with_call() #1 {
 ; CHECK-RV64E-FD-NEXT:    fsd ft10, 8(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft11, 0(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    call otherfoo
-; CHECK-RV64E-FD-NEXT:    ld ra, 456(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t0, 448(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t1, 440(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t2, 432(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a0, 424(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a1, 416(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a2, 408(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a3, 400(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a4, 392(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a5, 384(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a6, 376(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a7, 368(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s2, 360(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s3, 352(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s4, 344(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s5, 336(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s6, 328(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s7, 320(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s8, 312(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s9, 304(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s10, 296(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s11, 288(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t3, 280(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t4, 272(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t5, 264(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t6, 256(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld ra, 328(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld t0, 320(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld t1, 312(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld t2, 304(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a0, 296(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a1, 288(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a2, 280(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a3, 272(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a4, 264(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a5, 256(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft0, 248(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft1, 240(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft2, 232(sp) # 8-byte Folded Reload
@@ -1560,7 +1528,7 @@ define void @foo_with_call() #1 {
 ; CHECK-RV64E-FD-NEXT:    fld ft9, 16(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft10, 8(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft11, 0(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    addi sp, sp, 464
+; CHECK-RV64E-FD-NEXT:    addi sp, sp, 336
 ; CHECK-RV64E-FD-NEXT:    mret
   %call = call i32 @otherfoo()
   ret void
@@ -2993,34 +2961,18 @@ define void @foo_fp_with_call() #2 {
 ;
 ; CHECK-RV64E-FD-LABEL: foo_fp_with_call:
 ; CHECK-RV64E-FD:       # %bb.0:
-; CHECK-RV64E-FD-NEXT:    addi sp, sp, -472
-; CHECK-RV64E-FD-NEXT:    sd ra, 464(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t0, 456(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t1, 448(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t2, 440(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s0, 432(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a0, 424(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a1, 416(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a2, 408(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a3, 400(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a4, 392(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a5, 384(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a6, 376(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd a7, 368(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s2, 360(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s3, 352(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s4, 344(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s5, 336(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s6, 328(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s7, 320(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s8, 312(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s9, 304(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s10, 296(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd s11, 288(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t3, 280(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t4, 272(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t5, 264(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    sd t6, 256(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    addi sp, sp, -344
+; CHECK-RV64E-FD-NEXT:    sd ra, 336(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd t0, 328(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd t1, 320(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd t2, 312(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd s0, 304(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a0, 296(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a1, 288(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a2, 280(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a3, 272(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a4, 264(sp) # 8-byte Folded Spill
+; CHECK-RV64E-FD-NEXT:    sd a5, 256(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft0, 248(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft1, 240(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft2, 232(sp) # 8-byte Folded Spill
@@ -3053,35 +3005,19 @@ define void @foo_fp_with_call() #2 {
 ; CHECK-RV64E-FD-NEXT:    fsd ft9, 16(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft10, 8(sp) # 8-byte Folded Spill
 ; CHECK-RV64E-FD-NEXT:    fsd ft11, 0(sp) # 8-byte Folded Spill
-; CHECK-RV64E-FD-NEXT:    addi s0, sp, 472
+; CHECK-RV64E-FD-NEXT:    addi s0, sp, 344
 ; CHECK-RV64E-FD-NEXT:    call otherfoo
-; CHECK-RV64E-FD-NEXT:    ld ra, 464(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t0, 456(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t1, 448(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t2, 440(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s0, 432(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a0, 424(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a1, 416(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a2, 408(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a3, 400(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a4, 392(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a5, 384(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a6, 376(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld a7, 368(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s2, 360(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s3, 352(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s4, 344(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s5, 336(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s6, 328(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s7, 320(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s8, 312(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s9, 304(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s10, 296(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld s11, 288(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t3, 280(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t4, 272(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t5, 264(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    ld t6, 256(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld ra, 336(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld t0, 328(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld t1, 320(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld t2, 312(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld s0, 304(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a0, 296(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a1, 288(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a2, 280(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a3, 272(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a4, 264(sp) # 8-byte Folded Reload
+; CHECK-RV64E-FD-NEXT:    ld a5, 256(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft0, 248(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft1, 240(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft2, 232(sp) # 8-byte Folded Reload
@@ -3114,7 +3050,7 @@ define void @foo_fp_with_call() #2 {
 ; CHECK-RV64E-FD-NEXT:    fld ft9, 16(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft10, 8(sp) # 8-byte Folded Reload
 ; CHECK-RV64E-FD-NEXT:    fld ft11, 0(sp) # 8-byte Folded Reload
-; CHECK-RV64E-FD-NEXT:    addi sp, sp, 472
+; CHECK-RV64E-FD-NEXT:    addi sp, sp, 344
 ; CHECK-RV64E-FD-NEXT:    mret
   %call = call i32 @otherfoo()
   ret void

Copy link
Member

@lenary lenary left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought we didn't allow this combo due to frame/base-pointer issues, but maybe that's only with dynamic allocas as you seem to be able to hit this case.

LGTM.

@topperc topperc merged commit 56c3ef1 into llvm:main May 9, 2025
10 of 13 checks passed
@topperc topperc deleted the pr/rve-interrupt branch May 9, 2025 15:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants