2222#include " MCTargetDesc/AArch64AddressingModes.h"
2323#include " MCTargetDesc/AArch64MCTargetDesc.h"
2424#include " llvm/ADT/Optional.h"
25- #include " llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
2625#include " llvm/CodeGen/GlobalISel/InstructionSelector.h"
2726#include " llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h"
2827#include " llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
@@ -2702,29 +2701,29 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27022701 case TargetOpcode::G_ZEXTLOAD:
27032702 case TargetOpcode::G_LOAD:
27042703 case TargetOpcode::G_STORE: {
2705- GLoadStore &LdSt = cast<GLoadStore>(I);
27062704 bool IsZExtLoad = I.getOpcode () == TargetOpcode::G_ZEXTLOAD;
2707- LLT PtrTy = MRI.getType (LdSt. getPointerReg ());
2705+ LLT PtrTy = MRI.getType (I. getOperand ( 1 ). getReg ());
27082706
27092707 if (PtrTy != LLT::pointer (0 , 64 )) {
27102708 LLVM_DEBUG (dbgs () << " Load/Store pointer has type: " << PtrTy
27112709 << " , expected: " << LLT::pointer (0 , 64 ) << ' \n ' );
27122710 return false ;
27132711 }
27142712
2715- uint64_t MemSizeInBytes = LdSt.getMemSize ();
2716- unsigned MemSizeInBits = LdSt.getMemSizeInBits ();
2717- AtomicOrdering Order = LdSt.getMMO ().getSuccessOrdering ();
2713+ auto &MemOp = **I.memoperands_begin ();
2714+ uint64_t MemSizeInBytes = MemOp.getSize ();
2715+ unsigned MemSizeInBits = MemSizeInBytes * 8 ;
2716+ AtomicOrdering Order = MemOp.getSuccessOrdering ();
27182717
27192718 // Need special instructions for atomics that affect ordering.
27202719 if (Order != AtomicOrdering::NotAtomic &&
27212720 Order != AtomicOrdering::Unordered &&
27222721 Order != AtomicOrdering::Monotonic) {
2723- assert (!isa<GZExtLoad>(LdSt) );
2722+ assert (I. getOpcode () != TargetOpcode::G_ZEXTLOAD );
27242723 if (MemSizeInBytes > 64 )
27252724 return false ;
27262725
2727- if (isa<GLoad>(LdSt) ) {
2726+ if (I. getOpcode () == TargetOpcode::G_LOAD ) {
27282727 static unsigned Opcodes[] = {AArch64::LDARB, AArch64::LDARH,
27292728 AArch64::LDARW, AArch64::LDARX};
27302729 I.setDesc (TII.get (Opcodes[Log2_32 (MemSizeInBytes)]));
@@ -2738,7 +2737,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27382737 }
27392738
27402739#ifndef NDEBUG
2741- const Register PtrReg = LdSt. getPointerReg ();
2740+ const Register PtrReg = I. getOperand ( 1 ). getReg ();
27422741 const RegisterBank &PtrRB = *RBI.getRegBank (PtrReg, MRI, TRI);
27432742 // Sanity-check the pointer register.
27442743 assert (PtrRB.getID () == AArch64::GPRRegBankID &&
@@ -2747,31 +2746,13 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27472746 " Load/Store pointer operand isn't a pointer" );
27482747#endif
27492748
2750- const Register ValReg = LdSt.getReg (0 );
2751- const LLT ValTy = MRI.getType (ValReg);
2749+ const Register ValReg = I.getOperand (0 ).getReg ();
27522750 const RegisterBank &RB = *RBI.getRegBank (ValReg, MRI, TRI);
27532751
2754- // The code below doesn't support truncating stores, so we need to split it
2755- // again.
2756- if (isa<GStore>(LdSt) && ValTy.getSizeInBits () > MemSizeInBits) {
2757- unsigned SubReg;
2758- LLT MemTy = LdSt.getMMO ().getMemoryType ();
2759- auto *RC = getRegClassForTypeOnBank (MemTy, RB, RBI);
2760- if (!getSubRegForClass (RC, TRI, SubReg))
2761- return false ;
2762-
2763- // Generate a subreg copy.
2764- auto Copy = MIB.buildInstr (TargetOpcode::COPY, {MemTy}, {})
2765- .addReg (ValReg, 0 , SubReg)
2766- .getReg (0 );
2767- RBI.constrainGenericRegister (Copy, *RC, MRI);
2768- LdSt.getOperand (0 ).setReg (Copy);
2769- }
2770-
27712752 // Helper lambda for partially selecting I. Either returns the original
27722753 // instruction with an updated opcode, or a new instruction.
27732754 auto SelectLoadStoreAddressingMode = [&]() -> MachineInstr * {
2774- bool IsStore = isa<GStore>(I) ;
2755+ bool IsStore = I. getOpcode () == TargetOpcode::G_STORE ;
27752756 const unsigned NewOpc =
27762757 selectLoadStoreUIOp (I.getOpcode (), RB.getID (), MemSizeInBits);
27772758 if (NewOpc == I.getOpcode ())
@@ -2788,8 +2769,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
27882769
27892770 // Folded something. Create a new instruction and return it.
27902771 auto NewInst = MIB.buildInstr (NewOpc, {}, {}, I.getFlags ());
2791- Register CurValReg = I.getOperand (0 ).getReg ();
2792- IsStore ? NewInst.addUse (CurValReg) : NewInst.addDef (CurValReg);
2772+ IsStore ? NewInst.addUse (ValReg) : NewInst.addDef (ValReg);
27932773 NewInst.cloneMemRefs (I);
27942774 for (auto &Fn : *AddrModeFns)
27952775 Fn (NewInst);
0 commit comments