|
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"
|
@@ -688,42 +689,46 @@ bool RISCVLegalizerInfo::legalizeLoadStore(MachineInstr &MI,
|
688 | 689 |
|
689 | 690 | Register DstReg = MI.getOperand(0).getReg();
|
690 | 691 | 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."); |
693 | 694 | 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 || |
696 | 697 | STI.getELen() == 64) &&
|
697 | 698 | "Load type must be legal integer or floating point vector.");
|
698 | 699 |
|
699 | 700 | assert(MI.hasOneMemOperand() &&
|
700 | 701 | "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(); |
704 | 704 |
|
705 | 705 | const auto *TLI = STI.getTargetLowering();
|
706 |
| - EVT VT = EVT::getEVT(getTypeForLLT(LoadTy, Ctx)); |
| 706 | + EVT VT = EVT::getEVT(getTypeForLLT(DataTy, Ctx)); |
707 | 707 |
|
708 |
| - if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *LoadMMO)) |
| 708 | + if (TLI->allowsMemoryAccessForAlignment(Ctx, DL, VT, *MMO)) |
709 | 709 | return true;
|
710 | 710 |
|
711 |
| - unsigned EltSizeBits = LoadTy.getScalarSizeInBits(); |
| 711 | + unsigned EltSizeBits = DataTy.getScalarSizeInBits(); |
712 | 712 | assert((EltSizeBits == 16 || EltSizeBits == 32 || EltSizeBits == 64) &&
|
713 | 713 | "Unexpected unaligned RVV load type");
|
714 | 714 |
|
715 | 715 | // Calculate the new vector type with i8 elements
|
716 | 716 | 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); |
719 | 719 |
|
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); |
723 | 723 |
|
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 | + } |
727 | 732 |
|
728 | 733 | MI.eraseFromParent();
|
729 | 734 |
|
|
0 commit comments