Skip to content

Commit faeb464

Browse files
committed
legalize store
1 parent a258ced commit faeb464

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"
@@ -688,42 +689,46 @@ bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
688689

689690
Register DstReg = MI.getOperand(0).getReg();
690691
Register PtrReg = MI.getOperand(1).getReg();
691-
LLT LoadTy = MRI.getType(DstReg);
692-
assert(LoadTy.isVector() && "Expect vector load.");
692+
LLT DataTy = MRI.getType(DstReg);
693+
assert(DataTy.isVector() && "Expect vector load.");
693694
assert(STI.hasVInstructions() &&
694-
(LoadTy.getScalarSizeInBits() != 64 || STI.hasVInstructionsI64()) &&
695-
(LoadTy.getElementCount().getKnownMinValue() != 1 ||
695+
(DataTy.getScalarSizeInBits() != 64 || STI.hasVInstructionsI64()) &&
696+
(DataTy.getElementCount().getKnownMinValue() != 1 ||
696697
STI.getELen() == 64) &&
697698
"Load type must be legal integer or floating point vector.");
698699

699700
assert(MI.hasOneMemOperand() &&
700701
"Load instructions only have one MemOperand.");
701-
Align Alignment = (*MI.memoperands_begin())->getAlign();
702-
MachineMemOperand *LoadMMO = MF->getMachineMemOperand(
703-
MachinePointerInfo(), MachineMemOperand::MOLoad, LoadTy, Alignment);
702+
MachineMemOperand *MMO = *MI.memoperands_begin();
703+
Align Alignment = MMO->getAlign();
704704

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

708-
if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *LoadMMO))
708+
if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *MMO))
709709
return true;
710710

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

715715
// Calculate the new vector type with i8 elements
716716
unsigned NumElements =
717-
LoadTy.getElementCount().getKnownMinValue() * (EltSizeBits / 8);
718-
LLT NewLoadTy = LLT::scalable_vector(NumElements, 8);
717+
DataTy.getElementCount().getKnownMinValue() * (EltSizeBits / 8);
718+
LLT NewDataTy = LLT::scalable_vector(NumElements, 8);
719719

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

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

728733
MI.eraseFromParent();
729734

0 commit comments

Comments
 (0)