Skip to content

Commit eee1b24

Browse files
committed
legalize rvv load for all llt and update all corresponding tests
1 parent a53d111 commit eee1b24

File tree

4 files changed

+1082
-5
lines changed

4 files changed

+1082
-5
lines changed

llvm/lib/CodeGen/GlobalISel/LegalityPredicates.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ LegalityPredicate LegalityPredicates::memSizeNotByteSizePow2(unsigned MMOIdx) {
194194
return [=](const LegalityQuery &Query) {
195195
const LLT MemTy = Query.MMODescrs[MMOIdx].MemoryTy;
196196
return !MemTy.isByteSized() ||
197-
!llvm::has_single_bit<uint32_t>(MemTy.getSizeInBytes());
197+
!llvm::has_single_bit<uint32_t>(
198+
MemTy.getSizeInBytes().getKnownMinValue());
198199
};
199200
}
200201

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

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,10 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
303303
{nxv2s64, p0, nxv2s64, 64},
304304
{nxv4s64, p0, nxv4s64, 64},
305305
{nxv8s64, p0, nxv8s64, 64}});
306+
306307
LoadStoreActions.widenScalarToNextPow2(0, /* MinSize = */ 8)
307-
.lowerIfMemSizeNotByteSizePow2();
308+
.lowerIfMemSizeNotByteSizePow2()
309+
.custom();
308310

309311
LoadStoreActions.clampScalar(0, s32, sXLen).lower();
310312
ExtLoadActions.widenScalarToNextPow2(0).clampScalar(0, s32, sXLen).lower();
@@ -491,9 +493,14 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
491493
}
492494

493495
static Type *getTypeForLLT(LLT Ty, LLVMContext &C) {
494-
if (Ty.isVector())
496+
if (Ty.isFixedVector())
495497
return FixedVectorType::get(IntegerType::get(C, Ty.getScalarSizeInBits()),
496498
Ty.getNumElements());
499+
if (Ty.isScalableVector())
500+
return ScalableVectorType::get(
501+
IntegerType::get(C, Ty.getScalarSizeInBits()),
502+
Ty.getElementCount().getKnownMinValue());
503+
497504
return IntegerType::get(C, Ty.getSizeInBits());
498505
}
499506

@@ -676,6 +683,51 @@ bool RISCVLegalizerInfo::legalizeExt(MachineInstr &MI,
676683
return true;
677684
}
678685

686+
bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
687+
MachineIRBuilder &MIB) const {
688+
MachineRegisterInfo &MRI = *MIB.getMRI();
689+
MachineFunction *MF = MI.getParent()->getParent();
690+
const DataLayout &DL = MIB.getDataLayout();
691+
LLVMContext &Ctx = MF->getFunction().getContext();
692+
693+
Register DstReg = MI.getOperand(0).getReg();
694+
Register PtrReg = MI.getOperand(1).getReg();
695+
LLT LoadTy = MRI.getType(DstReg);
696+
697+
assert(MI.hasOneMemOperand() &&
698+
"Load instructions only have one MemOperand.");
699+
Align Alignment = (*MI.memoperands_begin())->getAlign();
700+
MachineMemOperand *LoadMMO = MF->getMachineMemOperand(
701+
MachinePointerInfo(), MachineMemOperand::MOLoad, LoadTy, Alignment);
702+
703+
const auto *TLI = STI.getTargetLowering();
704+
EVT VT = EVT::getEVT(getTypeForLLT(LoadTy, Ctx));
705+
706+
if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *LoadMMO))
707+
return true;
708+
709+
unsigned EltSizeBits = LoadTy.getScalarSizeInBits();
710+
assert((EltSizeBits == 16 || EltSizeBits == 32 || EltSizeBits == 64) &&
711+
"Unexpected unaligned RVV load type");
712+
713+
// Calculate the new vector type with i8 elements
714+
unsigned NumElements =
715+
LoadTy.getElementCount().getKnownMinValue() * (EltSizeBits / 8);
716+
LLT NewLoadTy = LLT::scalable_vector(NumElements, 8);
717+
718+
DstOp NewDstReg(NewLoadTy);
719+
MachineMemOperand *NewLoadMMO = MF->getMachineMemOperand(
720+
MachinePointerInfo(), MachineMemOperand::MOLoad, NewLoadTy, Alignment);
721+
722+
auto NewLoad = MIB.buildLoad(NewDstReg, PtrReg, *NewLoadMMO);
723+
724+
MIB.buildBitcast(DstReg, NewLoad.getReg(0));
725+
726+
MI.eraseFromParent();
727+
728+
return true;
729+
}
730+
679731
/// Return the type of the mask type suitable for masking the provided
680732
/// vector type. This is simply an i1 element type vector of the same
681733
/// (possibly scalable) length.
@@ -853,6 +905,9 @@ bool RISCVLegalizerInfo::legalizeCustom(
853905
return legalizeExt(MI, MIRBuilder);
854906
case TargetOpcode::G_SPLAT_VECTOR:
855907
return legalizeSplatVector(MI, MIRBuilder);
908+
case TargetOpcode::G_LOAD:
909+
case TargetOpcode::G_STORE:
910+
return legalizeLoadStore(MI, MIRBuilder);
856911
}
857912

858913
llvm_unreachable("expected switch to return");

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class RISCVLegalizerInfo : public LegalizerInfo {
4545
bool legalizeVScale(MachineInstr &MI, MachineIRBuilder &MIB) const;
4646
bool legalizeExt(MachineInstr &MI, MachineIRBuilder &MIRBuilder) const;
4747
bool legalizeSplatVector(MachineInstr &MI, MachineIRBuilder &MIB) const;
48+
bool legalizeLoadStore(MachineInstr &MI, MachineIRBuilder &MIB) const;
4849
};
4950
} // end namespace llvm
5051
#endif

0 commit comments

Comments
 (0)