aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2024-09-13 07:23:44 -0700
committerGitHub <noreply@github.com>2024-09-13 07:23:44 -0700
commitee4582f9c8c395b1a9d901b522510af622206049 (patch)
treea636e20bd43e3bc679d2da9e7e2748d37f73b028
parenta3ea018d4900691e10ff6fd059cf07f33e949819 (diff)
downloadllvm-ee4582f9c8c395b1a9d901b522510af622206049.zip
llvm-ee4582f9c8c395b1a9d901b522510af622206049.tar.gz
llvm-ee4582f9c8c395b1a9d901b522510af622206049.tar.bz2
[RISCV] Use CCValAssign::getCustomReg for fixed vector arguments/returns with RVV. (#108470)
We need to insert a insert_subvector or extract_subvector which feels pretty custom. This should make it easier to support fixed vector arguments for GISel.
-rw-r--r--llvm/lib/Target/RISCV/RISCVCallingConv.cpp12
-rw-r--r--llvm/lib/Target/RISCV/RISCVISelLowering.cpp28
2 files changed, 22 insertions, 18 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVCallingConv.cpp b/llvm/lib/Target/RISCV/RISCVCallingConv.cpp
index fc276d1..b7ed9de 100644
--- a/llvm/lib/Target/RISCV/RISCVCallingConv.cpp
+++ b/llvm/lib/Target/RISCV/RISCVCallingConv.cpp
@@ -448,8 +448,12 @@ bool llvm::CC_RISCV(unsigned ValNo, MVT ValVT, MVT LocVT,
if (Reg) {
// Fixed-length vectors are located in the corresponding scalable-vector
// container types.
- if (ValVT.isFixedLengthVector())
+ if (ValVT.isFixedLengthVector()) {
LocVT = TLI.getContainerForFixedLengthVector(LocVT);
+ State.addLoc(
+ CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
+ return false;
+ }
} else {
// For return values, the vector must be passed fully via registers or
// via the stack.
@@ -583,8 +587,12 @@ bool llvm::CC_RISCV_FastCC(unsigned ValNo, MVT ValVT, MVT LocVT,
if (MCRegister Reg = allocateRVVReg(ValVT, ValNo, State, TLI)) {
// Fixed-length vectors are located in the corresponding scalable-vector
// container types.
- if (LocVT.isFixedLengthVector())
+ if (LocVT.isFixedLengthVector()) {
LocVT = TLI.getContainerForFixedLengthVector(LocVT);
+ State.addLoc(
+ CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
+ return false;
+ }
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
return false;
}
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 6f2dc71..ab49315 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -19090,20 +19090,18 @@ static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
if (VA.needsCustom()) {
if (VA.getLocVT().isInteger() &&
(VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16))
- Val = DAG.getNode(RISCVISD::FMV_H_X, DL, VA.getValVT(), Val);
- else if (VA.getLocVT() == MVT::i64 && VA.getValVT() == MVT::f32)
- Val = DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, Val);
- else
- llvm_unreachable("Unexpected Custom handling.");
- return Val;
+ return DAG.getNode(RISCVISD::FMV_H_X, DL, VA.getValVT(), Val);
+ if (VA.getLocVT() == MVT::i64 && VA.getValVT() == MVT::f32)
+ return DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, Val);
+ if (VA.getValVT().isFixedLengthVector() && VA.getLocVT().isScalableVector())
+ return convertFromScalableVector(VA.getValVT(), Val, DAG, Subtarget);
+ llvm_unreachable("Unexpected Custom handling.");
}
switch (VA.getLocInfo()) {
default:
llvm_unreachable("Unexpected CCValAssign::LocInfo");
case CCValAssign::Full:
- if (VA.getValVT().isFixedLengthVector() && VA.getLocVT().isScalableVector())
- Val = convertFromScalableVector(VA.getValVT(), Val, DAG, Subtarget);
break;
case CCValAssign::BCvt:
Val = DAG.getNode(ISD::BITCAST, DL, VA.getValVT(), Val);
@@ -19155,20 +19153,18 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
if (VA.needsCustom()) {
if (LocVT.isInteger() &&
(VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16))
- Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, LocVT, Val);
- else if (LocVT == MVT::i64 && VA.getValVT() == MVT::f32)
- Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64, Val);
- else
- llvm_unreachable("Unexpected Custom handling.");
- return Val;
+ return DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, LocVT, Val);
+ if (LocVT == MVT::i64 && VA.getValVT() == MVT::f32)
+ return DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64, Val);
+ if (VA.getValVT().isFixedLengthVector() && LocVT.isScalableVector())
+ return convertToScalableVector(LocVT, Val, DAG, Subtarget);
+ llvm_unreachable("Unexpected Custom handling.");
}
switch (VA.getLocInfo()) {
default:
llvm_unreachable("Unexpected CCValAssign::LocInfo");
case CCValAssign::Full:
- if (VA.getValVT().isFixedLengthVector() && LocVT.isScalableVector())
- Val = convertToScalableVector(LocVT, Val, DAG, Subtarget);
break;
case CCValAssign::BCvt:
Val = DAG.getNode(ISD::BITCAST, DL, LocVT, Val);