22
22
#include " MCTargetDesc/AArch64AddressingModes.h"
23
23
#include " MCTargetDesc/AArch64MCTargetDesc.h"
24
24
#include " llvm/ADT/Optional.h"
25
- #include " llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
26
25
#include " llvm/CodeGen/GlobalISel/InstructionSelector.h"
27
26
#include " llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h"
28
27
#include " llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
@@ -2702,29 +2701,29 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
2702
2701
case TargetOpcode::G_ZEXTLOAD:
2703
2702
case TargetOpcode::G_LOAD:
2704
2703
case TargetOpcode::G_STORE: {
2705
- GLoadStore &LdSt = cast<GLoadStore>(I);
2706
2704
bool IsZExtLoad = I.getOpcode () == TargetOpcode::G_ZEXTLOAD;
2707
- LLT PtrTy = MRI.getType (LdSt. getPointerReg ());
2705
+ LLT PtrTy = MRI.getType (I. getOperand ( 1 ). getReg ());
2708
2706
2709
2707
if (PtrTy != LLT::pointer (0 , 64 )) {
2710
2708
LLVM_DEBUG (dbgs () << " Load/Store pointer has type: " << PtrTy
2711
2709
<< " , expected: " << LLT::pointer (0 , 64 ) << ' \n ' );
2712
2710
return false ;
2713
2711
}
2714
2712
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 ();
2718
2717
2719
2718
// Need special instructions for atomics that affect ordering.
2720
2719
if (Order != AtomicOrdering::NotAtomic &&
2721
2720
Order != AtomicOrdering::Unordered &&
2722
2721
Order != AtomicOrdering::Monotonic) {
2723
- assert (!isa<GZExtLoad>(LdSt) );
2722
+ assert (I. getOpcode () != TargetOpcode::G_ZEXTLOAD );
2724
2723
if (MemSizeInBytes > 64 )
2725
2724
return false ;
2726
2725
2727
- if (isa<GLoad>(LdSt) ) {
2726
+ if (I. getOpcode () == TargetOpcode::G_LOAD ) {
2728
2727
static unsigned Opcodes[] = {AArch64::LDARB, AArch64::LDARH,
2729
2728
AArch64::LDARW, AArch64::LDARX};
2730
2729
I.setDesc (TII.get (Opcodes[Log2_32 (MemSizeInBytes)]));
@@ -2738,7 +2737,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
2738
2737
}
2739
2738
2740
2739
#ifndef NDEBUG
2741
- const Register PtrReg = LdSt. getPointerReg ();
2740
+ const Register PtrReg = I. getOperand ( 1 ). getReg ();
2742
2741
const RegisterBank &PtrRB = *RBI.getRegBank (PtrReg, MRI, TRI);
2743
2742
// Sanity-check the pointer register.
2744
2743
assert (PtrRB.getID () == AArch64::GPRRegBankID &&
@@ -2747,31 +2746,13 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
2747
2746
" Load/Store pointer operand isn't a pointer" );
2748
2747
#endif
2749
2748
2750
- const Register ValReg = LdSt.getReg (0 );
2751
- const LLT ValTy = MRI.getType (ValReg);
2749
+ const Register ValReg = I.getOperand (0 ).getReg ();
2752
2750
const RegisterBank &RB = *RBI.getRegBank (ValReg, MRI, TRI);
2753
2751
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
-
2771
2752
// Helper lambda for partially selecting I. Either returns the original
2772
2753
// instruction with an updated opcode, or a new instruction.
2773
2754
auto SelectLoadStoreAddressingMode = [&]() -> MachineInstr * {
2774
- bool IsStore = isa<GStore>(I) ;
2755
+ bool IsStore = I. getOpcode () == TargetOpcode::G_STORE ;
2775
2756
const unsigned NewOpc =
2776
2757
selectLoadStoreUIOp (I.getOpcode (), RB.getID (), MemSizeInBits);
2777
2758
if (NewOpc == I.getOpcode ())
@@ -2788,8 +2769,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
2788
2769
2789
2770
// Folded something. Create a new instruction and return it.
2790
2771
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);
2793
2773
NewInst.cloneMemRefs (I);
2794
2774
for (auto &Fn : *AddrModeFns)
2795
2775
Fn (NewInst);
0 commit comments