[AArch64] Scale offsets by the size of the memory operation. NFC.
[oota-llvm.git] / lib / Target / AArch64 / AArch64LoadStoreOptimizer.cpp
1 //=- AArch64LoadStoreOptimizer.cpp - AArch64 load/store opt. pass -*- C++ -*-=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains a pass that performs load / store related peephole
11 // optimizations. This pass should be run after register allocation.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "AArch64InstrInfo.h"
16 #include "AArch64Subtarget.h"
17 #include "MCTargetDesc/AArch64AddressingModes.h"
18 #include "llvm/ADT/BitVector.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/CodeGen/MachineBasicBlock.h"
22 #include "llvm/CodeGen/MachineFunctionPass.h"
23 #include "llvm/CodeGen/MachineInstr.h"
24 #include "llvm/CodeGen/MachineInstrBuilder.h"
25 #include "llvm/Support/CommandLine.h"
26 #include "llvm/Support/Debug.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/raw_ostream.h"
29 #include "llvm/Target/TargetInstrInfo.h"
30 #include "llvm/Target/TargetMachine.h"
31 #include "llvm/Target/TargetRegisterInfo.h"
32 using namespace llvm;
33
34 #define DEBUG_TYPE "aarch64-ldst-opt"
35
36 /// AArch64AllocLoadStoreOpt - Post-register allocation pass to combine
37 /// load / store instructions to form ldp / stp instructions.
38
39 STATISTIC(NumPairCreated, "Number of load/store pair instructions generated");
40 STATISTIC(NumPostFolded, "Number of post-index updates folded");
41 STATISTIC(NumPreFolded, "Number of pre-index updates folded");
42 STATISTIC(NumUnscaledPairCreated,
43           "Number of load/store from unscaled generated");
44
45 static cl::opt<unsigned> ScanLimit("aarch64-load-store-scan-limit",
46                                    cl::init(20), cl::Hidden);
47
48 // Place holder while testing unscaled load/store combining
49 static cl::opt<bool> EnableAArch64UnscaledMemOp(
50     "aarch64-unscaled-mem-op", cl::Hidden,
51     cl::desc("Allow AArch64 unscaled load/store combining"), cl::init(true));
52
53 namespace llvm {
54 void initializeAArch64LoadStoreOptPass(PassRegistry &);
55 }
56
57 #define AARCH64_LOAD_STORE_OPT_NAME "AArch64 load / store optimization pass"
58
59 namespace {
60
61 typedef struct LdStPairFlags {
62   // If a matching instruction is found, MergeForward is set to true if the
63   // merge is to remove the first instruction and replace the second with
64   // a pair-wise insn, and false if the reverse is true.
65   bool MergeForward;
66
67   // SExtIdx gives the index of the result of the load pair that must be
68   // extended. The value of SExtIdx assumes that the paired load produces the
69   // value in this order: (I, returned iterator), i.e., -1 means no value has
70   // to be extended, 0 means I, and 1 means the returned iterator.
71   int SExtIdx;
72
73   LdStPairFlags() : MergeForward(false), SExtIdx(-1) {}
74
75   void setMergeForward(bool V = true) { MergeForward = V; }
76   bool getMergeForward() const { return MergeForward; }
77
78   void setSExtIdx(int V) { SExtIdx = V; }
79   int getSExtIdx() const { return SExtIdx; }
80
81 } LdStPairFlags;
82
83 struct AArch64LoadStoreOpt : public MachineFunctionPass {
84   static char ID;
85   AArch64LoadStoreOpt() : MachineFunctionPass(ID) {
86     initializeAArch64LoadStoreOptPass(*PassRegistry::getPassRegistry());
87   }
88
89   const AArch64InstrInfo *TII;
90   const TargetRegisterInfo *TRI;
91
92   // Scan the instructions looking for a load/store that can be combined
93   // with the current instruction into a load/store pair.
94   // Return the matching instruction if one is found, else MBB->end().
95   MachineBasicBlock::iterator findMatchingInsn(MachineBasicBlock::iterator I,
96                                                LdStPairFlags &Flags,
97                                                unsigned Limit);
98   // Merge the two instructions indicated into a single pair-wise instruction.
99   // If MergeForward is true, erase the first instruction and fold its
100   // operation into the second. If false, the reverse. Return the instruction
101   // following the first instruction (which may change during processing).
102   MachineBasicBlock::iterator
103   mergePairedInsns(MachineBasicBlock::iterator I,
104                    MachineBasicBlock::iterator Paired,
105                    const LdStPairFlags &Flags);
106
107   // Scan the instruction list to find a base register update that can
108   // be combined with the current instruction (a load or store) using
109   // pre or post indexed addressing with writeback. Scan forwards.
110   MachineBasicBlock::iterator
111   findMatchingUpdateInsnForward(MachineBasicBlock::iterator I, unsigned Limit,
112                                 int Value);
113
114   // Scan the instruction list to find a base register update that can
115   // be combined with the current instruction (a load or store) using
116   // pre or post indexed addressing with writeback. Scan backwards.
117   MachineBasicBlock::iterator
118   findMatchingUpdateInsnBackward(MachineBasicBlock::iterator I, unsigned Limit);
119
120   // Find an instruction that updates the base register of the ld/st
121   // instruction.
122   bool isMatchingUpdateInsn(MachineInstr *MemMI, MachineInstr *MI,
123                             unsigned BaseReg, int Offset);
124
125   // Merge a pre- or post-index base register update into a ld/st instruction.
126   MachineBasicBlock::iterator
127   mergeUpdateInsn(MachineBasicBlock::iterator I,
128                   MachineBasicBlock::iterator Update, bool IsPreIdx);
129
130   bool optimizeBlock(MachineBasicBlock &MBB);
131
132   bool runOnMachineFunction(MachineFunction &Fn) override;
133
134   const char *getPassName() const override {
135     return AARCH64_LOAD_STORE_OPT_NAME;
136   }
137 };
138 char AArch64LoadStoreOpt::ID = 0;
139 } // namespace
140
141 INITIALIZE_PASS(AArch64LoadStoreOpt, "aarch64-ldst-opt",
142                 AARCH64_LOAD_STORE_OPT_NAME, false, false)
143
144 static bool isUnscaledLdSt(unsigned Opc) {
145   switch (Opc) {
146   default:
147     return false;
148   case AArch64::STURSi:
149   case AArch64::STURDi:
150   case AArch64::STURQi:
151   case AArch64::STURWi:
152   case AArch64::STURXi:
153   case AArch64::LDURSi:
154   case AArch64::LDURDi:
155   case AArch64::LDURQi:
156   case AArch64::LDURWi:
157   case AArch64::LDURXi:
158   case AArch64::LDURSWi:
159     return true;
160   }
161 }
162
163 static bool isUnscaledLdSt(MachineInstr *MI) {
164   return isUnscaledLdSt(MI->getOpcode());
165 }
166
167 // Scaling factor for unscaled load or store.
168 static int getMemScale(MachineInstr *MI) {
169   switch (MI->getOpcode()) {
170   default:
171     llvm_unreachable("Opcode has unknown size!");
172   case AArch64::LDRSui:
173   case AArch64::LDURSi:
174   case AArch64::LDRSWui:
175   case AArch64::LDURSWi:
176   case AArch64::LDRWui:
177   case AArch64::LDURWi:
178   case AArch64::STRSui:
179   case AArch64::STURSi:
180   case AArch64::STRWui:
181   case AArch64::STURWi:
182   case AArch64::LDPSi:
183   case AArch64::LDPWi:
184   case AArch64::STPSi:
185   case AArch64::STPWi:
186     return 4;
187   case AArch64::LDRDui:
188   case AArch64::LDURDi:
189   case AArch64::LDRXui:
190   case AArch64::LDURXi:
191   case AArch64::STRDui:
192   case AArch64::STURDi:
193   case AArch64::STRXui:
194   case AArch64::STURXi:
195   case AArch64::LDPDi:
196   case AArch64::LDPXi:
197   case AArch64::STPDi:
198   case AArch64::STPXi:
199     return 8;
200   case AArch64::LDRQui:
201   case AArch64::LDURQi:
202   case AArch64::STRQui:
203   case AArch64::STURQi:
204   case AArch64::LDPQi:
205   case AArch64::STPQi:
206     return 16;
207   }
208 }
209
210 static unsigned getMatchingNonSExtOpcode(unsigned Opc,
211                                          bool *IsValidLdStrOpc = nullptr) {
212   if (IsValidLdStrOpc)
213     *IsValidLdStrOpc = true;
214   switch (Opc) {
215   default:
216     if (IsValidLdStrOpc)
217       *IsValidLdStrOpc = false;
218     return UINT_MAX;
219   case AArch64::STRDui:
220   case AArch64::STURDi:
221   case AArch64::STRQui:
222   case AArch64::STURQi:
223   case AArch64::STRWui:
224   case AArch64::STURWi:
225   case AArch64::STRXui:
226   case AArch64::STURXi:
227   case AArch64::LDRDui:
228   case AArch64::LDURDi:
229   case AArch64::LDRQui:
230   case AArch64::LDURQi:
231   case AArch64::LDRWui:
232   case AArch64::LDURWi:
233   case AArch64::LDRXui:
234   case AArch64::LDURXi:
235   case AArch64::STRSui:
236   case AArch64::STURSi:
237   case AArch64::LDRSui:
238   case AArch64::LDURSi:
239     return Opc;
240   case AArch64::LDRSWui:
241     return AArch64::LDRWui;
242   case AArch64::LDURSWi:
243     return AArch64::LDURWi;
244   }
245 }
246
247 static unsigned getMatchingPairOpcode(unsigned Opc) {
248   switch (Opc) {
249   default:
250     llvm_unreachable("Opcode has no pairwise equivalent!");
251   case AArch64::STRSui:
252   case AArch64::STURSi:
253     return AArch64::STPSi;
254   case AArch64::STRDui:
255   case AArch64::STURDi:
256     return AArch64::STPDi;
257   case AArch64::STRQui:
258   case AArch64::STURQi:
259     return AArch64::STPQi;
260   case AArch64::STRWui:
261   case AArch64::STURWi:
262     return AArch64::STPWi;
263   case AArch64::STRXui:
264   case AArch64::STURXi:
265     return AArch64::STPXi;
266   case AArch64::LDRSui:
267   case AArch64::LDURSi:
268     return AArch64::LDPSi;
269   case AArch64::LDRDui:
270   case AArch64::LDURDi:
271     return AArch64::LDPDi;
272   case AArch64::LDRQui:
273   case AArch64::LDURQi:
274     return AArch64::LDPQi;
275   case AArch64::LDRWui:
276   case AArch64::LDURWi:
277     return AArch64::LDPWi;
278   case AArch64::LDRXui:
279   case AArch64::LDURXi:
280     return AArch64::LDPXi;
281   case AArch64::LDRSWui:
282   case AArch64::LDURSWi:
283     return AArch64::LDPSWi;
284   }
285 }
286
287 static unsigned getPreIndexedOpcode(unsigned Opc) {
288   switch (Opc) {
289   default:
290     llvm_unreachable("Opcode has no pre-indexed equivalent!");
291   case AArch64::STRSui:
292     return AArch64::STRSpre;
293   case AArch64::STRDui:
294     return AArch64::STRDpre;
295   case AArch64::STRQui:
296     return AArch64::STRQpre;
297   case AArch64::STRWui:
298     return AArch64::STRWpre;
299   case AArch64::STRXui:
300     return AArch64::STRXpre;
301   case AArch64::LDRSui:
302     return AArch64::LDRSpre;
303   case AArch64::LDRDui:
304     return AArch64::LDRDpre;
305   case AArch64::LDRQui:
306     return AArch64::LDRQpre;
307   case AArch64::LDRWui:
308     return AArch64::LDRWpre;
309   case AArch64::LDRXui:
310     return AArch64::LDRXpre;
311   case AArch64::LDRSWui:
312     return AArch64::LDRSWpre;
313   case AArch64::LDPSi:
314     return AArch64::LDPSpre;
315   case AArch64::LDPDi:
316     return AArch64::LDPDpre;
317   case AArch64::LDPQi:
318     return AArch64::LDPQpre;
319   case AArch64::LDPWi:
320     return AArch64::LDPWpre;
321   case AArch64::LDPXi:
322     return AArch64::LDPXpre;
323   case AArch64::STPSi:
324     return AArch64::STPSpre;
325   case AArch64::STPDi:
326     return AArch64::STPDpre;
327   case AArch64::STPQi:
328     return AArch64::STPQpre;
329   case AArch64::STPWi:
330     return AArch64::STPWpre;
331   case AArch64::STPXi:
332     return AArch64::STPXpre;
333   }
334 }
335
336 static unsigned getPostIndexedOpcode(unsigned Opc) {
337   switch (Opc) {
338   default:
339     llvm_unreachable("Opcode has no post-indexed wise equivalent!");
340   case AArch64::STRSui:
341     return AArch64::STRSpost;
342   case AArch64::STRDui:
343     return AArch64::STRDpost;
344   case AArch64::STRQui:
345     return AArch64::STRQpost;
346   case AArch64::STRWui:
347     return AArch64::STRWpost;
348   case AArch64::STRXui:
349     return AArch64::STRXpost;
350   case AArch64::LDRSui:
351     return AArch64::LDRSpost;
352   case AArch64::LDRDui:
353     return AArch64::LDRDpost;
354   case AArch64::LDRQui:
355     return AArch64::LDRQpost;
356   case AArch64::LDRWui:
357     return AArch64::LDRWpost;
358   case AArch64::LDRXui:
359     return AArch64::LDRXpost;
360   case AArch64::LDRSWui:
361     return AArch64::LDRSWpost;
362   case AArch64::LDPSi:
363     return AArch64::LDPSpost;
364   case AArch64::LDPDi:
365     return AArch64::LDPDpost;
366   case AArch64::LDPQi:
367     return AArch64::LDPQpost;
368   case AArch64::LDPWi:
369     return AArch64::LDPWpost;
370   case AArch64::LDPXi:
371     return AArch64::LDPXpost;
372   case AArch64::STPSi:
373     return AArch64::STPSpost;
374   case AArch64::STPDi:
375     return AArch64::STPDpost;
376   case AArch64::STPQi:
377     return AArch64::STPQpost;
378   case AArch64::STPWi:
379     return AArch64::STPWpost;
380   case AArch64::STPXi:
381     return AArch64::STPXpost;
382   }
383 }
384
385 static bool isPairedLdSt(const MachineInstr *MI) {
386   switch (MI->getOpcode()) {
387   default:
388     return false;
389   case AArch64::LDPSi:
390   case AArch64::LDPDi:
391   case AArch64::LDPQi:
392   case AArch64::LDPWi:
393   case AArch64::LDPXi:
394   case AArch64::STPSi:
395   case AArch64::STPDi:
396   case AArch64::STPQi:
397   case AArch64::STPWi:
398   case AArch64::STPXi:
399     return true;
400   }
401 }
402
403 static const MachineOperand &getLdStRegOp(const MachineInstr *MI,
404                                           unsigned PairedRegOp = 0) {
405   assert(PairedRegOp < 2 && "Unexpected register operand idx.");
406   unsigned Idx = isPairedLdSt(MI) ? PairedRegOp : 0;
407   return MI->getOperand(Idx);
408 }
409
410 static const MachineOperand &getLdStBaseOp(const MachineInstr *MI) {
411   unsigned Idx = isPairedLdSt(MI) ? 2 : 1;
412   return MI->getOperand(Idx);
413 }
414
415 static const MachineOperand &getLdStOffsetOp(const MachineInstr *MI) {
416   unsigned Idx = isPairedLdSt(MI) ? 3 : 2;
417   return MI->getOperand(Idx);
418 }
419
420 MachineBasicBlock::iterator
421 AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
422                                       MachineBasicBlock::iterator Paired,
423                                       const LdStPairFlags &Flags) {
424   MachineBasicBlock::iterator NextI = I;
425   ++NextI;
426   // If NextI is the second of the two instructions to be merged, we need
427   // to skip one further. Either way we merge will invalidate the iterator,
428   // and we don't need to scan the new instruction, as it's a pairwise
429   // instruction, which we're not considering for further action anyway.
430   if (NextI == Paired)
431     ++NextI;
432
433   int SExtIdx = Flags.getSExtIdx();
434   unsigned Opc =
435       SExtIdx == -1 ? I->getOpcode() : getMatchingNonSExtOpcode(I->getOpcode());
436   bool IsUnscaled = isUnscaledLdSt(Opc);
437   int OffsetStride =
438       IsUnscaled && EnableAArch64UnscaledMemOp ? getMemScale(I) : 1;
439
440   bool MergeForward = Flags.getMergeForward();
441   unsigned NewOpc = getMatchingPairOpcode(Opc);
442   // Insert our new paired instruction after whichever of the paired
443   // instructions MergeForward indicates.
444   MachineBasicBlock::iterator InsertionPoint = MergeForward ? Paired : I;
445   // Also based on MergeForward is from where we copy the base register operand
446   // so we get the flags compatible with the input code.
447   const MachineOperand &BaseRegOp =
448       MergeForward ? getLdStBaseOp(Paired) : getLdStBaseOp(I);
449
450   // Which register is Rt and which is Rt2 depends on the offset order.
451   MachineInstr *RtMI, *Rt2MI;
452   if (getLdStOffsetOp(I).getImm() ==
453       getLdStOffsetOp(Paired).getImm() + OffsetStride) {
454     RtMI = Paired;
455     Rt2MI = I;
456     // Here we swapped the assumption made for SExtIdx.
457     // I.e., we turn ldp I, Paired into ldp Paired, I.
458     // Update the index accordingly.
459     if (SExtIdx != -1)
460       SExtIdx = (SExtIdx + 1) % 2;
461   } else {
462     RtMI = I;
463     Rt2MI = Paired;
464   }
465   // Handle Unscaled
466   int OffsetImm = getLdStOffsetOp(RtMI).getImm();
467   if (IsUnscaled && EnableAArch64UnscaledMemOp)
468     OffsetImm /= OffsetStride;
469
470   // Construct the new instruction.
471   MachineInstrBuilder MIB = BuildMI(*I->getParent(), InsertionPoint,
472                                     I->getDebugLoc(), TII->get(NewOpc))
473                                 .addOperand(getLdStRegOp(RtMI))
474                                 .addOperand(getLdStRegOp(Rt2MI))
475                                 .addOperand(BaseRegOp)
476                                 .addImm(OffsetImm);
477   (void)MIB;
478
479   // FIXME: Do we need/want to copy the mem operands from the source
480   //        instructions? Probably. What uses them after this?
481
482   DEBUG(dbgs() << "Creating pair load/store. Replacing instructions:\n    ");
483   DEBUG(I->print(dbgs()));
484   DEBUG(dbgs() << "    ");
485   DEBUG(Paired->print(dbgs()));
486   DEBUG(dbgs() << "  with instruction:\n    ");
487
488   if (SExtIdx != -1) {
489     // Generate the sign extension for the proper result of the ldp.
490     // I.e., with X1, that would be:
491     // %W1<def> = KILL %W1, %X1<imp-def>
492     // %X1<def> = SBFMXri %X1<kill>, 0, 31
493     MachineOperand &DstMO = MIB->getOperand(SExtIdx);
494     // Right now, DstMO has the extended register, since it comes from an
495     // extended opcode.
496     unsigned DstRegX = DstMO.getReg();
497     // Get the W variant of that register.
498     unsigned DstRegW = TRI->getSubReg(DstRegX, AArch64::sub_32);
499     // Update the result of LDP to use the W instead of the X variant.
500     DstMO.setReg(DstRegW);
501     DEBUG(((MachineInstr *)MIB)->print(dbgs()));
502     DEBUG(dbgs() << "\n");
503     // Make the machine verifier happy by providing a definition for
504     // the X register.
505     // Insert this definition right after the generated LDP, i.e., before
506     // InsertionPoint.
507     MachineInstrBuilder MIBKill =
508         BuildMI(*I->getParent(), InsertionPoint, I->getDebugLoc(),
509                 TII->get(TargetOpcode::KILL), DstRegW)
510             .addReg(DstRegW)
511             .addReg(DstRegX, RegState::Define);
512     MIBKill->getOperand(2).setImplicit();
513     // Create the sign extension.
514     MachineInstrBuilder MIBSXTW =
515         BuildMI(*I->getParent(), InsertionPoint, I->getDebugLoc(),
516                 TII->get(AArch64::SBFMXri), DstRegX)
517             .addReg(DstRegX)
518             .addImm(0)
519             .addImm(31);
520     (void)MIBSXTW;
521     DEBUG(dbgs() << "  Extend operand:\n    ");
522     DEBUG(((MachineInstr *)MIBSXTW)->print(dbgs()));
523     DEBUG(dbgs() << "\n");
524   } else {
525     DEBUG(((MachineInstr *)MIB)->print(dbgs()));
526     DEBUG(dbgs() << "\n");
527   }
528
529   // Erase the old instructions.
530   I->eraseFromParent();
531   Paired->eraseFromParent();
532
533   return NextI;
534 }
535
536 /// trackRegDefsUses - Remember what registers the specified instruction uses
537 /// and modifies.
538 static void trackRegDefsUses(const MachineInstr *MI, BitVector &ModifiedRegs,
539                              BitVector &UsedRegs,
540                              const TargetRegisterInfo *TRI) {
541   for (const MachineOperand &MO : MI->operands()) {
542     if (MO.isRegMask())
543       ModifiedRegs.setBitsNotInMask(MO.getRegMask());
544
545     if (!MO.isReg())
546       continue;
547     unsigned Reg = MO.getReg();
548     if (MO.isDef()) {
549       for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
550         ModifiedRegs.set(*AI);
551     } else {
552       assert(MO.isUse() && "Reg operand not a def and not a use?!?");
553       for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
554         UsedRegs.set(*AI);
555     }
556   }
557 }
558
559 static bool inBoundsForPair(bool IsUnscaled, int Offset, int OffsetStride) {
560   // Convert the byte-offset used by unscaled into an "element" offset used
561   // by the scaled pair load/store instructions.
562   if (IsUnscaled)
563     Offset /= OffsetStride;
564
565   return Offset <= 63 && Offset >= -64;
566 }
567
568 // Do alignment, specialized to power of 2 and for signed ints,
569 // avoiding having to do a C-style cast from uint_64t to int when
570 // using RoundUpToAlignment from include/llvm/Support/MathExtras.h.
571 // FIXME: Move this function to include/MathExtras.h?
572 static int alignTo(int Num, int PowOf2) {
573   return (Num + PowOf2 - 1) & ~(PowOf2 - 1);
574 }
575
576 static bool mayAlias(MachineInstr *MIa, MachineInstr *MIb,
577                      const AArch64InstrInfo *TII) {
578   // One of the instructions must modify memory.
579   if (!MIa->mayStore() && !MIb->mayStore())
580     return false;
581
582   // Both instructions must be memory operations.
583   if (!MIa->mayLoadOrStore() && !MIb->mayLoadOrStore())
584     return false;
585
586   return !TII->areMemAccessesTriviallyDisjoint(MIa, MIb);
587 }
588
589 static bool mayAlias(MachineInstr *MIa,
590                      SmallVectorImpl<MachineInstr *> &MemInsns,
591                      const AArch64InstrInfo *TII) {
592   for (auto &MIb : MemInsns)
593     if (mayAlias(MIa, MIb, TII))
594       return true;
595
596   return false;
597 }
598
599 /// findMatchingInsn - Scan the instructions looking for a load/store that can
600 /// be combined with the current instruction into a load/store pair.
601 MachineBasicBlock::iterator
602 AArch64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
603                                       LdStPairFlags &Flags,
604                                       unsigned Limit) {
605   MachineBasicBlock::iterator E = I->getParent()->end();
606   MachineBasicBlock::iterator MBBI = I;
607   MachineInstr *FirstMI = I;
608   ++MBBI;
609
610   unsigned Opc = FirstMI->getOpcode();
611   bool MayLoad = FirstMI->mayLoad();
612   bool IsUnscaled = isUnscaledLdSt(FirstMI);
613   unsigned Reg = getLdStRegOp(FirstMI).getReg();
614   unsigned BaseReg = getLdStBaseOp(FirstMI).getReg();
615   int Offset = getLdStOffsetOp(FirstMI).getImm();
616
617   // Early exit if the first instruction modifies the base register.
618   // e.g., ldr x0, [x0]
619   if (FirstMI->modifiesRegister(BaseReg, TRI))
620     return E;
621
622   // Early exit if the offset if not possible to match. (6 bits of positive
623   // range, plus allow an extra one in case we find a later insn that matches
624   // with Offset-1)
625   int OffsetStride =
626       IsUnscaled && EnableAArch64UnscaledMemOp ? getMemScale(FirstMI) : 1;
627   if (!inBoundsForPair(IsUnscaled, Offset, OffsetStride))
628     return E;
629
630   // Track which registers have been modified and used between the first insn
631   // (inclusive) and the second insn.
632   BitVector ModifiedRegs, UsedRegs;
633   ModifiedRegs.resize(TRI->getNumRegs());
634   UsedRegs.resize(TRI->getNumRegs());
635
636   // Remember any instructions that read/write memory between FirstMI and MI.
637   SmallVector<MachineInstr *, 4> MemInsns;
638
639   for (unsigned Count = 0; MBBI != E && Count < Limit; ++MBBI) {
640     MachineInstr *MI = MBBI;
641     // Skip DBG_VALUE instructions. Otherwise debug info can affect the
642     // optimization by changing how far we scan.
643     if (MI->isDebugValue())
644       continue;
645
646     // Now that we know this is a real instruction, count it.
647     ++Count;
648
649     bool CanMergeOpc = Opc == MI->getOpcode();
650     Flags.setSExtIdx(-1);
651     if (!CanMergeOpc) {
652       bool IsValidLdStrOpc;
653       unsigned NonSExtOpc = getMatchingNonSExtOpcode(Opc, &IsValidLdStrOpc);
654       assert(IsValidLdStrOpc &&
655              "Given Opc should be a Load or Store with an immediate");
656       // Opc will be the first instruction in the pair.
657       Flags.setSExtIdx(NonSExtOpc == (unsigned)Opc ? 1 : 0);
658       CanMergeOpc = NonSExtOpc == getMatchingNonSExtOpcode(MI->getOpcode());
659     }
660
661     if (CanMergeOpc && getLdStOffsetOp(MI).isImm()) {
662       assert(MI->mayLoadOrStore() && "Expected memory operation.");
663       // If we've found another instruction with the same opcode, check to see
664       // if the base and offset are compatible with our starting instruction.
665       // These instructions all have scaled immediate operands, so we just
666       // check for +1/-1. Make sure to check the new instruction offset is
667       // actually an immediate and not a symbolic reference destined for
668       // a relocation.
669       //
670       // Pairwise instructions have a 7-bit signed offset field. Single insns
671       // have a 12-bit unsigned offset field. To be a valid combine, the
672       // final offset must be in range.
673       unsigned MIBaseReg = getLdStBaseOp(MI).getReg();
674       int MIOffset = getLdStOffsetOp(MI).getImm();
675       if (BaseReg == MIBaseReg && ((Offset == MIOffset + OffsetStride) ||
676                                    (Offset + OffsetStride == MIOffset))) {
677         int MinOffset = Offset < MIOffset ? Offset : MIOffset;
678         // If this is a volatile load/store that otherwise matched, stop looking
679         // as something is going on that we don't have enough information to
680         // safely transform. Similarly, stop if we see a hint to avoid pairs.
681         if (MI->hasOrderedMemoryRef() || TII->isLdStPairSuppressed(MI))
682           return E;
683         // If the resultant immediate offset of merging these instructions
684         // is out of range for a pairwise instruction, bail and keep looking.
685         bool MIIsUnscaled = isUnscaledLdSt(MI);
686         if (!inBoundsForPair(MIIsUnscaled, MinOffset, OffsetStride)) {
687           trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
688           MemInsns.push_back(MI);
689           continue;
690         }
691         // If the alignment requirements of the paired (scaled) instruction
692         // can't express the offset of the unscaled input, bail and keep
693         // looking.
694         if (IsUnscaled && EnableAArch64UnscaledMemOp &&
695             (alignTo(MinOffset, OffsetStride) != MinOffset)) {
696           trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
697           MemInsns.push_back(MI);
698           continue;
699         }
700         // If the destination register of the loads is the same register, bail
701         // and keep looking. A load-pair instruction with both destination
702         // registers the same is UNPREDICTABLE and will result in an exception.
703         if (MayLoad && Reg == getLdStRegOp(MI).getReg()) {
704           trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
705           MemInsns.push_back(MI);
706           continue;
707         }
708
709         // If the Rt of the second instruction was not modified or used between
710         // the two instructions and none of the instructions between the second
711         // and first alias with the second, we can combine the second into the
712         // first.
713         if (!ModifiedRegs[getLdStRegOp(MI).getReg()] &&
714             !(MI->mayLoad() && UsedRegs[getLdStRegOp(MI).getReg()]) &&
715             !mayAlias(MI, MemInsns, TII)) {
716           Flags.setMergeForward(false);
717           return MBBI;
718         }
719
720         // Likewise, if the Rt of the first instruction is not modified or used
721         // between the two instructions and none of the instructions between the
722         // first and the second alias with the first, we can combine the first
723         // into the second.
724         if (!ModifiedRegs[getLdStRegOp(FirstMI).getReg()] &&
725             !(MayLoad && UsedRegs[getLdStRegOp(FirstMI).getReg()]) &&
726             !mayAlias(FirstMI, MemInsns, TII)) {
727           Flags.setMergeForward(true);
728           return MBBI;
729         }
730         // Unable to combine these instructions due to interference in between.
731         // Keep looking.
732       }
733     }
734
735     // If the instruction wasn't a matching load or store.  Stop searching if we
736     // encounter a call instruction that might modify memory.
737     if (MI->isCall())
738       return E;
739
740     // Update modified / uses register lists.
741     trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
742
743     // Otherwise, if the base register is modified, we have no match, so
744     // return early.
745     if (ModifiedRegs[BaseReg])
746       return E;
747
748     // Update list of instructions that read/write memory.
749     if (MI->mayLoadOrStore())
750       MemInsns.push_back(MI);
751   }
752   return E;
753 }
754
755 MachineBasicBlock::iterator
756 AArch64LoadStoreOpt::mergeUpdateInsn(MachineBasicBlock::iterator I,
757                                      MachineBasicBlock::iterator Update,
758                                      bool IsPreIdx) {
759   assert((Update->getOpcode() == AArch64::ADDXri ||
760           Update->getOpcode() == AArch64::SUBXri) &&
761          "Unexpected base register update instruction to merge!");
762   MachineBasicBlock::iterator NextI = I;
763   // Return the instruction following the merged instruction, which is
764   // the instruction following our unmerged load. Unless that's the add/sub
765   // instruction we're merging, in which case it's the one after that.
766   if (++NextI == Update)
767     ++NextI;
768
769   int Value = Update->getOperand(2).getImm();
770   assert(AArch64_AM::getShiftValue(Update->getOperand(3).getImm()) == 0 &&
771          "Can't merge 1 << 12 offset into pre-/post-indexed load / store");
772   if (Update->getOpcode() == AArch64::SUBXri)
773     Value = -Value;
774
775   unsigned NewOpc = IsPreIdx ? getPreIndexedOpcode(I->getOpcode())
776                              : getPostIndexedOpcode(I->getOpcode());
777   MachineInstrBuilder MIB;
778   if (!isPairedLdSt(I)) {
779     // Non-paired instruction.
780     MIB = BuildMI(*I->getParent(), I, I->getDebugLoc(), TII->get(NewOpc))
781               .addOperand(getLdStRegOp(Update))
782               .addOperand(getLdStRegOp(I))
783               .addOperand(getLdStBaseOp(I))
784               .addImm(Value);
785   } else {
786     // Paired instruction.
787     int Scale = getMemScale(I);
788     MIB = BuildMI(*I->getParent(), I, I->getDebugLoc(), TII->get(NewOpc))
789               .addOperand(getLdStRegOp(Update))
790               .addOperand(getLdStRegOp(I, 0))
791               .addOperand(getLdStRegOp(I, 1))
792               .addOperand(getLdStBaseOp(I))
793               .addImm(Value / Scale);
794   }
795   (void)MIB;
796
797   if (IsPreIdx)
798     DEBUG(dbgs() << "Creating pre-indexed load/store.");
799   else
800     DEBUG(dbgs() << "Creating post-indexed load/store.");
801   DEBUG(dbgs() << "    Replacing instructions:\n    ");
802   DEBUG(I->print(dbgs()));
803   DEBUG(dbgs() << "    ");
804   DEBUG(Update->print(dbgs()));
805   DEBUG(dbgs() << "  with instruction:\n    ");
806   DEBUG(((MachineInstr *)MIB)->print(dbgs()));
807   DEBUG(dbgs() << "\n");
808
809   // Erase the old instructions for the block.
810   I->eraseFromParent();
811   Update->eraseFromParent();
812
813   return NextI;
814 }
815
816 bool AArch64LoadStoreOpt::isMatchingUpdateInsn(MachineInstr *MemMI,
817                                                MachineInstr *MI,
818                                                unsigned BaseReg, int Offset) {
819   switch (MI->getOpcode()) {
820   default:
821     break;
822   case AArch64::SUBXri:
823     // Negate the offset for a SUB instruction.
824     Offset *= -1;
825   // FALLTHROUGH
826   case AArch64::ADDXri:
827     // Make sure it's a vanilla immediate operand, not a relocation or
828     // anything else we can't handle.
829     if (!MI->getOperand(2).isImm())
830       break;
831     // Watch out for 1 << 12 shifted value.
832     if (AArch64_AM::getShiftValue(MI->getOperand(3).getImm()))
833       break;
834
835     // The update instruction source and destination register must be the
836     // same as the load/store base register.
837     if (MI->getOperand(0).getReg() != BaseReg ||
838         MI->getOperand(1).getReg() != BaseReg)
839       break;
840
841     bool IsPairedInsn = isPairedLdSt(MemMI);
842     int UpdateOffset = MI->getOperand(2).getImm();
843     // For non-paired load/store instructions, the immediate must fit in a
844     // signed 9-bit integer.
845     if (!IsPairedInsn && (UpdateOffset > 255 || UpdateOffset < -256))
846       break;
847
848     // For paired load/store instructions, the immediate must be a multiple of
849     // the scaling factor.  The scaled offset must also fit into a signed 7-bit
850     // integer.
851     if (IsPairedInsn) {
852       int Scale = getMemScale(MemMI);
853       if (UpdateOffset % Scale != 0)
854         break;
855
856       int ScaledOffset = UpdateOffset / Scale;
857       if (ScaledOffset > 64 || ScaledOffset < -64)
858         break;
859     }
860
861     // If we have a non-zero Offset, we check that it matches the amount
862     // we're adding to the register.
863     if (!Offset || Offset == MI->getOperand(2).getImm())
864       return true;
865     break;
866   }
867   return false;
868 }
869
870 MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnForward(
871     MachineBasicBlock::iterator I, unsigned Limit, int Value) {
872   MachineBasicBlock::iterator E = I->getParent()->end();
873   MachineInstr *MemMI = I;
874   MachineBasicBlock::iterator MBBI = I;
875
876   unsigned BaseReg = getLdStBaseOp(MemMI).getReg();
877   int Offset = getLdStOffsetOp(MemMI).getImm() * getMemScale(MemMI);
878
879   // If the base register overlaps a destination register, we can't
880   // merge the update.
881   bool IsPairedInsn = isPairedLdSt(MemMI);
882   for (unsigned i = 0, e = IsPairedInsn ? 2 : 1; i != e; ++i) {
883     unsigned DestReg = getLdStRegOp(MemMI, i).getReg();
884     if (DestReg == BaseReg || TRI->isSubRegister(BaseReg, DestReg))
885       return E;
886   }
887
888   // Scan forward looking for post-index opportunities.
889   // Updating instructions can't be formed if the memory insn already
890   // has an offset other than the value we're looking for.
891   if (Offset != Value)
892     return E;
893
894   // Track which registers have been modified and used between the first insn
895   // (inclusive) and the second insn.
896   BitVector ModifiedRegs, UsedRegs;
897   ModifiedRegs.resize(TRI->getNumRegs());
898   UsedRegs.resize(TRI->getNumRegs());
899   ++MBBI;
900   for (unsigned Count = 0; MBBI != E; ++MBBI) {
901     MachineInstr *MI = MBBI;
902     // Skip DBG_VALUE instructions. Otherwise debug info can affect the
903     // optimization by changing how far we scan.
904     if (MI->isDebugValue())
905       continue;
906
907     // Now that we know this is a real instruction, count it.
908     ++Count;
909
910     // If we found a match, return it.
911     if (isMatchingUpdateInsn(I, MI, BaseReg, Value))
912       return MBBI;
913
914     // Update the status of what the instruction clobbered and used.
915     trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
916
917     // Otherwise, if the base register is used or modified, we have no match, so
918     // return early.
919     if (ModifiedRegs[BaseReg] || UsedRegs[BaseReg])
920       return E;
921   }
922   return E;
923 }
924
925 MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnBackward(
926     MachineBasicBlock::iterator I, unsigned Limit) {
927   MachineBasicBlock::iterator B = I->getParent()->begin();
928   MachineBasicBlock::iterator E = I->getParent()->end();
929   MachineInstr *MemMI = I;
930   MachineBasicBlock::iterator MBBI = I;
931
932   unsigned BaseReg = getLdStBaseOp(MemMI).getReg();
933   int Offset = getLdStOffsetOp(MemMI).getImm();
934   unsigned MemSize = getMemScale(MemMI);
935
936   // If the load/store is the first instruction in the block, there's obviously
937   // not any matching update. Ditto if the memory offset isn't zero.
938   if (MBBI == B || Offset != 0)
939     return E;
940   // If the base register overlaps a destination register, we can't
941   // merge the update.
942   bool IsPairedInsn = isPairedLdSt(MemMI);
943   for (unsigned i = 0, e = IsPairedInsn ? 2 : 1; i != e; ++i) {
944     unsigned DestReg = getLdStRegOp(MemMI, i).getReg();
945     if (DestReg == BaseReg || TRI->isSubRegister(BaseReg, DestReg))
946       return E;
947   }
948
949   // Track which registers have been modified and used between the first insn
950   // (inclusive) and the second insn.
951   BitVector ModifiedRegs, UsedRegs;
952   ModifiedRegs.resize(TRI->getNumRegs());
953   UsedRegs.resize(TRI->getNumRegs());
954   --MBBI;
955   for (unsigned Count = 0; MBBI != B; --MBBI) {
956     MachineInstr *MI = MBBI;
957     // Skip DBG_VALUE instructions. Otherwise debug info can affect the
958     // optimization by changing how far we scan.
959     if (MI->isDebugValue())
960       continue;
961
962     // Now that we know this is a real instruction, count it.
963     ++Count;
964
965     // If we found a match, return it.
966     if (isMatchingUpdateInsn(I, MI, BaseReg, MemSize))
967       return MBBI;
968
969     // Update the status of what the instruction clobbered and used.
970     trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
971
972     // Otherwise, if the base register is used or modified, we have no match, so
973     // return early.
974     if (ModifiedRegs[BaseReg] || UsedRegs[BaseReg])
975       return E;
976   }
977   return E;
978 }
979
980 bool AArch64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
981   bool Modified = false;
982   // Two tranformations to do here:
983   // 1) Find loads and stores that can be merged into a single load or store
984   //    pair instruction.
985   //      e.g.,
986   //        ldr x0, [x2]
987   //        ldr x1, [x2, #8]
988   //        ; becomes
989   //        ldp x0, x1, [x2]
990   // 2) Find base register updates that can be merged into the load or store
991   //    as a base-reg writeback.
992   //      e.g.,
993   //        ldr x0, [x2]
994   //        add x2, x2, #4
995   //        ; becomes
996   //        ldr x0, [x2], #4
997
998   for (MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
999        MBBI != E;) {
1000     MachineInstr *MI = MBBI;
1001     switch (MI->getOpcode()) {
1002     default:
1003       // Just move on to the next instruction.
1004       ++MBBI;
1005       break;
1006     // Scaled instructions.
1007     case AArch64::STRSui:
1008     case AArch64::STRDui:
1009     case AArch64::STRQui:
1010     case AArch64::STRXui:
1011     case AArch64::STRWui:
1012     case AArch64::LDRSui:
1013     case AArch64::LDRDui:
1014     case AArch64::LDRQui:
1015     case AArch64::LDRXui:
1016     case AArch64::LDRWui:
1017     case AArch64::LDRSWui:
1018     // Unscaled instructions.
1019     case AArch64::STURSi:
1020     case AArch64::STURDi:
1021     case AArch64::STURQi:
1022     case AArch64::STURWi:
1023     case AArch64::STURXi:
1024     case AArch64::LDURSi:
1025     case AArch64::LDURDi:
1026     case AArch64::LDURQi:
1027     case AArch64::LDURWi:
1028     case AArch64::LDURXi:
1029     case AArch64::LDURSWi: {
1030       // If this is a volatile load/store, don't mess with it.
1031       if (MI->hasOrderedMemoryRef()) {
1032         ++MBBI;
1033         break;
1034       }
1035       // Make sure this is a reg+imm (as opposed to an address reloc).
1036       if (!getLdStOffsetOp(MI).isImm()) {
1037         ++MBBI;
1038         break;
1039       }
1040       // Check if this load/store has a hint to avoid pair formation.
1041       // MachineMemOperands hints are set by the AArch64StorePairSuppress pass.
1042       if (TII->isLdStPairSuppressed(MI)) {
1043         ++MBBI;
1044         break;
1045       }
1046       // Look ahead up to ScanLimit instructions for a pairable instruction.
1047       LdStPairFlags Flags;
1048       MachineBasicBlock::iterator Paired =
1049           findMatchingInsn(MBBI, Flags, ScanLimit);
1050       if (Paired != E) {
1051         ++NumPairCreated;
1052         if (isUnscaledLdSt(MI))
1053           ++NumUnscaledPairCreated;
1054
1055         // Merge the loads into a pair. Keeping the iterator straight is a
1056         // pain, so we let the merge routine tell us what the next instruction
1057         // is after it's done mucking about.
1058         MBBI = mergePairedInsns(MBBI, Paired, Flags);
1059         Modified = true;
1060         break;
1061       }
1062       ++MBBI;
1063       break;
1064     }
1065       // FIXME: Do the other instructions.
1066     }
1067   }
1068
1069   for (MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
1070        MBBI != E;) {
1071     MachineInstr *MI = MBBI;
1072     // Do update merging. It's simpler to keep this separate from the above
1073     // switch, though not strictly necessary.
1074     unsigned Opc = MI->getOpcode();
1075     switch (Opc) {
1076     default:
1077       // Just move on to the next instruction.
1078       ++MBBI;
1079       break;
1080     // Scaled instructions.
1081     case AArch64::STRSui:
1082     case AArch64::STRDui:
1083     case AArch64::STRQui:
1084     case AArch64::STRXui:
1085     case AArch64::STRWui:
1086     case AArch64::LDRSui:
1087     case AArch64::LDRDui:
1088     case AArch64::LDRQui:
1089     case AArch64::LDRXui:
1090     case AArch64::LDRWui:
1091     // Unscaled instructions.
1092     case AArch64::STURSi:
1093     case AArch64::STURDi:
1094     case AArch64::STURQi:
1095     case AArch64::STURWi:
1096     case AArch64::STURXi:
1097     case AArch64::LDURSi:
1098     case AArch64::LDURDi:
1099     case AArch64::LDURQi:
1100     case AArch64::LDURWi:
1101     case AArch64::LDURXi:
1102     // Paired instructions.
1103     case AArch64::LDPSi:
1104     case AArch64::LDPDi:
1105     case AArch64::LDPQi:
1106     case AArch64::LDPWi:
1107     case AArch64::LDPXi:
1108     case AArch64::STPSi:
1109     case AArch64::STPDi:
1110     case AArch64::STPQi:
1111     case AArch64::STPWi:
1112     case AArch64::STPXi: {
1113       // Make sure this is a reg+imm (as opposed to an address reloc).
1114       if (!getLdStOffsetOp(MI).isImm()) {
1115         ++MBBI;
1116         break;
1117       }
1118       // Look forward to try to form a post-index instruction. For example,
1119       // ldr x0, [x20]
1120       // add x20, x20, #32
1121       //   merged into:
1122       // ldr x0, [x20], #32
1123       MachineBasicBlock::iterator Update =
1124           findMatchingUpdateInsnForward(MBBI, ScanLimit, 0);
1125       if (Update != E) {
1126         // Merge the update into the ld/st.
1127         MBBI = mergeUpdateInsn(MBBI, Update, /*IsPreIdx=*/false);
1128         Modified = true;
1129         ++NumPostFolded;
1130         break;
1131       }
1132       // Don't know how to handle pre/post-index versions, so move to the next
1133       // instruction.
1134       if (isUnscaledLdSt(Opc)) {
1135         ++MBBI;
1136         break;
1137       }
1138
1139       // Look back to try to find a pre-index instruction. For example,
1140       // add x0, x0, #8
1141       // ldr x1, [x0]
1142       //   merged into:
1143       // ldr x1, [x0, #8]!
1144       Update = findMatchingUpdateInsnBackward(MBBI, ScanLimit);
1145       if (Update != E) {
1146         // Merge the update into the ld/st.
1147         MBBI = mergeUpdateInsn(MBBI, Update, /*IsPreIdx=*/true);
1148         Modified = true;
1149         ++NumPreFolded;
1150         break;
1151       }
1152       // The immediate in the load/store is scaled by the size of the register
1153       // being loaded. The immediate in the add we're looking for,
1154       // however, is not, so adjust here.
1155       int Value =
1156           MI->getOperand(isPairedLdSt(MI) ? 3 : 2).getImm() * getMemScale(MI);
1157
1158       // FIXME: The immediate in the load/store should be scaled by the size of
1159       // the memory operation, not the size of the register being loaded/stored.
1160       // This works in general, but does not work for the LDPSW instruction,
1161       // which defines two 64-bit registers, but loads 32-bit values.
1162
1163       // Look forward to try to find a post-index instruction. For example,
1164       // ldr x1, [x0, #64]
1165       // add x0, x0, #64
1166       //   merged into:
1167       // ldr x1, [x0, #64]!
1168       Update = findMatchingUpdateInsnForward(MBBI, ScanLimit, Value);
1169       if (Update != E) {
1170         // Merge the update into the ld/st.
1171         MBBI = mergeUpdateInsn(MBBI, Update, /*IsPreIdx=*/true);
1172         Modified = true;
1173         ++NumPreFolded;
1174         break;
1175       }
1176
1177       // Nothing found. Just move to the next instruction.
1178       ++MBBI;
1179       break;
1180     }
1181       // FIXME: Do the other instructions.
1182     }
1183   }
1184
1185   return Modified;
1186 }
1187
1188 bool AArch64LoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
1189   TII = static_cast<const AArch64InstrInfo *>(Fn.getSubtarget().getInstrInfo());
1190   TRI = Fn.getSubtarget().getRegisterInfo();
1191
1192   bool Modified = false;
1193   for (auto &MBB : Fn)
1194     Modified |= optimizeBlock(MBB);
1195
1196   return Modified;
1197 }
1198
1199 // FIXME: Do we need/want a pre-alloc pass like ARM has to try to keep
1200 // loads and stores near one another?
1201
1202 /// createAArch64LoadStoreOptimizationPass - returns an instance of the
1203 /// load / store optimization pass.
1204 FunctionPass *llvm::createAArch64LoadStoreOptimizationPass() {
1205   return new AArch64LoadStoreOpt();
1206 }