Skip to content

Commit a258ced

Browse files
committed
legalize rvv load for all llt and update all corresponding tests
1 parent 58b7094 commit a258ced

File tree

4 files changed

+1078
-6
lines changed

4 files changed

+1078
-6
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 & 1 deletion
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();
@@ -677,6 +679,57 @@ bool RISCVLegalizerInfo::legalizeExt(MachineInstr &MI,
677679
return true;
678680
}
679681

682+
bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
683+
MachineIRBuilder &MIB) const {
684+
MachineRegisterInfo &MRI = *MIB.getMRI();
685+
MachineFunction *MF = MI.getParent()->getParent();
686+
const DataLayout &DL = MIB.getDataLayout();
687+
LLVMContext &Ctx = MF->getFunction().getContext();
688+
689+
Register DstReg = MI.getOperand(0).getReg();
690+
Register PtrReg = MI.getOperand(1).getReg();
691+
LLT LoadTy = MRI.getType(DstReg);
692+
assert(LoadTy.isVector() && "Expect vector load.");
693+
assert(STI.hasVInstructions() &&
694+
(LoadTy.getScalarSizeInBits() != 64 || STI.hasVInstructionsI64()) &&
695+
(LoadTy.getElementCount().getKnownMinValue() != 1 ||
696+
STI.getELen() == 64) &&
697+
"Load type must be legal integer or floating point vector.");
698+
699+
assert(MI.hasOneMemOperand() &&
700+
"Load instructions only have one MemOperand.");
701+
Align Alignment = (*MI.memoperands_begin())->getAlign();
702+
MachineMemOperand *LoadMMO = MF->getMachineMemOperand(
703+
MachinePointerInfo(), MachineMemOperand::MOLoad, LoadTy, Alignment);
704+
705+
const auto *TLI = STI.getTargetLowering();
706+
EVT VT = EVT::getEVT(getTypeForLLT(LoadTy, Ctx));
707+
708+
if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *LoadMMO))
709+
return true;
710+
711+
unsigned EltSizeBits = LoadTy.getScalarSizeInBits();
712+
assert((EltSizeBits == 16 || EltSizeBits == 32 || EltSizeBits == 64) &&
713+
"Unexpected unaligned RVV load type");
714+
715+
// Calculate the new vector type with i8 elements
716+
unsigned NumElements =
717+
LoadTy.getElementCount().getKnownMinValue() * (EltSizeBits / 8);
718+
LLT NewLoadTy = LLT::scalable_vector(NumElements, 8);
719+
720+
MachinePointerInfo PI = cast<GLoad>(MI).getMMO().getPointerInfo();
721+
MachineMemOperand *NewLoadMMO = MF->getMachineMemOperand(
722+
PI, MachineMemOperand::MOLoad, NewLoadTy, Alignment);
723+
724+
auto NewLoad = MIB.buildLoad(NewLoadTy, PtrReg, *NewLoadMMO);
725+
726+
MIB.buildBitcast(DstReg, NewLoad);
727+
728+
MI.eraseFromParent();
729+
730+
return true;
731+
}
732+
680733
/// Return the type of the mask type suitable for masking the provided
681734
/// vector type. This is simply an i1 element type vector of the same
682735
/// (possibly scalable) length.
@@ -854,6 +907,9 @@ bool RISCVLegalizerInfo::legalizeCustom(
854907
return legalizeExt(MI, MIRBuilder);
855908
case TargetOpcode::G_SPLAT_VECTOR:
856909
return legalizeSplatVector(MI, MIRBuilder);
910+
case TargetOpcode::G_LOAD:
911+
case TargetOpcode::G_STORE:
912+
return legalizeLoadStore(MI, MIRBuilder);
857913
}
858914

859915
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)