Skip to content

Commit 5ee126d

Browse files
committed
legalize store
1 parent 4f39095 commit 5ee126d

File tree

2 files changed

+1010
-60
lines changed

2 files changed

+1010
-60
lines changed

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

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
2020
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
2121
#include "llvm/CodeGen/MachineConstantPool.h"
22+
#include "llvm/CodeGen/MachineMemOperand.h"
2223
#include "llvm/CodeGen/MachineRegisterInfo.h"
2324
#include "llvm/CodeGen/TargetOpcodes.h"
2425
#include "llvm/CodeGen/ValueTypes.h"
@@ -690,42 +691,46 @@ bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
690691

691692
Register DstReg = MI.getOperand(0).getReg();
692693
Register PtrReg = MI.getOperand(1).getReg();
693-
LLT LoadTy = MRI.getType(DstReg);
694-
assert(LoadTy.isVector() && "Expect vector load.");
694+
LLT DataTy = MRI.getType(DstReg);
695+
assert(DataTy.isVector() && "Expect vector load.");
695696
assert(STI.hasVInstructions() &&
696-
(LoadTy.getScalarSizeInBits() != 64 || STI.hasVInstructionsI64()) &&
697-
(LoadTy.getElementCount().getKnownMinValue() != 1 ||
697+
(DataTy.getScalarSizeInBits() != 64 || STI.hasVInstructionsI64()) &&
698+
(DataTy.getElementCount().getKnownMinValue() != 1 ||
698699
STI.getELen() == 64) &&
699700
"Load type must be legal integer or floating point vector.");
700701

701702
assert(MI.hasOneMemOperand() &&
702703
"Load instructions only have one MemOperand.");
703-
Align Alignment = (*MI.memoperands_begin())->getAlign();
704-
MachineMemOperand *LoadMMO = MF->getMachineMemOperand(
705-
MachinePointerInfo(), MachineMemOperand::MOLoad, LoadTy, Alignment);
704+
MachineMemOperand *MMO = *MI.memoperands_begin();
705+
Align Alignment = MMO->getAlign();
706706

707707
const auto *TLI = STI.getTargetLowering();
708-
EVT VT = EVT::getEVT(getTypeForLLT(LoadTy, Ctx));
708+
EVT VT = EVT::getEVT(getTypeForLLT(DataTy, Ctx));
709709

710-
if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *LoadMMO))
710+
if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *MMO))
711711
return true;
712712

713-
unsigned EltSizeBits = LoadTy.getScalarSizeInBits();
713+
unsigned EltSizeBits = DataTy.getScalarSizeInBits();
714714
assert((EltSizeBits == 16 || EltSizeBits == 32 || EltSizeBits == 64) &&
715715
"Unexpected unaligned RVV load type");
716716

717717
// Calculate the new vector type with i8 elements
718718
unsigned NumElements =
719-
LoadTy.getElementCount().getKnownMinValue() * (EltSizeBits / 8);
720-
LLT NewLoadTy = LLT::scalable_vector(NumElements, 8);
719+
DataTy.getElementCount().getKnownMinValue() * (EltSizeBits / 8);
720+
LLT NewDataTy = LLT::scalable_vector(NumElements, 8);
721721

722-
MachinePointerInfo PI = cast<GLoad>(MI).getMMO().getPointerInfo();
723-
MachineMemOperand *NewLoadMMO = MF->getMachineMemOperand(
724-
PI, MachineMemOperand::MOLoad, NewLoadTy, Alignment);
722+
MachinePointerInfo PI = MMO->getPointerInfo();
723+
MachineMemOperand *NewMMO =
724+
MF->getMachineMemOperand(PI, MMO->getFlags(), NewDataTy, Alignment);
725725

726-
auto NewLoad = MIB.buildLoad(NewLoadTy, PtrReg, *NewLoadMMO);
727-
728-
MIB.buildBitcast(DstReg, NewLoad);
726+
if (isa<GLoad>(MI)) {
727+
auto NewLoad = MIB.buildLoad(NewDataTy, PtrReg, *NewMMO);
728+
MIB.buildBitcast(DstReg, NewLoad);
729+
} else {
730+
assert(isa<GStore>(MI) && "Machine instructions must be Load/Store.");
731+
auto BitcastedData = MIB.buildBitcast(NewDataTy, DstReg);
732+
MIB.buildStore(BitcastedData, PtrReg, *NewMMO);
733+
}
729734

730735
MI.eraseFromParent();
731736

0 commit comments

Comments
 (0)