Skip to content

Commit 2444dea

Browse files
author
Yeting Kuo
committed
[RISCV] Don't use t2(x7) as input argument for fastcc when Zicfilp enabled.
Zicfilp needs x7 as the landing pad label register. https://github.com/riscv/riscv-cfi/blob/main/src/cfi_forward.adoc
1 parent 7c265e9 commit 2444dea

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18402,7 +18402,8 @@ ArrayRef<MCPhysReg> RISCV::getArgGPRs(const RISCVABI::ABI ABI) {
1840218402
return ArrayRef(ArgIGPRs);
1840318403
}
1840418404

18405-
static ArrayRef<MCPhysReg> getFastCCArgGPRs(const RISCVABI::ABI ABI) {
18405+
static ArrayRef<MCPhysReg> getFastCCArgGPRs(const RISCVABI::ABI ABI,
18406+
bool HasZicfilp) {
1840618407
// The GPRs used for passing arguments in the FastCC, X5 and X6 might be used
1840718408
// for save-restore libcall, so we don't use them.
1840818409
static const MCPhysReg FastCCIGPRs[] = {
@@ -18415,10 +18416,18 @@ static ArrayRef<MCPhysReg> getFastCCArgGPRs(const RISCVABI::ABI ABI) {
1841518416
RISCV::X13, RISCV::X14, RISCV::X15,
1841618417
RISCV::X7};
1841718418

18419+
// Zicfilp needs needs x7(t2) as the landing pad label register.
18420+
static const MCPhysReg FastCCIGPRsNonX7[] = {
18421+
RISCV::X10, RISCV::X11, RISCV::X12, RISCV::X13, RISCV::X14, RISCV::X15,
18422+
RISCV::X16, RISCV::X17, RISCV::X28, RISCV::X29, RISCV::X30, RISCV::X31};
18423+
18424+
static const MCPhysReg FastCCEGPRsNonX7[] = {
18425+
RISCV::X10, RISCV::X11, RISCV::X12, RISCV::X13, RISCV::X14, RISCV::X15};
18426+
1841818427
if (ABI == RISCVABI::ABI_ILP32E || ABI == RISCVABI::ABI_LP64E)
18419-
return ArrayRef(FastCCEGPRs);
18428+
return HasZicfilp ? ArrayRef(FastCCEGPRsNonX7) : ArrayRef(FastCCEGPRs);
1842018429

18421-
return ArrayRef(FastCCIGPRs);
18430+
return HasZicfilp ? ArrayRef(FastCCIGPRsNonX7) : ArrayRef(FastCCIGPRs);
1842218431
}
1842318432

1842418433
// Pass a 2*XLEN argument that has been split into two XLEN values through
@@ -18962,15 +18971,16 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
1896218971
bool IsFixed, bool IsRet, Type *OrigTy,
1896318972
const RISCVTargetLowering &TLI,
1896418973
RVVArgDispatcher &RVVDispatcher) {
18974+
const RISCVSubtarget &Subtarget = TLI.getSubtarget();
18975+
bool HasZicfilp = Subtarget.hasStdExtZicfilp();
18976+
1896518977
if (LocVT == MVT::i32 || LocVT == MVT::i64) {
18966-
if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
18978+
if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI, HasZicfilp))) {
1896718979
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
1896818980
return false;
1896918981
}
1897018982
}
1897118983

18972-
const RISCVSubtarget &Subtarget = TLI.getSubtarget();
18973-
1897418984
if (LocVT == MVT::f16 &&
1897518985
(Subtarget.hasStdExtZfh() || Subtarget.hasStdExtZfhmin())) {
1897618986
static const MCPhysReg FPR16List[] = {
@@ -19014,7 +19024,7 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
1901419024
(LocVT == MVT::f32 && Subtarget.hasStdExtZfinx()) ||
1901519025
(LocVT == MVT::f64 && Subtarget.is64Bit() &&
1901619026
Subtarget.hasStdExtZdinx())) {
19017-
if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
19027+
if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI, HasZicfilp))) {
1901819028
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
1901919029
return false;
1902019030
}
@@ -19049,7 +19059,8 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
1904919059
CCValAssign::getReg(ValNo, ValVT, AllocatedVReg, LocVT, LocInfo));
1905019060
} else {
1905119061
// Try and pass the address via a "fast" GPR.
19052-
if (unsigned GPRReg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
19062+
if (unsigned GPRReg =
19063+
State.AllocateReg(getFastCCArgGPRs(ABI, HasZicfilp))) {
1905319064
LocInfo = CCValAssign::Indirect;
1905419065
LocVT = TLI.getSubtarget().getXLenVT();
1905519066
State.addLoc(CCValAssign::getReg(ValNo, ValVT, GPRReg, LocVT, LocInfo));

0 commit comments

Comments
 (0)