Skip to content

Commit cb0f1a7

Browse files
[RISCV][GISEL] Regbank select for scalable vector G_ICMP
1 parent 819feca commit cb0f1a7

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
@@ -488,6 +488,17 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
488488
OpdsMapping[1] = GPRValueMapping;
489489
break;
490490
}
491+
case TargetOpcode::G_ICMP: {
492+
if (MRI.getType(MI.getOperand(0).getReg()).isVector()) {
493+
LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
494+
LLT SrcTy = MRI.getType(MI.getOperand(2).getReg());
495+
OpdsMapping[0] =
496+
getVRBValueMapping(DstTy.getSizeInBits().getKnownMinValue());
497+
OpdsMapping[2] = OpdsMapping[3] =
498+
getVRBValueMapping(SrcTy.getSizeInBits().getKnownMinValue());
499+
}
500+
break;
501+
}
491502
case TargetOpcode::G_FCMP: {
492503
LLT Ty = MRI.getType(MI.getOperand(2).getReg());
493504

0 commit comments

Comments
 (0)