|
19 | 19 | #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
|
20 | 20 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
|
21 | 21 | #include "llvm/CodeGen/MachineConstantPool.h"
|
| 22 | +#include "llvm/CodeGen/MachineMemOperand.h" |
22 | 23 | #include "llvm/CodeGen/MachineRegisterInfo.h"
|
23 | 24 | #include "llvm/CodeGen/TargetOpcodes.h"
|
24 | 25 | #include "llvm/CodeGen/ValueTypes.h"
|
@@ -690,42 +691,46 @@ bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
|
690 | 691 |
|
691 | 692 | Register DstReg = MI.getOperand(0).getReg();
|
692 | 693 | 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."); |
695 | 696 | 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 || |
698 | 699 | STI.getELen() == 64) &&
|
699 | 700 | "Load type must be legal integer or floating point vector.");
|
700 | 701 |
|
701 | 702 | assert(MI.hasOneMemOperand() &&
|
702 | 703 | "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(); |
706 | 706 |
|
707 | 707 | const auto *TLI = STI.getTargetLowering();
|
708 |
| - EVT VT = EVT::getEVT(getTypeForLLT(LoadTy, Ctx)); |
| 708 | + EVT VT = EVT::getEVT(getTypeForLLT(DataTy, Ctx)); |
709 | 709 |
|
710 |
| - if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *LoadMMO)) |
| 710 | + if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *MMO)) |
711 | 711 | return true;
|
712 | 712 |
|
713 |
| - unsigned EltSizeBits = LoadTy.getScalarSizeInBits(); |
| 713 | + unsigned EltSizeBits = DataTy.getScalarSizeInBits(); |
714 | 714 | assert((EltSizeBits == 16 || EltSizeBits == 32 || EltSizeBits == 64) &&
|
715 | 715 | "Unexpected unaligned RVV load type");
|
716 | 716 |
|
717 | 717 | // Calculate the new vector type with i8 elements
|
718 | 718 | 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); |
721 | 721 |
|
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); |
725 | 725 |
|
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 | + } |
729 | 734 |
|
730 | 735 | MI.eraseFromParent();
|
731 | 736 |
|
|
0 commit comments