Skip to content

Commit ee4582f

Browse files
authored
[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.
1 parent a3ea018 commit ee4582f

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

llvm/lib/Target/RISCV/RISCVCallingConv.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,12 @@ bool llvm::CC_RISCV(unsigned ValNo, MVT ValVT, MVT LocVT,
448448
if (Reg) {
449449
// Fixed-length vectors are located in the corresponding scalable-vector
450450
// container types.
451-
if (ValVT.isFixedLengthVector())
451+
if (ValVT.isFixedLengthVector()) {
452452
LocVT = TLI.getContainerForFixedLengthVector(LocVT);
453+
State.addLoc(
454+
CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
455+
return false;
456+
}
453457
} else {
454458
// For return values, the vector must be passed fully via registers or
455459
// via the stack.
@@ -583,8 +587,12 @@ bool llvm::CC_RISCV_FastCC(unsigned ValNo, MVT ValVT, MVT LocVT,
583587
if (MCRegister Reg = allocateRVVReg(ValVT, ValNo, State, TLI)) {
584588
// Fixed-length vectors are located in the corresponding scalable-vector
585589
// container types.
586-
if (LocVT.isFixedLengthVector())
590+
if (LocVT.isFixedLengthVector()) {
587591
LocVT = TLI.getContainerForFixedLengthVector(LocVT);
592+
State.addLoc(
593+
CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
594+
return false;
595+
}
588596
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
589597
return false;
590598
}

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19090,20 +19090,18 @@ static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
1909019090
if (VA.needsCustom()) {
1909119091
if (VA.getLocVT().isInteger() &&
1909219092
(VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16))
19093-
Val = DAG.getNode(RISCVISD::FMV_H_X, DL, VA.getValVT(), Val);
19094-
else if (VA.getLocVT() == MVT::i64 && VA.getValVT() == MVT::f32)
19095-
Val = DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, Val);
19096-
else
19097-
llvm_unreachable("Unexpected Custom handling.");
19098-
return Val;
19093+
return DAG.getNode(RISCVISD::FMV_H_X, DL, VA.getValVT(), Val);
19094+
if (VA.getLocVT() == MVT::i64 && VA.getValVT() == MVT::f32)
19095+
return DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, Val);
19096+
if (VA.getValVT().isFixedLengthVector() && VA.getLocVT().isScalableVector())
19097+
return convertFromScalableVector(VA.getValVT(), Val, DAG, Subtarget);
19098+
llvm_unreachable("Unexpected Custom handling.");
1909919099
}
1910019100

1910119101
switch (VA.getLocInfo()) {
1910219102
default:
1910319103
llvm_unreachable("Unexpected CCValAssign::LocInfo");
1910419104
case CCValAssign::Full:
19105-
if (VA.getValVT().isFixedLengthVector() && VA.getLocVT().isScalableVector())
19106-
Val = convertFromScalableVector(VA.getValVT(), Val, DAG, Subtarget);
1910719105
break;
1910819106
case CCValAssign::BCvt:
1910919107
Val = DAG.getNode(ISD::BITCAST, DL, VA.getValVT(), Val);
@@ -19155,20 +19153,18 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
1915519153
if (VA.needsCustom()) {
1915619154
if (LocVT.isInteger() &&
1915719155
(VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16))
19158-
Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, LocVT, Val);
19159-
else if (LocVT == MVT::i64 && VA.getValVT() == MVT::f32)
19160-
Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64, Val);
19161-
else
19162-
llvm_unreachable("Unexpected Custom handling.");
19163-
return Val;
19156+
return DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, LocVT, Val);
19157+
if (LocVT == MVT::i64 && VA.getValVT() == MVT::f32)
19158+
return DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64, Val);
19159+
if (VA.getValVT().isFixedLengthVector() && LocVT.isScalableVector())
19160+
return convertToScalableVector(LocVT, Val, DAG, Subtarget);
19161+
llvm_unreachable("Unexpected Custom handling.");
1916419162
}
1916519163

1916619164
switch (VA.getLocInfo()) {
1916719165
default:
1916819166
llvm_unreachable("Unexpected CCValAssign::LocInfo");
1916919167
case CCValAssign::Full:
19170-
if (VA.getValVT().isFixedLengthVector() && LocVT.isScalableVector())
19171-
Val = convertToScalableVector(LocVT, Val, DAG, Subtarget);
1917219168
break;
1917319169
case CCValAssign::BCvt:
1917419170
Val = DAG.getNode(ISD::BITCAST, DL, LocVT, Val);

0 commit comments

Comments
 (0)