Skip to content

Commit 82209ea

Browse files
author
Yeting Kuo
committed
[RISCV] Disable zcmp push/pop for variadic functions.
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 6c6a2d3 commit 82209ea

File tree

2 files changed

+183
-3
lines changed

2 files changed

+183
-3
lines changed

llvm/lib/Target/RISCV/RISCVMachineFunctionInfo.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,13 @@ class RISCVMachineFunctionInfo : public MachineFunctionInfo {
128128
void setCalleeSavedStackSize(unsigned Size) { CalleeSavedStackSize = Size; }
129129

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

136140
int getRVPushRlist() const { return RVPushRlist; }

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

+176
Original file line numberDiff line numberDiff line change
@@ -2127,3 +2127,179 @@ entry:
21272127
tail call void asm sideeffect "li s4, 0", "~{s4}"()
21282128
ret void
21292129
}
2130+
2131+
define void @varargs(...) {
2132+
; RV32I-LABEL: varargs:
2133+
; RV32I: # %bb.0:
2134+
; RV32I-NEXT: addi sp, sp, -48
2135+
; RV32I-NEXT: .cfi_def_cfa_offset 48
2136+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2137+
; RV32I-NEXT: .cfi_offset ra, -36
2138+
; RV32I-NEXT: sw a7, 44(sp)
2139+
; RV32I-NEXT: sw a6, 40(sp)
2140+
; RV32I-NEXT: sw a5, 36(sp)
2141+
; RV32I-NEXT: sw a4, 32(sp)
2142+
; RV32I-NEXT: sw a3, 28(sp)
2143+
; RV32I-NEXT: sw a2, 24(sp)
2144+
; RV32I-NEXT: sw a1, 20(sp)
2145+
; RV32I-NEXT: sw a0, 16(sp)
2146+
; RV32I-NEXT: call callee@plt
2147+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2148+
; RV32I-NEXT: addi sp, sp, 48
2149+
; RV32I-NEXT: ret
2150+
;
2151+
; RV32I-WITH-FP-LABEL: varargs:
2152+
; RV32I-WITH-FP: # %bb.0:
2153+
; RV32I-WITH-FP-NEXT: addi sp, sp, -48
2154+
; RV32I-WITH-FP-NEXT: .cfi_def_cfa_offset 48
2155+
; RV32I-WITH-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2156+
; RV32I-WITH-FP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2157+
; RV32I-WITH-FP-NEXT: .cfi_offset ra, -36
2158+
; RV32I-WITH-FP-NEXT: .cfi_offset s0, -40
2159+
; RV32I-WITH-FP-NEXT: addi s0, sp, 16
2160+
; RV32I-WITH-FP-NEXT: .cfi_def_cfa s0, 32
2161+
; RV32I-WITH-FP-NEXT: sw a7, 28(s0)
2162+
; RV32I-WITH-FP-NEXT: sw a6, 24(s0)
2163+
; RV32I-WITH-FP-NEXT: sw a5, 20(s0)
2164+
; RV32I-WITH-FP-NEXT: sw a4, 16(s0)
2165+
; RV32I-WITH-FP-NEXT: sw a3, 12(s0)
2166+
; RV32I-WITH-FP-NEXT: sw a2, 8(s0)
2167+
; RV32I-WITH-FP-NEXT: sw a1, 4(s0)
2168+
; RV32I-WITH-FP-NEXT: sw a0, 0(s0)
2169+
; RV32I-WITH-FP-NEXT: call callee@plt
2170+
; RV32I-WITH-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2171+
; RV32I-WITH-FP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2172+
; RV32I-WITH-FP-NEXT: addi sp, sp, 48
2173+
; RV32I-WITH-FP-NEXT: ret
2174+
;
2175+
; RV32IZCMP-LABEL: varargs:
2176+
; RV32IZCMP: # %bb.0:
2177+
; RV32IZCMP-NEXT: addi sp, sp, -48
2178+
; RV32IZCMP-NEXT: .cfi_def_cfa_offset 48
2179+
; RV32IZCMP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2180+
; RV32IZCMP-NEXT: .cfi_offset ra, -36
2181+
; RV32IZCMP-NEXT: sw a7, 44(sp)
2182+
; RV32IZCMP-NEXT: sw a6, 40(sp)
2183+
; RV32IZCMP-NEXT: sw a5, 36(sp)
2184+
; RV32IZCMP-NEXT: sw a4, 32(sp)
2185+
; RV32IZCMP-NEXT: sw a3, 28(sp)
2186+
; RV32IZCMP-NEXT: sw a2, 24(sp)
2187+
; RV32IZCMP-NEXT: sw a1, 20(sp)
2188+
; RV32IZCMP-NEXT: sw a0, 16(sp)
2189+
; RV32IZCMP-NEXT: call callee@plt
2190+
; RV32IZCMP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2191+
; RV32IZCMP-NEXT: addi sp, sp, 48
2192+
; RV32IZCMP-NEXT: ret
2193+
;
2194+
; RV32IZCMP-WITH-FP-LABEL: varargs:
2195+
; RV32IZCMP-WITH-FP: # %bb.0:
2196+
; RV32IZCMP-WITH-FP-NEXT: addi sp, sp, -48
2197+
; RV32IZCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 48
2198+
; RV32IZCMP-WITH-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2199+
; RV32IZCMP-WITH-FP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2200+
; RV32IZCMP-WITH-FP-NEXT: .cfi_offset ra, -36
2201+
; RV32IZCMP-WITH-FP-NEXT: .cfi_offset s0, -40
2202+
; RV32IZCMP-WITH-FP-NEXT: addi s0, sp, 16
2203+
; RV32IZCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 32
2204+
; RV32IZCMP-WITH-FP-NEXT: sw a7, 28(s0)
2205+
; RV32IZCMP-WITH-FP-NEXT: sw a6, 24(s0)
2206+
; RV32IZCMP-WITH-FP-NEXT: sw a5, 20(s0)
2207+
; RV32IZCMP-WITH-FP-NEXT: sw a4, 16(s0)
2208+
; RV32IZCMP-WITH-FP-NEXT: sw a3, 12(s0)
2209+
; RV32IZCMP-WITH-FP-NEXT: sw a2, 8(s0)
2210+
; RV32IZCMP-WITH-FP-NEXT: sw a1, 4(s0)
2211+
; RV32IZCMP-WITH-FP-NEXT: sw a0, 0(s0)
2212+
; RV32IZCMP-WITH-FP-NEXT: call callee@plt
2213+
; RV32IZCMP-WITH-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2214+
; RV32IZCMP-WITH-FP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2215+
; RV32IZCMP-WITH-FP-NEXT: addi sp, sp, 48
2216+
; RV32IZCMP-WITH-FP-NEXT: ret
2217+
;
2218+
; RV64I-LABEL: varargs:
2219+
; RV64I: # %bb.0:
2220+
; RV64I-NEXT: addi sp, sp, -80
2221+
; RV64I-NEXT: .cfi_def_cfa_offset 80
2222+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2223+
; RV64I-NEXT: .cfi_offset ra, -72
2224+
; RV64I-NEXT: sd a7, 72(sp)
2225+
; RV64I-NEXT: sd a6, 64(sp)
2226+
; RV64I-NEXT: sd a5, 56(sp)
2227+
; RV64I-NEXT: sd a4, 48(sp)
2228+
; RV64I-NEXT: sd a3, 40(sp)
2229+
; RV64I-NEXT: sd a2, 32(sp)
2230+
; RV64I-NEXT: sd a1, 24(sp)
2231+
; RV64I-NEXT: sd a0, 16(sp)
2232+
; RV64I-NEXT: call callee@plt
2233+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2234+
; RV64I-NEXT: addi sp, sp, 80
2235+
; RV64I-NEXT: ret
2236+
;
2237+
; RV64I-WITH-FP-LABEL: varargs:
2238+
; RV64I-WITH-FP: # %bb.0:
2239+
; RV64I-WITH-FP-NEXT: addi sp, sp, -80
2240+
; RV64I-WITH-FP-NEXT: .cfi_def_cfa_offset 80
2241+
; RV64I-WITH-FP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2242+
; RV64I-WITH-FP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
2243+
; RV64I-WITH-FP-NEXT: .cfi_offset ra, -72
2244+
; RV64I-WITH-FP-NEXT: .cfi_offset s0, -80
2245+
; RV64I-WITH-FP-NEXT: addi s0, sp, 16
2246+
; RV64I-WITH-FP-NEXT: .cfi_def_cfa s0, 64
2247+
; RV64I-WITH-FP-NEXT: sd a7, 56(s0)
2248+
; RV64I-WITH-FP-NEXT: sd a6, 48(s0)
2249+
; RV64I-WITH-FP-NEXT: sd a5, 40(s0)
2250+
; RV64I-WITH-FP-NEXT: sd a4, 32(s0)
2251+
; RV64I-WITH-FP-NEXT: sd a3, 24(s0)
2252+
; RV64I-WITH-FP-NEXT: sd a2, 16(s0)
2253+
; RV64I-WITH-FP-NEXT: sd a1, 8(s0)
2254+
; RV64I-WITH-FP-NEXT: sd a0, 0(s0)
2255+
; RV64I-WITH-FP-NEXT: call callee@plt
2256+
; RV64I-WITH-FP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2257+
; RV64I-WITH-FP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
2258+
; RV64I-WITH-FP-NEXT: addi sp, sp, 80
2259+
; RV64I-WITH-FP-NEXT: ret
2260+
;
2261+
; RV64IZCMP-LABEL: varargs:
2262+
; RV64IZCMP: # %bb.0:
2263+
; RV64IZCMP-NEXT: addi sp, sp, -80
2264+
; RV64IZCMP-NEXT: .cfi_def_cfa_offset 80
2265+
; RV64IZCMP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2266+
; RV64IZCMP-NEXT: .cfi_offset ra, -72
2267+
; RV64IZCMP-NEXT: sd a7, 72(sp)
2268+
; RV64IZCMP-NEXT: sd a6, 64(sp)
2269+
; RV64IZCMP-NEXT: sd a5, 56(sp)
2270+
; RV64IZCMP-NEXT: sd a4, 48(sp)
2271+
; RV64IZCMP-NEXT: sd a3, 40(sp)
2272+
; RV64IZCMP-NEXT: sd a2, 32(sp)
2273+
; RV64IZCMP-NEXT: sd a1, 24(sp)
2274+
; RV64IZCMP-NEXT: sd a0, 16(sp)
2275+
; RV64IZCMP-NEXT: call callee@plt
2276+
; RV64IZCMP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2277+
; RV64IZCMP-NEXT: addi sp, sp, 80
2278+
; RV64IZCMP-NEXT: ret
2279+
;
2280+
; RV64IZCMP-WITH-FP-LABEL: varargs:
2281+
; RV64IZCMP-WITH-FP: # %bb.0:
2282+
; RV64IZCMP-WITH-FP-NEXT: addi sp, sp, -80
2283+
; RV64IZCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 80
2284+
; RV64IZCMP-WITH-FP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2285+
; RV64IZCMP-WITH-FP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
2286+
; RV64IZCMP-WITH-FP-NEXT: .cfi_offset ra, -72
2287+
; RV64IZCMP-WITH-FP-NEXT: .cfi_offset s0, -80
2288+
; RV64IZCMP-WITH-FP-NEXT: addi s0, sp, 16
2289+
; RV64IZCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 64
2290+
; RV64IZCMP-WITH-FP-NEXT: sd a7, 56(s0)
2291+
; RV64IZCMP-WITH-FP-NEXT: sd a6, 48(s0)
2292+
; RV64IZCMP-WITH-FP-NEXT: sd a5, 40(s0)
2293+
; RV64IZCMP-WITH-FP-NEXT: sd a4, 32(s0)
2294+
; RV64IZCMP-WITH-FP-NEXT: sd a3, 24(s0)
2295+
; RV64IZCMP-WITH-FP-NEXT: sd a2, 16(s0)
2296+
; RV64IZCMP-WITH-FP-NEXT: sd a1, 8(s0)
2297+
; RV64IZCMP-WITH-FP-NEXT: sd a0, 0(s0)
2298+
; RV64IZCMP-WITH-FP-NEXT: call callee@plt
2299+
; RV64IZCMP-WITH-FP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2300+
; RV64IZCMP-WITH-FP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
2301+
; RV64IZCMP-WITH-FP-NEXT: addi sp, sp, 80
2302+
; RV64IZCMP-WITH-FP-NEXT: ret
2303+
call void @callee()
2304+
ret void
2305+
}

0 commit comments

Comments
 (0)