Skip to content

Commit 88c7cfd

Browse files
[RISCV][GISEL] Regbank select for scalable vector G_ICMP
1 parent 41bef89 commit 88c7cfd

File tree

3 files changed

+690
-3
lines changed

3 files changed

+690
-3
lines changed

llvm/lib/CodeGen/RegisterBankInfo.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -484,9 +484,10 @@ void RegisterBankInfo::applyDefaultMapping(const OperandsMapper &OpdMapper) {
484484
// the storage. However, right now we don't necessarily bump all
485485
// the types to storage size. For instance, we can consider
486486
// s16 G_AND legal whereas the storage size is going to be 32.
487-
assert(OrigTy.getSizeInBits() <= NewTy.getSizeInBits() &&
488-
"Types with difference size cannot be handled by the default "
489-
"mapping");
487+
assert(
488+
TypeSize::isKnownLE(OrigTy.getSizeInBits(), NewTy.getSizeInBits()) &&
489+
"Types with difference size cannot be handled by the default "
490+
"mapping");
490491
LLVM_DEBUG(dbgs() << "\nChange type of new opd from " << NewTy << " to "
491492
<< OrigTy);
492493
MRI.setType(NewReg, OrigTy);

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,17 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
470470
OpdsMapping[1] = GPRValueMapping;
471471
break;
472472
}
473+
case TargetOpcode::G_ICMP: {
474+
if (MRI.getType(MI.getOperand(0).getReg()).isVector()) {
475+
LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
476+
LLT SrcTy = MRI.getType(MI.getOperand(2).getReg());
477+
OpdsMapping[0] =
478+
getVRBValueMapping(DstTy.getSizeInBits().getKnownMinValue());
479+
OpdsMapping[2] = OpdsMapping[3] =
480+
getVRBValueMapping(SrcTy.getSizeInBits().getKnownMinValue());
481+
}
482+
break;
483+
}
473484
case TargetOpcode::G_FCMP: {
474485
LLT Ty = MRI.getType(MI.getOperand(2).getReg());
475486

0 commit comments

Comments
 (0)