Skip to content

Commit e66e8aa

Browse files
authored
[RISCV][GISel] Support select G_EXTRACT_SUBVECTOR (#169789)
1 parent 0fa066b commit e66e8aa

File tree

3 files changed

+427
-0
lines changed

3 files changed

+427
-0
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class RISCVInstructionSelector : public InstructionSelector {
9999
LLT *IndexVT = nullptr) const;
100100
bool selectIntrinsicWithSideEffects(MachineInstr &I,
101101
MachineIRBuilder &MIB) const;
102+
bool selectExtractSubvector(MachineInstr &MI, MachineIRBuilder &MIB) const;
102103

103104
ComplexRendererFns selectShiftMask(MachineOperand &Root,
104105
unsigned ShiftWidth) const;
@@ -967,6 +968,45 @@ bool RISCVInstructionSelector::selectIntrinsicWithSideEffects(
967968
}
968969
}
969970

971+
bool RISCVInstructionSelector::selectExtractSubvector(
972+
MachineInstr &MI, MachineIRBuilder &MIB) const {
973+
assert(MI.getOpcode() == TargetOpcode::G_EXTRACT_SUBVECTOR);
974+
975+
Register DstReg = MI.getOperand(0).getReg();
976+
Register SrcReg = MI.getOperand(1).getReg();
977+
978+
LLT DstTy = MRI->getType(DstReg);
979+
LLT SrcTy = MRI->getType(SrcReg);
980+
981+
unsigned Idx = static_cast<unsigned>(MI.getOperand(2).getImm());
982+
983+
MVT DstMVT = getMVTForLLT(DstTy);
984+
MVT SrcMVT = getMVTForLLT(SrcTy);
985+
986+
unsigned SubRegIdx;
987+
std::tie(SubRegIdx, Idx) =
988+
RISCVTargetLowering::decomposeSubvectorInsertExtractToSubRegs(
989+
SrcMVT, DstMVT, Idx, &TRI);
990+
991+
if (Idx != 0)
992+
return false;
993+
994+
unsigned DstRegClassID = RISCVTargetLowering::getRegClassIDForVecVT(DstMVT);
995+
const TargetRegisterClass *DstRC = TRI.getRegClass(DstRegClassID);
996+
if (!RBI.constrainGenericRegister(DstReg, *DstRC, *MRI))
997+
return false;
998+
999+
unsigned SrcRegClassID = RISCVTargetLowering::getRegClassIDForVecVT(SrcMVT);
1000+
const TargetRegisterClass *SrcRC = TRI.getRegClass(SrcRegClassID);
1001+
if (!RBI.constrainGenericRegister(SrcReg, *SrcRC, *MRI))
1002+
return false;
1003+
1004+
MIB.buildInstr(TargetOpcode::COPY, {DstReg}, {}).addReg(SrcReg, 0, SubRegIdx);
1005+
1006+
MI.eraseFromParent();
1007+
return true;
1008+
}
1009+
9701010
bool RISCVInstructionSelector::select(MachineInstr &MI) {
9711011
MachineIRBuilder MIB(MI);
9721012

@@ -1239,6 +1279,8 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
12391279
}
12401280
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
12411281
return selectIntrinsicWithSideEffects(MI, MIB);
1282+
case TargetOpcode::G_EXTRACT_SUBVECTOR:
1283+
return selectExtractSubvector(MI, MIB);
12421284
default:
12431285
return false;
12441286
}

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25580,6 +25580,8 @@ bool RISCVTargetLowering::fallBackToDAGISel(const Instruction &Inst) const {
2558025580

2558125581
return false;
2558225582
}
25583+
if (II->getIntrinsicID() == Intrinsic::vector_extract)
25584+
return false;
2558325585
}
2558425586

2558525587
if (Inst.getType()->isScalableTy())

0 commit comments

Comments
 (0)