Skip to content

Commit 1d2c407

Browse files
yetingkKaiYG
authored andcommitted
[RISCV] Disable zcmp push/pop for variadic functions. (llvm#65302)
Variadic function needs a save region for variable arguement and the region is possible to be overlaped with the region of zcmp push/pop used.
1 parent 7520b9e commit 1d2c407

File tree

2 files changed

+183
-3
lines changed

2 files changed

+183
-3
lines changed

llvm/lib/Target/RISCV/RISCVMachineFunctionInfo.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,13 @@ class RISCVMachineFunctionInfo : public MachineFunctionInfo {
132132
void setCalleeSavedStackSize(unsigned Size) { CalleeSavedStackSize = Size; }
133133

134134
bool isPushable(const MachineFunction &MF) const {
135-
return (!useSaveRestoreLibCalls(MF) &&
136-
MF.getSubtarget<RISCVSubtarget>().hasStdExtZcmp() &&
137-
!MF.getTarget().Options.DisableFramePointerElim(MF));
135+
// We cannot use fixed locations for the callee saved spill slots if the
136+
// function uses a varargs save area.
137+
// TODO: Use a seperate placement for vararg registers to enable Zcmp.
138+
return !useSaveRestoreLibCalls(MF) &&
139+
MF.getSubtarget<RISCVSubtarget>().hasStdExtZcmp() &&
140+
!MF.getTarget().Options.DisableFramePointerElim(MF) &&
141+
VarArgsSaveSize == 0;
138142
}
139143

140144
int getRVPushRlist() const { return RVPushRlist; }

llvm/test/CodeGen/RISCV/callee-saved-gprs.ll

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,3 +2596,179 @@ entry:
25962596
tail call void asm sideeffect "li s4, 0", "~{s4}"()
25972597
ret void
25982598
}
2599+
2600+
define void @varargs(...) {
2601+
; RV32I-LABEL: varargs:
2602+
; RV32I: # %bb.0:
2603+
; RV32I-NEXT: addi sp, sp, -48
2604+
; RV32I-NEXT: .cfi_def_cfa_offset 48
2605+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2606+
; RV32I-NEXT: .cfi_offset ra, -36
2607+
; RV32I-NEXT: sw a7, 44(sp)
2608+
; RV32I-NEXT: sw a6, 40(sp)
2609+
; RV32I-NEXT: sw a5, 36(sp)
2610+
; RV32I-NEXT: sw a4, 32(sp)
2611+
; RV32I-NEXT: sw a3, 28(sp)
2612+
; RV32I-NEXT: sw a2, 24(sp)
2613+
; RV32I-NEXT: sw a1, 20(sp)
2614+
; RV32I-NEXT: sw a0, 16(sp)
2615+
; RV32I-NEXT: call callee@plt
2616+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2617+
; RV32I-NEXT: addi sp, sp, 48
2618+
; RV32I-NEXT: ret
2619+
;
2620+
; RV32I-WITH-FP-LABEL: varargs:
2621+
; RV32I-WITH-FP: # %bb.0:
2622+
; RV32I-WITH-FP-NEXT: addi sp, sp, -48
2623+
; RV32I-WITH-FP-NEXT: .cfi_def_cfa_offset 48
2624+
; RV32I-WITH-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2625+
; RV32I-WITH-FP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2626+
; RV32I-WITH-FP-NEXT: .cfi_offset ra, -36
2627+
; RV32I-WITH-FP-NEXT: .cfi_offset s0, -40
2628+
; RV32I-WITH-FP-NEXT: addi s0, sp, 16
2629+
; RV32I-WITH-FP-NEXT: .cfi_def_cfa s0, 32
2630+
; RV32I-WITH-FP-NEXT: sw a7, 28(s0)
2631+
; RV32I-WITH-FP-NEXT: sw a6, 24(s0)
2632+
; RV32I-WITH-FP-NEXT: sw a5, 20(s0)
2633+
; RV32I-WITH-FP-NEXT: sw a4, 16(s0)
2634+
; RV32I-WITH-FP-NEXT: sw a3, 12(s0)
2635+
; RV32I-WITH-FP-NEXT: sw a2, 8(s0)
2636+
; RV32I-WITH-FP-NEXT: sw a1, 4(s0)
2637+
; RV32I-WITH-FP-NEXT: sw a0, 0(s0)
2638+
; RV32I-WITH-FP-NEXT: call callee@plt
2639+
; RV32I-WITH-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2640+
; RV32I-WITH-FP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2641+
; RV32I-WITH-FP-NEXT: addi sp, sp, 48
2642+
; RV32I-WITH-FP-NEXT: ret
2643+
;
2644+
; RV32IZCMP-LABEL: varargs:
2645+
; RV32IZCMP: # %bb.0:
2646+
; RV32IZCMP-NEXT: addi sp, sp, -48
2647+
; RV32IZCMP-NEXT: .cfi_def_cfa_offset 48
2648+
; RV32IZCMP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2649+
; RV32IZCMP-NEXT: .cfi_offset ra, -36
2650+
; RV32IZCMP-NEXT: sw a7, 44(sp)
2651+
; RV32IZCMP-NEXT: sw a6, 40(sp)
2652+
; RV32IZCMP-NEXT: sw a5, 36(sp)
2653+
; RV32IZCMP-NEXT: sw a4, 32(sp)
2654+
; RV32IZCMP-NEXT: sw a3, 28(sp)
2655+
; RV32IZCMP-NEXT: sw a2, 24(sp)
2656+
; RV32IZCMP-NEXT: sw a1, 20(sp)
2657+
; RV32IZCMP-NEXT: sw a0, 16(sp)
2658+
; RV32IZCMP-NEXT: call callee@plt
2659+
; RV32IZCMP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2660+
; RV32IZCMP-NEXT: addi sp, sp, 48
2661+
; RV32IZCMP-NEXT: ret
2662+
;
2663+
; RV32IZCMP-WITH-FP-LABEL: varargs:
2664+
; RV32IZCMP-WITH-FP: # %bb.0:
2665+
; RV32IZCMP-WITH-FP-NEXT: addi sp, sp, -48
2666+
; RV32IZCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 48
2667+
; RV32IZCMP-WITH-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2668+
; RV32IZCMP-WITH-FP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2669+
; RV32IZCMP-WITH-FP-NEXT: .cfi_offset ra, -36
2670+
; RV32IZCMP-WITH-FP-NEXT: .cfi_offset s0, -40
2671+
; RV32IZCMP-WITH-FP-NEXT: addi s0, sp, 16
2672+
; RV32IZCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 32
2673+
; RV32IZCMP-WITH-FP-NEXT: sw a7, 28(s0)
2674+
; RV32IZCMP-WITH-FP-NEXT: sw a6, 24(s0)
2675+
; RV32IZCMP-WITH-FP-NEXT: sw a5, 20(s0)
2676+
; RV32IZCMP-WITH-FP-NEXT: sw a4, 16(s0)
2677+
; RV32IZCMP-WITH-FP-NEXT: sw a3, 12(s0)
2678+
; RV32IZCMP-WITH-FP-NEXT: sw a2, 8(s0)
2679+
; RV32IZCMP-WITH-FP-NEXT: sw a1, 4(s0)
2680+
; RV32IZCMP-WITH-FP-NEXT: sw a0, 0(s0)
2681+
; RV32IZCMP-WITH-FP-NEXT: call callee@plt
2682+
; RV32IZCMP-WITH-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2683+
; RV32IZCMP-WITH-FP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2684+
; RV32IZCMP-WITH-FP-NEXT: addi sp, sp, 48
2685+
; RV32IZCMP-WITH-FP-NEXT: ret
2686+
;
2687+
; RV64I-LABEL: varargs:
2688+
; RV64I: # %bb.0:
2689+
; RV64I-NEXT: addi sp, sp, -80
2690+
; RV64I-NEXT: .cfi_def_cfa_offset 80
2691+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2692+
; RV64I-NEXT: .cfi_offset ra, -72
2693+
; RV64I-NEXT: sd a7, 72(sp)
2694+
; RV64I-NEXT: sd a6, 64(sp)
2695+
; RV64I-NEXT: sd a5, 56(sp)
2696+
; RV64I-NEXT: sd a4, 48(sp)
2697+
; RV64I-NEXT: sd a3, 40(sp)
2698+
; RV64I-NEXT: sd a2, 32(sp)
2699+
; RV64I-NEXT: sd a1, 24(sp)
2700+
; RV64I-NEXT: sd a0, 16(sp)
2701+
; RV64I-NEXT: call callee@plt
2702+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2703+
; RV64I-NEXT: addi sp, sp, 80
2704+
; RV64I-NEXT: ret
2705+
;
2706+
; RV64I-WITH-FP-LABEL: varargs:
2707+
; RV64I-WITH-FP: # %bb.0:
2708+
; RV64I-WITH-FP-NEXT: addi sp, sp, -80
2709+
; RV64I-WITH-FP-NEXT: .cfi_def_cfa_offset 80
2710+
; RV64I-WITH-FP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2711+
; RV64I-WITH-FP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
2712+
; RV64I-WITH-FP-NEXT: .cfi_offset ra, -72
2713+
; RV64I-WITH-FP-NEXT: .cfi_offset s0, -80
2714+
; RV64I-WITH-FP-NEXT: addi s0, sp, 16
2715+
; RV64I-WITH-FP-NEXT: .cfi_def_cfa s0, 64
2716+
; RV64I-WITH-FP-NEXT: sd a7, 56(s0)
2717+
; RV64I-WITH-FP-NEXT: sd a6, 48(s0)
2718+
; RV64I-WITH-FP-NEXT: sd a5, 40(s0)
2719+
; RV64I-WITH-FP-NEXT: sd a4, 32(s0)
2720+
; RV64I-WITH-FP-NEXT: sd a3, 24(s0)
2721+
; RV64I-WITH-FP-NEXT: sd a2, 16(s0)
2722+
; RV64I-WITH-FP-NEXT: sd a1, 8(s0)
2723+
; RV64I-WITH-FP-NEXT: sd a0, 0(s0)
2724+
; RV64I-WITH-FP-NEXT: call callee@plt
2725+
; RV64I-WITH-FP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2726+
; RV64I-WITH-FP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
2727+
; RV64I-WITH-FP-NEXT: addi sp, sp, 80
2728+
; RV64I-WITH-FP-NEXT: ret
2729+
;
2730+
; RV64IZCMP-LABEL: varargs:
2731+
; RV64IZCMP: # %bb.0:
2732+
; RV64IZCMP-NEXT: addi sp, sp, -80
2733+
; RV64IZCMP-NEXT: .cfi_def_cfa_offset 80
2734+
; RV64IZCMP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2735+
; RV64IZCMP-NEXT: .cfi_offset ra, -72
2736+
; RV64IZCMP-NEXT: sd a7, 72(sp)
2737+
; RV64IZCMP-NEXT: sd a6, 64(sp)
2738+
; RV64IZCMP-NEXT: sd a5, 56(sp)
2739+
; RV64IZCMP-NEXT: sd a4, 48(sp)
2740+
; RV64IZCMP-NEXT: sd a3, 40(sp)
2741+
; RV64IZCMP-NEXT: sd a2, 32(sp)
2742+
; RV64IZCMP-NEXT: sd a1, 24(sp)
2743+
; RV64IZCMP-NEXT: sd a0, 16(sp)
2744+
; RV64IZCMP-NEXT: call callee@plt
2745+
; RV64IZCMP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2746+
; RV64IZCMP-NEXT: addi sp, sp, 80
2747+
; RV64IZCMP-NEXT: ret
2748+
;
2749+
; RV64IZCMP-WITH-FP-LABEL: varargs:
2750+
; RV64IZCMP-WITH-FP: # %bb.0:
2751+
; RV64IZCMP-WITH-FP-NEXT: addi sp, sp, -80
2752+
; RV64IZCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 80
2753+
; RV64IZCMP-WITH-FP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2754+
; RV64IZCMP-WITH-FP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
2755+
; RV64IZCMP-WITH-FP-NEXT: .cfi_offset ra, -72
2756+
; RV64IZCMP-WITH-FP-NEXT: .cfi_offset s0, -80
2757+
; RV64IZCMP-WITH-FP-NEXT: addi s0, sp, 16
2758+
; RV64IZCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 64
2759+
; RV64IZCMP-WITH-FP-NEXT: sd a7, 56(s0)
2760+
; RV64IZCMP-WITH-FP-NEXT: sd a6, 48(s0)
2761+
; RV64IZCMP-WITH-FP-NEXT: sd a5, 40(s0)
2762+
; RV64IZCMP-WITH-FP-NEXT: sd a4, 32(s0)
2763+
; RV64IZCMP-WITH-FP-NEXT: sd a3, 24(s0)
2764+
; RV64IZCMP-WITH-FP-NEXT: sd a2, 16(s0)
2765+
; RV64IZCMP-WITH-FP-NEXT: sd a1, 8(s0)
2766+
; RV64IZCMP-WITH-FP-NEXT: sd a0, 0(s0)
2767+
; RV64IZCMP-WITH-FP-NEXT: call callee@plt
2768+
; RV64IZCMP-WITH-FP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2769+
; RV64IZCMP-WITH-FP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
2770+
; RV64IZCMP-WITH-FP-NEXT: addi sp, sp, 80
2771+
; RV64IZCMP-WITH-FP-NEXT: ret
2772+
call void @callee()
2773+
ret void
2774+
}

0 commit comments

Comments
 (0)