1 //===- AArch64InstrInfo.cpp - AArch64 Instruction Information -------------===//
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 the AArch64 implementation of the TargetInstrInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "AArch64InstrInfo.h"
15 #include "AArch64MachineFunctionInfo.h"
16 #include "AArch64Subtarget.h"
17 #include "MCTargetDesc/AArch64AddressingModes.h"
18 #include "Utils/AArch64BaseInfo.h"
19 #include "llvm/ADT/ArrayRef.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/CodeGen/MachineBasicBlock.h"
23 #include "llvm/CodeGen/MachineFrameInfo.h"
24 #include "llvm/CodeGen/MachineFunction.h"
25 #include "llvm/CodeGen/MachineInstr.h"
26 #include "llvm/CodeGen/MachineInstrBuilder.h"
27 #include "llvm/CodeGen/MachineMemOperand.h"
28 #include "llvm/CodeGen/MachineOperand.h"
29 #include "llvm/CodeGen/MachineRegisterInfo.h"
30 #include "llvm/CodeGen/StackMaps.h"
31 #include "llvm/IR/DebugLoc.h"
32 #include "llvm/IR/GlobalValue.h"
33 #include "llvm/MC/MCInst.h"
34 #include "llvm/MC/MCInstrDesc.h"
35 #include "llvm/Support/Casting.h"
36 #include "llvm/Support/CodeGen.h"
37 #include "llvm/Support/CommandLine.h"
38 #include "llvm/Support/Compiler.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/Support/MathExtras.h"
41 #include "llvm/Target/TargetMachine.h"
42 #include "llvm/Target/TargetOptions.h"
43 #include "llvm/Target/TargetRegisterInfo.h"
44 #include "llvm/Target/TargetSubtargetInfo.h"
45 #include <cassert>
46 #include <cstdint>
47 #include <iterator>
48 #include <utility>
49 
50 using namespace llvm;
51 
52 #define GET_INSTRINFO_CTOR_DTOR
53 #include "AArch64GenInstrInfo.inc"
54 
55 static cl::opt<unsigned>
56 TBZDisplacementBits("aarch64-tbz-offset-bits", cl::Hidden, cl::init(14),
57                     cl::desc("Restrict range of TB[N]Z instructions (DEBUG)"));
58 
59 static cl::opt<unsigned>
60 CBZDisplacementBits("aarch64-cbz-offset-bits", cl::Hidden, cl::init(19),
61                     cl::desc("Restrict range of CB[N]Z instructions (DEBUG)"));
62 
63 static cl::opt<unsigned>
64 BCCDisplacementBits("aarch64-bcc-offset-bits", cl::Hidden, cl::init(19),
65                     cl::desc("Restrict range of Bcc instructions (DEBUG)"));
66 
67 AArch64InstrInfo::AArch64InstrInfo(const AArch64Subtarget &STI)
68     : AArch64GenInstrInfo(AArch64::ADJCALLSTACKDOWN, AArch64::ADJCALLSTACKUP),
69       RI(STI.getTargetTriple()), Subtarget(STI) {}
70 
71 /// GetInstSize - Return the number of bytes of code the specified
72 /// instruction may be.  This returns the maximum number of bytes.
73 unsigned AArch64InstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
74   const MachineBasicBlock &MBB = *MI.getParent();
75   const MachineFunction *MF = MBB.getParent();
76   const MCAsmInfo *MAI = MF->getTarget().getMCAsmInfo();
77 
78   if (MI.getOpcode() == AArch64::INLINEASM)
79     return getInlineAsmLength(MI.getOperand(0).getSymbolName(), *MAI);
80 
81   // FIXME: We currently only handle pseudoinstructions that don't get expanded
82   //        before the assembly printer.
83   unsigned NumBytes = 0;
84   const MCInstrDesc &Desc = MI.getDesc();
85   switch (Desc.getOpcode()) {
86   default:
87     // Anything not explicitly designated otherwise is a normal 4-byte insn.
88     NumBytes = 4;
89     break;
90   case TargetOpcode::DBG_VALUE:
91   case TargetOpcode::EH_LABEL:
92   case TargetOpcode::IMPLICIT_DEF:
93   case TargetOpcode::KILL:
94     NumBytes = 0;
95     break;
96   case TargetOpcode::STACKMAP:
97     // The upper bound for a stackmap intrinsic is the full length of its shadow
98     NumBytes = StackMapOpers(&MI).getNumPatchBytes();
99     assert(NumBytes % 4 == 0 && "Invalid number of NOP bytes requested!");
100     break;
101   case TargetOpcode::PATCHPOINT:
102     // The size of the patchpoint intrinsic is the number of bytes requested
103     NumBytes = PatchPointOpers(&MI).getNumPatchBytes();
104     assert(NumBytes % 4 == 0 && "Invalid number of NOP bytes requested!");
105     break;
106   case AArch64::TLSDESC_CALLSEQ:
107     // This gets lowered to an instruction sequence which takes 16 bytes
108     NumBytes = 16;
109     break;
110   }
111 
112   return NumBytes;
113 }
114 
115 static void parseCondBranch(MachineInstr *LastInst, MachineBasicBlock *&Target,
116                             SmallVectorImpl<MachineOperand> &Cond) {
117   // Block ends with fall-through condbranch.
118   switch (LastInst->getOpcode()) {
119   default:
120     llvm_unreachable("Unknown branch instruction?");
121   case AArch64::Bcc:
122     Target = LastInst->getOperand(1).getMBB();
123     Cond.push_back(LastInst->getOperand(0));
124     break;
125   case AArch64::CBZW:
126   case AArch64::CBZX:
127   case AArch64::CBNZW:
128   case AArch64::CBNZX:
129     Target = LastInst->getOperand(1).getMBB();
130     Cond.push_back(MachineOperand::CreateImm(-1));
131     Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
132     Cond.push_back(LastInst->getOperand(0));
133     break;
134   case AArch64::TBZW:
135   case AArch64::TBZX:
136   case AArch64::TBNZW:
137   case AArch64::TBNZX:
138     Target = LastInst->getOperand(2).getMBB();
139     Cond.push_back(MachineOperand::CreateImm(-1));
140     Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
141     Cond.push_back(LastInst->getOperand(0));
142     Cond.push_back(LastInst->getOperand(1));
143   }
144 }
145 
146 static unsigned getBranchDisplacementBits(unsigned Opc) {
147   switch (Opc) {
148   default:
149     llvm_unreachable("unexpected opcode!");
150   case AArch64::B:
151     return 64;
152   case AArch64::TBNZW:
153   case AArch64::TBZW:
154   case AArch64::TBNZX:
155   case AArch64::TBZX:
156     return TBZDisplacementBits;
157   case AArch64::CBNZW:
158   case AArch64::CBZW:
159   case AArch64::CBNZX:
160   case AArch64::CBZX:
161     return CBZDisplacementBits;
162   case AArch64::Bcc:
163     return BCCDisplacementBits;
164   }
165 }
166 
167 bool AArch64InstrInfo::isBranchOffsetInRange(unsigned BranchOp,
168                                              int64_t BrOffset) const {
169   unsigned Bits = getBranchDisplacementBits(BranchOp);
170   assert(Bits >= 3 && "max branch displacement must be enough to jump"
171                       "over conditional branch expansion");
172   return isIntN(Bits, BrOffset / 4);
173 }
174 
175 MachineBasicBlock *AArch64InstrInfo::getBranchDestBlock(
176   const MachineInstr &MI) const {
177   switch (MI.getOpcode()) {
178   default:
179     llvm_unreachable("unexpected opcode!");
180   case AArch64::B:
181     return MI.getOperand(0).getMBB();
182   case AArch64::TBZW:
183   case AArch64::TBNZW:
184   case AArch64::TBZX:
185   case AArch64::TBNZX:
186     return MI.getOperand(2).getMBB();
187   case AArch64::CBZW:
188   case AArch64::CBNZW:
189   case AArch64::CBZX:
190   case AArch64::CBNZX:
191   case AArch64::Bcc:
192     return MI.getOperand(1).getMBB();
193   }
194 }
195 
196 // Branch analysis.
197 bool AArch64InstrInfo::analyzeBranch(MachineBasicBlock &MBB,
198                                      MachineBasicBlock *&TBB,
199                                      MachineBasicBlock *&FBB,
200                                      SmallVectorImpl<MachineOperand> &Cond,
201                                      bool AllowModify) const {
202   // If the block has no terminators, it just falls into the block after it.
203   MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
204   if (I == MBB.end())
205     return false;
206 
207   if (!isUnpredicatedTerminator(*I))
208     return false;
209 
210   // Get the last instruction in the block.
211   MachineInstr *LastInst = &*I;
212 
213   // If there is only one terminator instruction, process it.
214   unsigned LastOpc = LastInst->getOpcode();
215   if (I == MBB.begin() || !isUnpredicatedTerminator(*--I)) {
216     if (isUncondBranchOpcode(LastOpc)) {
217       TBB = LastInst->getOperand(0).getMBB();
218       return false;
219     }
220     if (isCondBranchOpcode(LastOpc)) {
221       // Block ends with fall-through condbranch.
222       parseCondBranch(LastInst, TBB, Cond);
223       return false;
224     }
225     return true; // Can't handle indirect branch.
226   }
227 
228   // Get the instruction before it if it is a terminator.
229   MachineInstr *SecondLastInst = &*I;
230   unsigned SecondLastOpc = SecondLastInst->getOpcode();
231 
232   // If AllowModify is true and the block ends with two or more unconditional
233   // branches, delete all but the first unconditional branch.
234   if (AllowModify && isUncondBranchOpcode(LastOpc)) {
235     while (isUncondBranchOpcode(SecondLastOpc)) {
236       LastInst->eraseFromParent();
237       LastInst = SecondLastInst;
238       LastOpc = LastInst->getOpcode();
239       if (I == MBB.begin() || !isUnpredicatedTerminator(*--I)) {
240         // Return now the only terminator is an unconditional branch.
241         TBB = LastInst->getOperand(0).getMBB();
242         return false;
243       } else {
244         SecondLastInst = &*I;
245         SecondLastOpc = SecondLastInst->getOpcode();
246       }
247     }
248   }
249 
250   // If there are three terminators, we don't know what sort of block this is.
251   if (SecondLastInst && I != MBB.begin() && isUnpredicatedTerminator(*--I))
252     return true;
253 
254   // If the block ends with a B and a Bcc, handle it.
255   if (isCondBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
256     parseCondBranch(SecondLastInst, TBB, Cond);
257     FBB = LastInst->getOperand(0).getMBB();
258     return false;
259   }
260 
261   // If the block ends with two unconditional branches, handle it.  The second
262   // one is not executed, so remove it.
263   if (isUncondBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
264     TBB = SecondLastInst->getOperand(0).getMBB();
265     I = LastInst;
266     if (AllowModify)
267       I->eraseFromParent();
268     return false;
269   }
270 
271   // ...likewise if it ends with an indirect branch followed by an unconditional
272   // branch.
273   if (isIndirectBranchOpcode(SecondLastOpc) && isUncondBranchOpcode(LastOpc)) {
274     I = LastInst;
275     if (AllowModify)
276       I->eraseFromParent();
277     return true;
278   }
279 
280   // Otherwise, can't handle this.
281   return true;
282 }
283 
284 bool AArch64InstrInfo::reverseBranchCondition(
285     SmallVectorImpl<MachineOperand> &Cond) const {
286   if (Cond[0].getImm() != -1) {
287     // Regular Bcc
288     AArch64CC::CondCode CC = (AArch64CC::CondCode)(int)Cond[0].getImm();
289     Cond[0].setImm(AArch64CC::getInvertedCondCode(CC));
290   } else {
291     // Folded compare-and-branch
292     switch (Cond[1].getImm()) {
293     default:
294       llvm_unreachable("Unknown conditional branch!");
295     case AArch64::CBZW:
296       Cond[1].setImm(AArch64::CBNZW);
297       break;
298     case AArch64::CBNZW:
299       Cond[1].setImm(AArch64::CBZW);
300       break;
301     case AArch64::CBZX:
302       Cond[1].setImm(AArch64::CBNZX);
303       break;
304     case AArch64::CBNZX:
305       Cond[1].setImm(AArch64::CBZX);
306       break;
307     case AArch64::TBZW:
308       Cond[1].setImm(AArch64::TBNZW);
309       break;
310     case AArch64::TBNZW:
311       Cond[1].setImm(AArch64::TBZW);
312       break;
313     case AArch64::TBZX:
314       Cond[1].setImm(AArch64::TBNZX);
315       break;
316     case AArch64::TBNZX:
317       Cond[1].setImm(AArch64::TBZX);
318       break;
319     }
320   }
321 
322   return false;
323 }
324 
325 unsigned AArch64InstrInfo::removeBranch(MachineBasicBlock &MBB,
326                                         int *BytesRemoved) const {
327   MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
328   if (I == MBB.end())
329     return 0;
330 
331   if (!isUncondBranchOpcode(I->getOpcode()) &&
332       !isCondBranchOpcode(I->getOpcode()))
333     return 0;
334 
335   // Remove the branch.
336   I->eraseFromParent();
337 
338   I = MBB.end();
339 
340   if (I == MBB.begin()) {
341     if (BytesRemoved)
342       *BytesRemoved = 4;
343     return 1;
344   }
345   --I;
346   if (!isCondBranchOpcode(I->getOpcode())) {
347     if (BytesRemoved)
348       *BytesRemoved = 4;
349     return 1;
350   }
351 
352   // Remove the branch.
353   I->eraseFromParent();
354   if (BytesRemoved)
355     *BytesRemoved = 8;
356 
357   return 2;
358 }
359 
360 void AArch64InstrInfo::instantiateCondBranch(
361     MachineBasicBlock &MBB, const DebugLoc &DL, MachineBasicBlock *TBB,
362     ArrayRef<MachineOperand> Cond) const {
363   if (Cond[0].getImm() != -1) {
364     // Regular Bcc
365     BuildMI(&MBB, DL, get(AArch64::Bcc)).addImm(Cond[0].getImm()).addMBB(TBB);
366   } else {
367     // Folded compare-and-branch
368     // Note that we use addOperand instead of addReg to keep the flags.
369     const MachineInstrBuilder MIB =
370         BuildMI(&MBB, DL, get(Cond[1].getImm())).add(Cond[2]);
371     if (Cond.size() > 3)
372       MIB.addImm(Cond[3].getImm());
373     MIB.addMBB(TBB);
374   }
375 }
376 
377 unsigned AArch64InstrInfo::insertBranch(MachineBasicBlock &MBB,
378                                         MachineBasicBlock *TBB,
379                                         MachineBasicBlock *FBB,
380                                         ArrayRef<MachineOperand> Cond,
381                                         const DebugLoc &DL,
382                                         int *BytesAdded) const {
383   // Shouldn't be a fall through.
384   assert(TBB && "insertBranch must not be told to insert a fallthrough");
385 
386   if (!FBB) {
387     if (Cond.empty()) // Unconditional branch?
388       BuildMI(&MBB, DL, get(AArch64::B)).addMBB(TBB);
389     else
390       instantiateCondBranch(MBB, DL, TBB, Cond);
391 
392     if (BytesAdded)
393       *BytesAdded = 4;
394 
395     return 1;
396   }
397 
398   // Two-way conditional branch.
399   instantiateCondBranch(MBB, DL, TBB, Cond);
400   BuildMI(&MBB, DL, get(AArch64::B)).addMBB(FBB);
401 
402   if (BytesAdded)
403     *BytesAdded = 8;
404 
405   return 2;
406 }
407 
408 // Find the original register that VReg is copied from.
409 static unsigned removeCopies(const MachineRegisterInfo &MRI, unsigned VReg) {
410   while (TargetRegisterInfo::isVirtualRegister(VReg)) {
411     const MachineInstr *DefMI = MRI.getVRegDef(VReg);
412     if (!DefMI->isFullCopy())
413       return VReg;
414     VReg = DefMI->getOperand(1).getReg();
415   }
416   return VReg;
417 }
418 
419 // Determine if VReg is defined by an instruction that can be folded into a
420 // csel instruction. If so, return the folded opcode, and the replacement
421 // register.
422 static unsigned canFoldIntoCSel(const MachineRegisterInfo &MRI, unsigned VReg,
423                                 unsigned *NewVReg = nullptr) {
424   VReg = removeCopies(MRI, VReg);
425   if (!TargetRegisterInfo::isVirtualRegister(VReg))
426     return 0;
427 
428   bool Is64Bit = AArch64::GPR64allRegClass.hasSubClassEq(MRI.getRegClass(VReg));
429   const MachineInstr *DefMI = MRI.getVRegDef(VReg);
430   unsigned Opc = 0;
431   unsigned SrcOpNum = 0;
432   switch (DefMI->getOpcode()) {
433   case AArch64::ADDSXri:
434   case AArch64::ADDSWri:
435     // if NZCV is used, do not fold.
436     if (DefMI->findRegisterDefOperandIdx(AArch64::NZCV, true) == -1)
437       return 0;
438     // fall-through to ADDXri and ADDWri.
439     LLVM_FALLTHROUGH;
440   case AArch64::ADDXri:
441   case AArch64::ADDWri:
442     // add x, 1 -> csinc.
443     if (!DefMI->getOperand(2).isImm() || DefMI->getOperand(2).getImm() != 1 ||
444         DefMI->getOperand(3).getImm() != 0)
445       return 0;
446     SrcOpNum = 1;
447     Opc = Is64Bit ? AArch64::CSINCXr : AArch64::CSINCWr;
448     break;
449 
450   case AArch64::ORNXrr:
451   case AArch64::ORNWrr: {
452     // not x -> csinv, represented as orn dst, xzr, src.
453     unsigned ZReg = removeCopies(MRI, DefMI->getOperand(1).getReg());
454     if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
455       return 0;
456     SrcOpNum = 2;
457     Opc = Is64Bit ? AArch64::CSINVXr : AArch64::CSINVWr;
458     break;
459   }
460 
461   case AArch64::SUBSXrr:
462   case AArch64::SUBSWrr:
463     // if NZCV is used, do not fold.
464     if (DefMI->findRegisterDefOperandIdx(AArch64::NZCV, true) == -1)
465       return 0;
466     // fall-through to SUBXrr and SUBWrr.
467     LLVM_FALLTHROUGH;
468   case AArch64::SUBXrr:
469   case AArch64::SUBWrr: {
470     // neg x -> csneg, represented as sub dst, xzr, src.
471     unsigned ZReg = removeCopies(MRI, DefMI->getOperand(1).getReg());
472     if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
473       return 0;
474     SrcOpNum = 2;
475     Opc = Is64Bit ? AArch64::CSNEGXr : AArch64::CSNEGWr;
476     break;
477   }
478   default:
479     return 0;
480   }
481   assert(Opc && SrcOpNum && "Missing parameters");
482 
483   if (NewVReg)
484     *NewVReg = DefMI->getOperand(SrcOpNum).getReg();
485   return Opc;
486 }
487 
488 bool AArch64InstrInfo::canInsertSelect(
489     const MachineBasicBlock &MBB, ArrayRef<MachineOperand> Cond,
490     unsigned TrueReg, unsigned FalseReg, int &CondCycles, int &TrueCycles,
491     int &FalseCycles) const {
492   // Check register classes.
493   const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
494   const TargetRegisterClass *RC =
495       RI.getCommonSubClass(MRI.getRegClass(TrueReg), MRI.getRegClass(FalseReg));
496   if (!RC)
497     return false;
498 
499   // Expanding cbz/tbz requires an extra cycle of latency on the condition.
500   unsigned ExtraCondLat = Cond.size() != 1;
501 
502   // GPRs are handled by csel.
503   // FIXME: Fold in x+1, -x, and ~x when applicable.
504   if (AArch64::GPR64allRegClass.hasSubClassEq(RC) ||
505       AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
506     // Single-cycle csel, csinc, csinv, and csneg.
507     CondCycles = 1 + ExtraCondLat;
508     TrueCycles = FalseCycles = 1;
509     if (canFoldIntoCSel(MRI, TrueReg))
510       TrueCycles = 0;
511     else if (canFoldIntoCSel(MRI, FalseReg))
512       FalseCycles = 0;
513     return true;
514   }
515 
516   // Scalar floating point is handled by fcsel.
517   // FIXME: Form fabs, fmin, and fmax when applicable.
518   if (AArch64::FPR64RegClass.hasSubClassEq(RC) ||
519       AArch64::FPR32RegClass.hasSubClassEq(RC)) {
520     CondCycles = 5 + ExtraCondLat;
521     TrueCycles = FalseCycles = 2;
522     return true;
523   }
524 
525   // Can't do vectors.
526   return false;
527 }
528 
529 void AArch64InstrInfo::insertSelect(MachineBasicBlock &MBB,
530                                     MachineBasicBlock::iterator I,
531                                     const DebugLoc &DL, unsigned DstReg,
532                                     ArrayRef<MachineOperand> Cond,
533                                     unsigned TrueReg, unsigned FalseReg) const {
534   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
535 
536   // Parse the condition code, see parseCondBranch() above.
537   AArch64CC::CondCode CC;
538   switch (Cond.size()) {
539   default:
540     llvm_unreachable("Unknown condition opcode in Cond");
541   case 1: // b.cc
542     CC = AArch64CC::CondCode(Cond[0].getImm());
543     break;
544   case 3: { // cbz/cbnz
545     // We must insert a compare against 0.
546     bool Is64Bit;
547     switch (Cond[1].getImm()) {
548     default:
549       llvm_unreachable("Unknown branch opcode in Cond");
550     case AArch64::CBZW:
551       Is64Bit = false;
552       CC = AArch64CC::EQ;
553       break;
554     case AArch64::CBZX:
555       Is64Bit = true;
556       CC = AArch64CC::EQ;
557       break;
558     case AArch64::CBNZW:
559       Is64Bit = false;
560       CC = AArch64CC::NE;
561       break;
562     case AArch64::CBNZX:
563       Is64Bit = true;
564       CC = AArch64CC::NE;
565       break;
566     }
567     unsigned SrcReg = Cond[2].getReg();
568     if (Is64Bit) {
569       // cmp reg, #0 is actually subs xzr, reg, #0.
570       MRI.constrainRegClass(SrcReg, &AArch64::GPR64spRegClass);
571       BuildMI(MBB, I, DL, get(AArch64::SUBSXri), AArch64::XZR)
572           .addReg(SrcReg)
573           .addImm(0)
574           .addImm(0);
575     } else {
576       MRI.constrainRegClass(SrcReg, &AArch64::GPR32spRegClass);
577       BuildMI(MBB, I, DL, get(AArch64::SUBSWri), AArch64::WZR)
578           .addReg(SrcReg)
579           .addImm(0)
580           .addImm(0);
581     }
582     break;
583   }
584   case 4: { // tbz/tbnz
585     // We must insert a tst instruction.
586     switch (Cond[1].getImm()) {
587     default:
588       llvm_unreachable("Unknown branch opcode in Cond");
589     case AArch64::TBZW:
590     case AArch64::TBZX:
591       CC = AArch64CC::EQ;
592       break;
593     case AArch64::TBNZW:
594     case AArch64::TBNZX:
595       CC = AArch64CC::NE;
596       break;
597     }
598     // cmp reg, #foo is actually ands xzr, reg, #1<<foo.
599     if (Cond[1].getImm() == AArch64::TBZW || Cond[1].getImm() == AArch64::TBNZW)
600       BuildMI(MBB, I, DL, get(AArch64::ANDSWri), AArch64::WZR)
601           .addReg(Cond[2].getReg())
602           .addImm(
603               AArch64_AM::encodeLogicalImmediate(1ull << Cond[3].getImm(), 32));
604     else
605       BuildMI(MBB, I, DL, get(AArch64::ANDSXri), AArch64::XZR)
606           .addReg(Cond[2].getReg())
607           .addImm(
608               AArch64_AM::encodeLogicalImmediate(1ull << Cond[3].getImm(), 64));
609     break;
610   }
611   }
612 
613   unsigned Opc = 0;
614   const TargetRegisterClass *RC = nullptr;
615   bool TryFold = false;
616   if (MRI.constrainRegClass(DstReg, &AArch64::GPR64RegClass)) {
617     RC = &AArch64::GPR64RegClass;
618     Opc = AArch64::CSELXr;
619     TryFold = true;
620   } else if (MRI.constrainRegClass(DstReg, &AArch64::GPR32RegClass)) {
621     RC = &AArch64::GPR32RegClass;
622     Opc = AArch64::CSELWr;
623     TryFold = true;
624   } else if (MRI.constrainRegClass(DstReg, &AArch64::FPR64RegClass)) {
625     RC = &AArch64::FPR64RegClass;
626     Opc = AArch64::FCSELDrrr;
627   } else if (MRI.constrainRegClass(DstReg, &AArch64::FPR32RegClass)) {
628     RC = &AArch64::FPR32RegClass;
629     Opc = AArch64::FCSELSrrr;
630   }
631   assert(RC && "Unsupported regclass");
632 
633   // Try folding simple instructions into the csel.
634   if (TryFold) {
635     unsigned NewVReg = 0;
636     unsigned FoldedOpc = canFoldIntoCSel(MRI, TrueReg, &NewVReg);
637     if (FoldedOpc) {
638       // The folded opcodes csinc, csinc and csneg apply the operation to
639       // FalseReg, so we need to invert the condition.
640       CC = AArch64CC::getInvertedCondCode(CC);
641       TrueReg = FalseReg;
642     } else
643       FoldedOpc = canFoldIntoCSel(MRI, FalseReg, &NewVReg);
644 
645     // Fold the operation. Leave any dead instructions for DCE to clean up.
646     if (FoldedOpc) {
647       FalseReg = NewVReg;
648       Opc = FoldedOpc;
649       // The extends the live range of NewVReg.
650       MRI.clearKillFlags(NewVReg);
651     }
652   }
653 
654   // Pull all virtual register into the appropriate class.
655   MRI.constrainRegClass(TrueReg, RC);
656   MRI.constrainRegClass(FalseReg, RC);
657 
658   // Insert the csel.
659   BuildMI(MBB, I, DL, get(Opc), DstReg).addReg(TrueReg).addReg(FalseReg).addImm(
660       CC);
661 }
662 
663 /// Returns true if a MOVi32imm or MOVi64imm can be expanded to an  ORRxx.
664 static bool canBeExpandedToORR(const MachineInstr &MI, unsigned BitSize) {
665   uint64_t Imm = MI.getOperand(1).getImm();
666   uint64_t UImm = Imm << (64 - BitSize) >> (64 - BitSize);
667   uint64_t Encoding;
668   return AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding);
669 }
670 
671 // FIXME: this implementation should be micro-architecture dependent, so a
672 // micro-architecture target hook should be introduced here in future.
673 bool AArch64InstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {
674   if (!Subtarget.hasCustomCheapAsMoveHandling())
675     return MI.isAsCheapAsAMove();
676 
677   unsigned Imm;
678 
679   switch (MI.getOpcode()) {
680   default:
681     return false;
682 
683   // add/sub on register without shift
684   case AArch64::ADDWri:
685   case AArch64::ADDXri:
686   case AArch64::SUBWri:
687   case AArch64::SUBXri:
688     return (Subtarget.getProcFamily() == AArch64Subtarget::ExynosM1 ||
689             MI.getOperand(3).getImm() == 0);
690 
691   // add/sub on register with shift
692   case AArch64::ADDWrs:
693   case AArch64::ADDXrs:
694   case AArch64::SUBWrs:
695   case AArch64::SUBXrs:
696     Imm = MI.getOperand(3).getImm();
697     return (Subtarget.getProcFamily() == AArch64Subtarget::ExynosM1 &&
698             AArch64_AM::getArithShiftValue(Imm) < 4);
699 
700   // logical ops on immediate
701   case AArch64::ANDWri:
702   case AArch64::ANDXri:
703   case AArch64::EORWri:
704   case AArch64::EORXri:
705   case AArch64::ORRWri:
706   case AArch64::ORRXri:
707     return true;
708 
709   // logical ops on register without shift
710   case AArch64::ANDWrr:
711   case AArch64::ANDXrr:
712   case AArch64::BICWrr:
713   case AArch64::BICXrr:
714   case AArch64::EONWrr:
715   case AArch64::EONXrr:
716   case AArch64::EORWrr:
717   case AArch64::EORXrr:
718   case AArch64::ORNWrr:
719   case AArch64::ORNXrr:
720   case AArch64::ORRWrr:
721   case AArch64::ORRXrr:
722     return true;
723 
724   // logical ops on register with shift
725   case AArch64::ANDWrs:
726   case AArch64::ANDXrs:
727   case AArch64::BICWrs:
728   case AArch64::BICXrs:
729   case AArch64::EONWrs:
730   case AArch64::EONXrs:
731   case AArch64::EORWrs:
732   case AArch64::EORXrs:
733   case AArch64::ORNWrs:
734   case AArch64::ORNXrs:
735   case AArch64::ORRWrs:
736   case AArch64::ORRXrs:
737     Imm = MI.getOperand(3).getImm();
738     return (Subtarget.getProcFamily() == AArch64Subtarget::ExynosM1 &&
739             AArch64_AM::getShiftValue(Imm) < 4 &&
740             AArch64_AM::getShiftType(Imm) == AArch64_AM::LSL);
741 
742   // If MOVi32imm or MOVi64imm can be expanded into ORRWri or
743   // ORRXri, it is as cheap as MOV
744   case AArch64::MOVi32imm:
745     return canBeExpandedToORR(MI, 32);
746   case AArch64::MOVi64imm:
747     return canBeExpandedToORR(MI, 64);
748 
749   // It is cheap to zero out registers if the subtarget has ZeroCycleZeroing
750   // feature.
751   case AArch64::FMOVS0:
752   case AArch64::FMOVD0:
753     return Subtarget.hasZeroCycleZeroing();
754   case TargetOpcode::COPY:
755     return (Subtarget.hasZeroCycleZeroing() &&
756             (MI.getOperand(1).getReg() == AArch64::WZR ||
757              MI.getOperand(1).getReg() == AArch64::XZR));
758   }
759 
760   llvm_unreachable("Unknown opcode to check as cheap as a move!");
761 }
762 
763 bool AArch64InstrInfo::isFalkorShiftExtFast(const MachineInstr &MI) const {
764   switch (MI.getOpcode()) {
765   default:
766     return false;
767 
768   case AArch64::ADDWrs:
769   case AArch64::ADDXrs:
770   case AArch64::ADDSWrs:
771   case AArch64::ADDSXrs: {
772     unsigned Imm = MI.getOperand(3).getImm();
773     unsigned ShiftVal = AArch64_AM::getShiftValue(Imm);
774     if (ShiftVal == 0)
775       return true;
776     return AArch64_AM::getShiftType(Imm) == AArch64_AM::LSL && ShiftVal <= 5;
777   }
778 
779   case AArch64::ADDWrx:
780   case AArch64::ADDXrx:
781   case AArch64::ADDXrx64:
782   case AArch64::ADDSWrx:
783   case AArch64::ADDSXrx:
784   case AArch64::ADDSXrx64: {
785     unsigned Imm = MI.getOperand(3).getImm();
786     switch (AArch64_AM::getArithExtendType(Imm)) {
787     default:
788       return false;
789     case AArch64_AM::UXTB:
790     case AArch64_AM::UXTH:
791     case AArch64_AM::UXTW:
792     case AArch64_AM::UXTX:
793       return AArch64_AM::getArithShiftValue(Imm) <= 4;
794     }
795   }
796 
797   case AArch64::SUBWrs:
798   case AArch64::SUBSWrs: {
799     unsigned Imm = MI.getOperand(3).getImm();
800     unsigned ShiftVal = AArch64_AM::getShiftValue(Imm);
801     return ShiftVal == 0 ||
802            (AArch64_AM::getShiftType(Imm) == AArch64_AM::ASR && ShiftVal == 31);
803   }
804 
805   case AArch64::SUBXrs:
806   case AArch64::SUBSXrs: {
807     unsigned Imm = MI.getOperand(3).getImm();
808     unsigned ShiftVal = AArch64_AM::getShiftValue(Imm);
809     return ShiftVal == 0 ||
810            (AArch64_AM::getShiftType(Imm) == AArch64_AM::ASR && ShiftVal == 63);
811   }
812 
813   case AArch64::SUBWrx:
814   case AArch64::SUBXrx:
815   case AArch64::SUBXrx64:
816   case AArch64::SUBSWrx:
817   case AArch64::SUBSXrx:
818   case AArch64::SUBSXrx64: {
819     unsigned Imm = MI.getOperand(3).getImm();
820     switch (AArch64_AM::getArithExtendType(Imm)) {
821     default:
822       return false;
823     case AArch64_AM::UXTB:
824     case AArch64_AM::UXTH:
825     case AArch64_AM::UXTW:
826     case AArch64_AM::UXTX:
827       return AArch64_AM::getArithShiftValue(Imm) == 0;
828     }
829   }
830 
831   case AArch64::LDRBBroW:
832   case AArch64::LDRBBroX:
833   case AArch64::LDRBroW:
834   case AArch64::LDRBroX:
835   case AArch64::LDRDroW:
836   case AArch64::LDRDroX:
837   case AArch64::LDRHHroW:
838   case AArch64::LDRHHroX:
839   case AArch64::LDRHroW:
840   case AArch64::LDRHroX:
841   case AArch64::LDRQroW:
842   case AArch64::LDRQroX:
843   case AArch64::LDRSBWroW:
844   case AArch64::LDRSBWroX:
845   case AArch64::LDRSBXroW:
846   case AArch64::LDRSBXroX:
847   case AArch64::LDRSHWroW:
848   case AArch64::LDRSHWroX:
849   case AArch64::LDRSHXroW:
850   case AArch64::LDRSHXroX:
851   case AArch64::LDRSWroW:
852   case AArch64::LDRSWroX:
853   case AArch64::LDRSroW:
854   case AArch64::LDRSroX:
855   case AArch64::LDRWroW:
856   case AArch64::LDRWroX:
857   case AArch64::LDRXroW:
858   case AArch64::LDRXroX:
859   case AArch64::PRFMroW:
860   case AArch64::PRFMroX:
861   case AArch64::STRBBroW:
862   case AArch64::STRBBroX:
863   case AArch64::STRBroW:
864   case AArch64::STRBroX:
865   case AArch64::STRDroW:
866   case AArch64::STRDroX:
867   case AArch64::STRHHroW:
868   case AArch64::STRHHroX:
869   case AArch64::STRHroW:
870   case AArch64::STRHroX:
871   case AArch64::STRQroW:
872   case AArch64::STRQroX:
873   case AArch64::STRSroW:
874   case AArch64::STRSroX:
875   case AArch64::STRWroW:
876   case AArch64::STRWroX:
877   case AArch64::STRXroW:
878   case AArch64::STRXroX: {
879     unsigned IsSigned = MI.getOperand(3).getImm();
880     return !IsSigned;
881   }
882   }
883 }
884 
885 bool AArch64InstrInfo::isCoalescableExtInstr(const MachineInstr &MI,
886                                              unsigned &SrcReg, unsigned &DstReg,
887                                              unsigned &SubIdx) const {
888   switch (MI.getOpcode()) {
889   default:
890     return false;
891   case AArch64::SBFMXri: // aka sxtw
892   case AArch64::UBFMXri: // aka uxtw
893     // Check for the 32 -> 64 bit extension case, these instructions can do
894     // much more.
895     if (MI.getOperand(2).getImm() != 0 || MI.getOperand(3).getImm() != 31)
896       return false;
897     // This is a signed or unsigned 32 -> 64 bit extension.
898     SrcReg = MI.getOperand(1).getReg();
899     DstReg = MI.getOperand(0).getReg();
900     SubIdx = AArch64::sub_32;
901     return true;
902   }
903 }
904 
905 bool AArch64InstrInfo::areMemAccessesTriviallyDisjoint(
906     MachineInstr &MIa, MachineInstr &MIb, AliasAnalysis *AA) const {
907   const TargetRegisterInfo *TRI = &getRegisterInfo();
908   unsigned BaseRegA = 0, BaseRegB = 0;
909   int64_t OffsetA = 0, OffsetB = 0;
910   unsigned WidthA = 0, WidthB = 0;
911 
912   assert(MIa.mayLoadOrStore() && "MIa must be a load or store.");
913   assert(MIb.mayLoadOrStore() && "MIb must be a load or store.");
914 
915   if (MIa.hasUnmodeledSideEffects() || MIb.hasUnmodeledSideEffects() ||
916       MIa.hasOrderedMemoryRef() || MIb.hasOrderedMemoryRef())
917     return false;
918 
919   // Retrieve the base register, offset from the base register and width. Width
920   // is the size of memory that is being loaded/stored (e.g. 1, 2, 4, 8).  If
921   // base registers are identical, and the offset of a lower memory access +
922   // the width doesn't overlap the offset of a higher memory access,
923   // then the memory accesses are different.
924   if (getMemOpBaseRegImmOfsWidth(MIa, BaseRegA, OffsetA, WidthA, TRI) &&
925       getMemOpBaseRegImmOfsWidth(MIb, BaseRegB, OffsetB, WidthB, TRI)) {
926     if (BaseRegA == BaseRegB) {
927       int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
928       int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
929       int LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
930       if (LowOffset + LowWidth <= HighOffset)
931         return true;
932     }
933   }
934   return false;
935 }
936 
937 /// analyzeCompare - For a comparison instruction, return the source registers
938 /// in SrcReg and SrcReg2, and the value it compares against in CmpValue.
939 /// Return true if the comparison instruction can be analyzed.
940 bool AArch64InstrInfo::analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
941                                       unsigned &SrcReg2, int &CmpMask,
942                                       int &CmpValue) const {
943   // The first operand can be a frame index where we'd normally expect a
944   // register.
945   assert(MI.getNumOperands() >= 2 && "All AArch64 cmps should have 2 operands");
946   if (!MI.getOperand(1).isReg())
947     return false;
948 
949   switch (MI.getOpcode()) {
950   default:
951     break;
952   case AArch64::SUBSWrr:
953   case AArch64::SUBSWrs:
954   case AArch64::SUBSWrx:
955   case AArch64::SUBSXrr:
956   case AArch64::SUBSXrs:
957   case AArch64::SUBSXrx:
958   case AArch64::ADDSWrr:
959   case AArch64::ADDSWrs:
960   case AArch64::ADDSWrx:
961   case AArch64::ADDSXrr:
962   case AArch64::ADDSXrs:
963   case AArch64::ADDSXrx:
964     // Replace SUBSWrr with SUBWrr if NZCV is not used.
965     SrcReg = MI.getOperand(1).getReg();
966     SrcReg2 = MI.getOperand(2).getReg();
967     CmpMask = ~0;
968     CmpValue = 0;
969     return true;
970   case AArch64::SUBSWri:
971   case AArch64::ADDSWri:
972   case AArch64::SUBSXri:
973   case AArch64::ADDSXri:
974     SrcReg = MI.getOperand(1).getReg();
975     SrcReg2 = 0;
976     CmpMask = ~0;
977     // FIXME: In order to convert CmpValue to 0 or 1
978     CmpValue = MI.getOperand(2).getImm() != 0;
979     return true;
980   case AArch64::ANDSWri:
981   case AArch64::ANDSXri:
982     // ANDS does not use the same encoding scheme as the others xxxS
983     // instructions.
984     SrcReg = MI.getOperand(1).getReg();
985     SrcReg2 = 0;
986     CmpMask = ~0;
987     // FIXME:The return val type of decodeLogicalImmediate is uint64_t,
988     // while the type of CmpValue is int. When converting uint64_t to int,
989     // the high 32 bits of uint64_t will be lost.
990     // In fact it causes a bug in spec2006-483.xalancbmk
991     // CmpValue is only used to compare with zero in OptimizeCompareInstr
992     CmpValue = AArch64_AM::decodeLogicalImmediate(
993                    MI.getOperand(2).getImm(),
994                    MI.getOpcode() == AArch64::ANDSWri ? 32 : 64) != 0;
995     return true;
996   }
997 
998   return false;
999 }
1000 
1001 static bool UpdateOperandRegClass(MachineInstr &Instr) {
1002   MachineBasicBlock *MBB = Instr.getParent();
1003   assert(MBB && "Can't get MachineBasicBlock here");
1004   MachineFunction *MF = MBB->getParent();
1005   assert(MF && "Can't get MachineFunction here");
1006   const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
1007   const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
1008   MachineRegisterInfo *MRI = &MF->getRegInfo();
1009 
1010   for (unsigned OpIdx = 0, EndIdx = Instr.getNumOperands(); OpIdx < EndIdx;
1011        ++OpIdx) {
1012     MachineOperand &MO = Instr.getOperand(OpIdx);
1013     const TargetRegisterClass *OpRegCstraints =
1014         Instr.getRegClassConstraint(OpIdx, TII, TRI);
1015 
1016     // If there's no constraint, there's nothing to do.
1017     if (!OpRegCstraints)
1018       continue;
1019     // If the operand is a frame index, there's nothing to do here.
1020     // A frame index operand will resolve correctly during PEI.
1021     if (MO.isFI())
1022       continue;
1023 
1024     assert(MO.isReg() &&
1025            "Operand has register constraints without being a register!");
1026 
1027     unsigned Reg = MO.getReg();
1028     if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
1029       if (!OpRegCstraints->contains(Reg))
1030         return false;
1031     } else if (!OpRegCstraints->hasSubClassEq(MRI->getRegClass(Reg)) &&
1032                !MRI->constrainRegClass(Reg, OpRegCstraints))
1033       return false;
1034   }
1035 
1036   return true;
1037 }
1038 
1039 /// \brief Return the opcode that does not set flags when possible - otherwise
1040 /// return the original opcode. The caller is responsible to do the actual
1041 /// substitution and legality checking.
1042 static unsigned convertToNonFlagSettingOpc(const MachineInstr &MI) {
1043   // Don't convert all compare instructions, because for some the zero register
1044   // encoding becomes the sp register.
1045   bool MIDefinesZeroReg = false;
1046   if (MI.definesRegister(AArch64::WZR) || MI.definesRegister(AArch64::XZR))
1047     MIDefinesZeroReg = true;
1048 
1049   switch (MI.getOpcode()) {
1050   default:
1051     return MI.getOpcode();
1052   case AArch64::ADDSWrr:
1053     return AArch64::ADDWrr;
1054   case AArch64::ADDSWri:
1055     return MIDefinesZeroReg ? AArch64::ADDSWri : AArch64::ADDWri;
1056   case AArch64::ADDSWrs:
1057     return MIDefinesZeroReg ? AArch64::ADDSWrs : AArch64::ADDWrs;
1058   case AArch64::ADDSWrx:
1059     return AArch64::ADDWrx;
1060   case AArch64::ADDSXrr:
1061     return AArch64::ADDXrr;
1062   case AArch64::ADDSXri:
1063     return MIDefinesZeroReg ? AArch64::ADDSXri : AArch64::ADDXri;
1064   case AArch64::ADDSXrs:
1065     return MIDefinesZeroReg ? AArch64::ADDSXrs : AArch64::ADDXrs;
1066   case AArch64::ADDSXrx:
1067     return AArch64::ADDXrx;
1068   case AArch64::SUBSWrr:
1069     return AArch64::SUBWrr;
1070   case AArch64::SUBSWri:
1071     return MIDefinesZeroReg ? AArch64::SUBSWri : AArch64::SUBWri;
1072   case AArch64::SUBSWrs:
1073     return MIDefinesZeroReg ? AArch64::SUBSWrs : AArch64::SUBWrs;
1074   case AArch64::SUBSWrx:
1075     return AArch64::SUBWrx;
1076   case AArch64::SUBSXrr:
1077     return AArch64::SUBXrr;
1078   case AArch64::SUBSXri:
1079     return MIDefinesZeroReg ? AArch64::SUBSXri : AArch64::SUBXri;
1080   case AArch64::SUBSXrs:
1081     return MIDefinesZeroReg ? AArch64::SUBSXrs : AArch64::SUBXrs;
1082   case AArch64::SUBSXrx:
1083     return AArch64::SUBXrx;
1084   }
1085 }
1086 
1087 enum AccessKind {
1088   AK_Write = 0x01,
1089   AK_Read  = 0x10,
1090   AK_All   = 0x11
1091 };
1092 
1093 /// True when condition flags are accessed (either by writing or reading)
1094 /// on the instruction trace starting at From and ending at To.
1095 ///
1096 /// Note: If From and To are from different blocks it's assumed CC are accessed
1097 ///       on the path.
1098 static bool areCFlagsAccessedBetweenInstrs(
1099     MachineBasicBlock::iterator From, MachineBasicBlock::iterator To,
1100     const TargetRegisterInfo *TRI, const AccessKind AccessToCheck = AK_All) {
1101   // Early exit if To is at the beginning of the BB.
1102   if (To == To->getParent()->begin())
1103     return true;
1104 
1105   // Check whether the instructions are in the same basic block
1106   // If not, assume the condition flags might get modified somewhere.
1107   if (To->getParent() != From->getParent())
1108     return true;
1109 
1110   // From must be above To.
1111   assert(std::find_if(++To.getReverse(), To->getParent()->rend(),
1112                       [From](MachineInstr &MI) {
1113                         return MI.getIterator() == From;
1114                       }) != To->getParent()->rend());
1115 
1116   // We iterate backward starting \p To until we hit \p From.
1117   for (--To; To != From; --To) {
1118     const MachineInstr &Instr = *To;
1119 
1120     if ( ((AccessToCheck & AK_Write) && Instr.modifiesRegister(AArch64::NZCV, TRI)) ||
1121          ((AccessToCheck & AK_Read)  && Instr.readsRegister(AArch64::NZCV, TRI)))
1122       return true;
1123   }
1124   return false;
1125 }
1126 
1127 /// Try to optimize a compare instruction. A compare instruction is an
1128 /// instruction which produces AArch64::NZCV. It can be truly compare instruction
1129 /// when there are no uses of its destination register.
1130 ///
1131 /// The following steps are tried in order:
1132 /// 1. Convert CmpInstr into an unconditional version.
1133 /// 2. Remove CmpInstr if above there is an instruction producing a needed
1134 ///    condition code or an instruction which can be converted into such an instruction.
1135 ///    Only comparison with zero is supported.
1136 bool AArch64InstrInfo::optimizeCompareInstr(
1137     MachineInstr &CmpInstr, unsigned SrcReg, unsigned SrcReg2, int CmpMask,
1138     int CmpValue, const MachineRegisterInfo *MRI) const {
1139   assert(CmpInstr.getParent());
1140   assert(MRI);
1141 
1142   // Replace SUBSWrr with SUBWrr if NZCV is not used.
1143   int DeadNZCVIdx = CmpInstr.findRegisterDefOperandIdx(AArch64::NZCV, true);
1144   if (DeadNZCVIdx != -1) {
1145     if (CmpInstr.definesRegister(AArch64::WZR) ||
1146         CmpInstr.definesRegister(AArch64::XZR)) {
1147       CmpInstr.eraseFromParent();
1148       return true;
1149     }
1150     unsigned Opc = CmpInstr.getOpcode();
1151     unsigned NewOpc = convertToNonFlagSettingOpc(CmpInstr);
1152     if (NewOpc == Opc)
1153       return false;
1154     const MCInstrDesc &MCID = get(NewOpc);
1155     CmpInstr.setDesc(MCID);
1156     CmpInstr.RemoveOperand(DeadNZCVIdx);
1157     bool succeeded = UpdateOperandRegClass(CmpInstr);
1158     (void)succeeded;
1159     assert(succeeded && "Some operands reg class are incompatible!");
1160     return true;
1161   }
1162 
1163   // Continue only if we have a "ri" where immediate is zero.
1164   // FIXME:CmpValue has already been converted to 0 or 1 in analyzeCompare
1165   // function.
1166   assert((CmpValue == 0 || CmpValue == 1) && "CmpValue must be 0 or 1!");
1167   if (CmpValue != 0 || SrcReg2 != 0)
1168     return false;
1169 
1170   // CmpInstr is a Compare instruction if destination register is not used.
1171   if (!MRI->use_nodbg_empty(CmpInstr.getOperand(0).getReg()))
1172     return false;
1173 
1174   return substituteCmpToZero(CmpInstr, SrcReg, MRI);
1175 }
1176 
1177 /// Get opcode of S version of Instr.
1178 /// If Instr is S version its opcode is returned.
1179 /// AArch64::INSTRUCTION_LIST_END is returned if Instr does not have S version
1180 /// or we are not interested in it.
1181 static unsigned sForm(MachineInstr &Instr) {
1182   switch (Instr.getOpcode()) {
1183   default:
1184     return AArch64::INSTRUCTION_LIST_END;
1185 
1186   case AArch64::ADDSWrr:
1187   case AArch64::ADDSWri:
1188   case AArch64::ADDSXrr:
1189   case AArch64::ADDSXri:
1190   case AArch64::SUBSWrr:
1191   case AArch64::SUBSWri:
1192   case AArch64::SUBSXrr:
1193   case AArch64::SUBSXri:
1194     return Instr.getOpcode();
1195 
1196   case AArch64::ADDWrr:    return AArch64::ADDSWrr;
1197   case AArch64::ADDWri:    return AArch64::ADDSWri;
1198   case AArch64::ADDXrr:    return AArch64::ADDSXrr;
1199   case AArch64::ADDXri:    return AArch64::ADDSXri;
1200   case AArch64::ADCWr:     return AArch64::ADCSWr;
1201   case AArch64::ADCXr:     return AArch64::ADCSXr;
1202   case AArch64::SUBWrr:    return AArch64::SUBSWrr;
1203   case AArch64::SUBWri:    return AArch64::SUBSWri;
1204   case AArch64::SUBXrr:    return AArch64::SUBSXrr;
1205   case AArch64::SUBXri:    return AArch64::SUBSXri;
1206   case AArch64::SBCWr:     return AArch64::SBCSWr;
1207   case AArch64::SBCXr:     return AArch64::SBCSXr;
1208   case AArch64::ANDWri:    return AArch64::ANDSWri;
1209   case AArch64::ANDXri:    return AArch64::ANDSXri;
1210   }
1211 }
1212 
1213 /// Check if AArch64::NZCV should be alive in successors of MBB.
1214 static bool areCFlagsAliveInSuccessors(MachineBasicBlock *MBB) {
1215   for (auto *BB : MBB->successors())
1216     if (BB->isLiveIn(AArch64::NZCV))
1217       return true;
1218   return false;
1219 }
1220 
1221 namespace {
1222 
1223 struct UsedNZCV {
1224   bool N = false;
1225   bool Z = false;
1226   bool C = false;
1227   bool V = false;
1228 
1229   UsedNZCV() = default;
1230 
1231   UsedNZCV& operator |=(const UsedNZCV& UsedFlags) {
1232     this->N |= UsedFlags.N;
1233     this->Z |= UsedFlags.Z;
1234     this->C |= UsedFlags.C;
1235     this->V |= UsedFlags.V;
1236     return *this;
1237   }
1238 };
1239 
1240 } // end anonymous namespace
1241 
1242 /// Find a condition code used by the instruction.
1243 /// Returns AArch64CC::Invalid if either the instruction does not use condition
1244 /// codes or we don't optimize CmpInstr in the presence of such instructions.
1245 static AArch64CC::CondCode findCondCodeUsedByInstr(const MachineInstr &Instr) {
1246   switch (Instr.getOpcode()) {
1247     default:
1248       return AArch64CC::Invalid;
1249 
1250     case AArch64::Bcc: {
1251       int Idx = Instr.findRegisterUseOperandIdx(AArch64::NZCV);
1252       assert(Idx >= 2);
1253       return static_cast<AArch64CC::CondCode>(Instr.getOperand(Idx - 2).getImm());
1254     }
1255 
1256     case AArch64::CSINVWr:
1257     case AArch64::CSINVXr:
1258     case AArch64::CSINCWr:
1259     case AArch64::CSINCXr:
1260     case AArch64::CSELWr:
1261     case AArch64::CSELXr:
1262     case AArch64::CSNEGWr:
1263     case AArch64::CSNEGXr:
1264     case AArch64::FCSELSrrr:
1265     case AArch64::FCSELDrrr: {
1266       int Idx = Instr.findRegisterUseOperandIdx(AArch64::NZCV);
1267       assert(Idx >= 1);
1268       return static_cast<AArch64CC::CondCode>(Instr.getOperand(Idx - 1).getImm());
1269     }
1270   }
1271 }
1272 
1273 static UsedNZCV getUsedNZCV(AArch64CC::CondCode CC) {
1274   assert(CC != AArch64CC::Invalid);
1275   UsedNZCV UsedFlags;
1276   switch (CC) {
1277     default:
1278       break;
1279 
1280     case AArch64CC::EQ: // Z set
1281     case AArch64CC::NE: // Z clear
1282       UsedFlags.Z = true;
1283       break;
1284 
1285     case AArch64CC::HI: // Z clear and C set
1286     case AArch64CC::LS: // Z set   or  C clear
1287       UsedFlags.Z = true;
1288       LLVM_FALLTHROUGH;
1289     case AArch64CC::HS: // C set
1290     case AArch64CC::LO: // C clear
1291       UsedFlags.C = true;
1292       break;
1293 
1294     case AArch64CC::MI: // N set
1295     case AArch64CC::PL: // N clear
1296       UsedFlags.N = true;
1297       break;
1298 
1299     case AArch64CC::VS: // V set
1300     case AArch64CC::VC: // V clear
1301       UsedFlags.V = true;
1302       break;
1303 
1304     case AArch64CC::GT: // Z clear, N and V the same
1305     case AArch64CC::LE: // Z set,   N and V differ
1306       UsedFlags.Z = true;
1307       LLVM_FALLTHROUGH;
1308     case AArch64CC::GE: // N and V the same
1309     case AArch64CC::LT: // N and V differ
1310       UsedFlags.N = true;
1311       UsedFlags.V = true;
1312       break;
1313   }
1314   return UsedFlags;
1315 }
1316 
1317 static bool isADDSRegImm(unsigned Opcode) {
1318   return Opcode == AArch64::ADDSWri || Opcode == AArch64::ADDSXri;
1319 }
1320 
1321 static bool isSUBSRegImm(unsigned Opcode) {
1322   return Opcode == AArch64::SUBSWri || Opcode == AArch64::SUBSXri;
1323 }
1324 
1325 /// Check if CmpInstr can be substituted by MI.
1326 ///
1327 /// CmpInstr can be substituted:
1328 /// - CmpInstr is either 'ADDS %vreg, 0' or 'SUBS %vreg, 0'
1329 /// - and, MI and CmpInstr are from the same MachineBB
1330 /// - and, condition flags are not alive in successors of the CmpInstr parent
1331 /// - and, if MI opcode is the S form there must be no defs of flags between
1332 ///        MI and CmpInstr
1333 ///        or if MI opcode is not the S form there must be neither defs of flags
1334 ///        nor uses of flags between MI and CmpInstr.
1335 /// - and  C/V flags are not used after CmpInstr
1336 static bool canInstrSubstituteCmpInstr(MachineInstr *MI, MachineInstr *CmpInstr,
1337     const TargetRegisterInfo *TRI) {
1338   assert(MI);
1339   assert(sForm(*MI) != AArch64::INSTRUCTION_LIST_END);
1340   assert(CmpInstr);
1341 
1342   const unsigned CmpOpcode = CmpInstr->getOpcode();
1343   if (!isADDSRegImm(CmpOpcode) && !isSUBSRegImm(CmpOpcode))
1344     return false;
1345 
1346   if (MI->getParent() != CmpInstr->getParent())
1347     return false;
1348 
1349   if (areCFlagsAliveInSuccessors(CmpInstr->getParent()))
1350     return false;
1351 
1352   AccessKind AccessToCheck = AK_Write;
1353   if (sForm(*MI) != MI->getOpcode())
1354     AccessToCheck = AK_All;
1355   if (areCFlagsAccessedBetweenInstrs(MI, CmpInstr, TRI, AccessToCheck))
1356     return false;
1357 
1358   UsedNZCV NZCVUsedAfterCmp;
1359   for (auto I = std::next(CmpInstr->getIterator()), E = CmpInstr->getParent()->instr_end();
1360        I != E; ++I) {
1361     const MachineInstr &Instr = *I;
1362     if (Instr.readsRegister(AArch64::NZCV, TRI)) {
1363       AArch64CC::CondCode CC = findCondCodeUsedByInstr(Instr);
1364       if (CC == AArch64CC::Invalid) // Unsupported conditional instruction
1365         return false;
1366       NZCVUsedAfterCmp |= getUsedNZCV(CC);
1367     }
1368 
1369     if (Instr.modifiesRegister(AArch64::NZCV, TRI))
1370       break;
1371   }
1372 
1373   return !NZCVUsedAfterCmp.C && !NZCVUsedAfterCmp.V;
1374 }
1375 
1376 /// Substitute an instruction comparing to zero with another instruction
1377 /// which produces needed condition flags.
1378 ///
1379 /// Return true on success.
1380 bool AArch64InstrInfo::substituteCmpToZero(
1381     MachineInstr &CmpInstr, unsigned SrcReg,
1382     const MachineRegisterInfo *MRI) const {
1383   assert(MRI);
1384   // Get the unique definition of SrcReg.
1385   MachineInstr *MI = MRI->getUniqueVRegDef(SrcReg);
1386   if (!MI)
1387     return false;
1388 
1389   const TargetRegisterInfo *TRI = &getRegisterInfo();
1390 
1391   unsigned NewOpc = sForm(*MI);
1392   if (NewOpc == AArch64::INSTRUCTION_LIST_END)
1393     return false;
1394 
1395   if (!canInstrSubstituteCmpInstr(MI, &CmpInstr, TRI))
1396     return false;
1397 
1398   // Update the instruction to set NZCV.
1399   MI->setDesc(get(NewOpc));
1400   CmpInstr.eraseFromParent();
1401   bool succeeded = UpdateOperandRegClass(*MI);
1402   (void)succeeded;
1403   assert(succeeded && "Some operands reg class are incompatible!");
1404   MI->addRegisterDefined(AArch64::NZCV, TRI);
1405   return true;
1406 }
1407 
1408 bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
1409   if (MI.getOpcode() != TargetOpcode::LOAD_STACK_GUARD)
1410     return false;
1411 
1412   MachineBasicBlock &MBB = *MI.getParent();
1413   DebugLoc DL = MI.getDebugLoc();
1414   unsigned Reg = MI.getOperand(0).getReg();
1415   const GlobalValue *GV =
1416       cast<GlobalValue>((*MI.memoperands_begin())->getValue());
1417   const TargetMachine &TM = MBB.getParent()->getTarget();
1418   unsigned char OpFlags = Subtarget.ClassifyGlobalReference(GV, TM);
1419   const unsigned char MO_NC = AArch64II::MO_NC;
1420 
1421   if ((OpFlags & AArch64II::MO_GOT) != 0) {
1422     BuildMI(MBB, MI, DL, get(AArch64::LOADgot), Reg)
1423         .addGlobalAddress(GV, 0, AArch64II::MO_GOT);
1424     BuildMI(MBB, MI, DL, get(AArch64::LDRXui), Reg)
1425         .addReg(Reg, RegState::Kill)
1426         .addImm(0)
1427         .addMemOperand(*MI.memoperands_begin());
1428   } else if (TM.getCodeModel() == CodeModel::Large) {
1429     BuildMI(MBB, MI, DL, get(AArch64::MOVZXi), Reg)
1430         .addGlobalAddress(GV, 0, AArch64II::MO_G0 | MO_NC).addImm(0);
1431     BuildMI(MBB, MI, DL, get(AArch64::MOVKXi), Reg)
1432         .addReg(Reg, RegState::Kill)
1433         .addGlobalAddress(GV, 0, AArch64II::MO_G1 | MO_NC).addImm(16);
1434     BuildMI(MBB, MI, DL, get(AArch64::MOVKXi), Reg)
1435         .addReg(Reg, RegState::Kill)
1436         .addGlobalAddress(GV, 0, AArch64II::MO_G2 | MO_NC).addImm(32);
1437     BuildMI(MBB, MI, DL, get(AArch64::MOVKXi), Reg)
1438         .addReg(Reg, RegState::Kill)
1439         .addGlobalAddress(GV, 0, AArch64II::MO_G3).addImm(48);
1440     BuildMI(MBB, MI, DL, get(AArch64::LDRXui), Reg)
1441         .addReg(Reg, RegState::Kill)
1442         .addImm(0)
1443         .addMemOperand(*MI.memoperands_begin());
1444   } else {
1445     BuildMI(MBB, MI, DL, get(AArch64::ADRP), Reg)
1446         .addGlobalAddress(GV, 0, OpFlags | AArch64II::MO_PAGE);
1447     unsigned char LoFlags = OpFlags | AArch64II::MO_PAGEOFF | MO_NC;
1448     BuildMI(MBB, MI, DL, get(AArch64::LDRXui), Reg)
1449         .addReg(Reg, RegState::Kill)
1450         .addGlobalAddress(GV, 0, LoFlags)
1451         .addMemOperand(*MI.memoperands_begin());
1452   }
1453 
1454   MBB.erase(MI);
1455 
1456   return true;
1457 }
1458 
1459 /// Return true if this is this instruction has a non-zero immediate
1460 bool AArch64InstrInfo::hasShiftedReg(const MachineInstr &MI) const {
1461   switch (MI.getOpcode()) {
1462   default:
1463     break;
1464   case AArch64::ADDSWrs:
1465   case AArch64::ADDSXrs:
1466   case AArch64::ADDWrs:
1467   case AArch64::ADDXrs:
1468   case AArch64::ANDSWrs:
1469   case AArch64::ANDSXrs:
1470   case AArch64::ANDWrs:
1471   case AArch64::ANDXrs:
1472   case AArch64::BICSWrs:
1473   case AArch64::BICSXrs:
1474   case AArch64::BICWrs:
1475   case AArch64::BICXrs:
1476   case AArch64::EONWrs:
1477   case AArch64::EONXrs:
1478   case AArch64::EORWrs:
1479   case AArch64::EORXrs:
1480   case AArch64::ORNWrs:
1481   case AArch64::ORNXrs:
1482   case AArch64::ORRWrs:
1483   case AArch64::ORRXrs:
1484   case AArch64::SUBSWrs:
1485   case AArch64::SUBSXrs:
1486   case AArch64::SUBWrs:
1487   case AArch64::SUBXrs:
1488     if (MI.getOperand(3).isImm()) {
1489       unsigned val = MI.getOperand(3).getImm();
1490       return (val != 0);
1491     }
1492     break;
1493   }
1494   return false;
1495 }
1496 
1497 /// Return true if this is this instruction has a non-zero immediate
1498 bool AArch64InstrInfo::hasExtendedReg(const MachineInstr &MI) const {
1499   switch (MI.getOpcode()) {
1500   default:
1501     break;
1502   case AArch64::ADDSWrx:
1503   case AArch64::ADDSXrx:
1504   case AArch64::ADDSXrx64:
1505   case AArch64::ADDWrx:
1506   case AArch64::ADDXrx:
1507   case AArch64::ADDXrx64:
1508   case AArch64::SUBSWrx:
1509   case AArch64::SUBSXrx:
1510   case AArch64::SUBSXrx64:
1511   case AArch64::SUBWrx:
1512   case AArch64::SUBXrx:
1513   case AArch64::SUBXrx64:
1514     if (MI.getOperand(3).isImm()) {
1515       unsigned val = MI.getOperand(3).getImm();
1516       return (val != 0);
1517     }
1518     break;
1519   }
1520 
1521   return false;
1522 }
1523 
1524 // Return true if this instruction simply sets its single destination register
1525 // to zero. This is equivalent to a register rename of the zero-register.
1526 bool AArch64InstrInfo::isGPRZero(const MachineInstr &MI) const {
1527   switch (MI.getOpcode()) {
1528   default:
1529     break;
1530   case AArch64::MOVZWi:
1531   case AArch64::MOVZXi: // movz Rd, #0 (LSL #0)
1532     if (MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 0) {
1533       assert(MI.getDesc().getNumOperands() == 3 &&
1534              MI.getOperand(2).getImm() == 0 && "invalid MOVZi operands");
1535       return true;
1536     }
1537     break;
1538   case AArch64::ANDWri: // and Rd, Rzr, #imm
1539     return MI.getOperand(1).getReg() == AArch64::WZR;
1540   case AArch64::ANDXri:
1541     return MI.getOperand(1).getReg() == AArch64::XZR;
1542   case TargetOpcode::COPY:
1543     return MI.getOperand(1).getReg() == AArch64::WZR;
1544   }
1545   return false;
1546 }
1547 
1548 // Return true if this instruction simply renames a general register without
1549 // modifying bits.
1550 bool AArch64InstrInfo::isGPRCopy(const MachineInstr &MI) const {
1551   switch (MI.getOpcode()) {
1552   default:
1553     break;
1554   case TargetOpcode::COPY: {
1555     // GPR32 copies will by lowered to ORRXrs
1556     unsigned DstReg = MI.getOperand(0).getReg();
1557     return (AArch64::GPR32RegClass.contains(DstReg) ||
1558             AArch64::GPR64RegClass.contains(DstReg));
1559   }
1560   case AArch64::ORRXrs: // orr Xd, Xzr, Xm (LSL #0)
1561     if (MI.getOperand(1).getReg() == AArch64::XZR) {
1562       assert(MI.getDesc().getNumOperands() == 4 &&
1563              MI.getOperand(3).getImm() == 0 && "invalid ORRrs operands");
1564       return true;
1565     }
1566     break;
1567   case AArch64::ADDXri: // add Xd, Xn, #0 (LSL #0)
1568     if (MI.getOperand(2).getImm() == 0) {
1569       assert(MI.getDesc().getNumOperands() == 4 &&
1570              MI.getOperand(3).getImm() == 0 && "invalid ADDXri operands");
1571       return true;
1572     }
1573     break;
1574   }
1575   return false;
1576 }
1577 
1578 // Return true if this instruction simply renames a general register without
1579 // modifying bits.
1580 bool AArch64InstrInfo::isFPRCopy(const MachineInstr &MI) const {
1581   switch (MI.getOpcode()) {
1582   default:
1583     break;
1584   case TargetOpcode::COPY: {
1585     // FPR64 copies will by lowered to ORR.16b
1586     unsigned DstReg = MI.getOperand(0).getReg();
1587     return (AArch64::FPR64RegClass.contains(DstReg) ||
1588             AArch64::FPR128RegClass.contains(DstReg));
1589   }
1590   case AArch64::ORRv16i8:
1591     if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
1592       assert(MI.getDesc().getNumOperands() == 3 && MI.getOperand(0).isReg() &&
1593              "invalid ORRv16i8 operands");
1594       return true;
1595     }
1596     break;
1597   }
1598   return false;
1599 }
1600 
1601 unsigned AArch64InstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
1602                                                int &FrameIndex) const {
1603   switch (MI.getOpcode()) {
1604   default:
1605     break;
1606   case AArch64::LDRWui:
1607   case AArch64::LDRXui:
1608   case AArch64::LDRBui:
1609   case AArch64::LDRHui:
1610   case AArch64::LDRSui:
1611   case AArch64::LDRDui:
1612   case AArch64::LDRQui:
1613     if (MI.getOperand(0).getSubReg() == 0 && MI.getOperand(1).isFI() &&
1614         MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0) {
1615       FrameIndex = MI.getOperand(1).getIndex();
1616       return MI.getOperand(0).getReg();
1617     }
1618     break;
1619   }
1620 
1621   return 0;
1622 }
1623 
1624 unsigned AArch64InstrInfo::isStoreToStackSlot(const MachineInstr &MI,
1625                                               int &FrameIndex) const {
1626   switch (MI.getOpcode()) {
1627   default:
1628     break;
1629   case AArch64::STRWui:
1630   case AArch64::STRXui:
1631   case AArch64::STRBui:
1632   case AArch64::STRHui:
1633   case AArch64::STRSui:
1634   case AArch64::STRDui:
1635   case AArch64::STRQui:
1636     if (MI.getOperand(0).getSubReg() == 0 && MI.getOperand(1).isFI() &&
1637         MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0) {
1638       FrameIndex = MI.getOperand(1).getIndex();
1639       return MI.getOperand(0).getReg();
1640     }
1641     break;
1642   }
1643   return 0;
1644 }
1645 
1646 /// Return true if this is load/store scales or extends its register offset.
1647 /// This refers to scaling a dynamic index as opposed to scaled immediates.
1648 /// MI should be a memory op that allows scaled addressing.
1649 bool AArch64InstrInfo::isScaledAddr(const MachineInstr &MI) const {
1650   switch (MI.getOpcode()) {
1651   default:
1652     break;
1653   case AArch64::LDRBBroW:
1654   case AArch64::LDRBroW:
1655   case AArch64::LDRDroW:
1656   case AArch64::LDRHHroW:
1657   case AArch64::LDRHroW:
1658   case AArch64::LDRQroW:
1659   case AArch64::LDRSBWroW:
1660   case AArch64::LDRSBXroW:
1661   case AArch64::LDRSHWroW:
1662   case AArch64::LDRSHXroW:
1663   case AArch64::LDRSWroW:
1664   case AArch64::LDRSroW:
1665   case AArch64::LDRWroW:
1666   case AArch64::LDRXroW:
1667   case AArch64::STRBBroW:
1668   case AArch64::STRBroW:
1669   case AArch64::STRDroW:
1670   case AArch64::STRHHroW:
1671   case AArch64::STRHroW:
1672   case AArch64::STRQroW:
1673   case AArch64::STRSroW:
1674   case AArch64::STRWroW:
1675   case AArch64::STRXroW:
1676   case AArch64::LDRBBroX:
1677   case AArch64::LDRBroX:
1678   case AArch64::LDRDroX:
1679   case AArch64::LDRHHroX:
1680   case AArch64::LDRHroX:
1681   case AArch64::LDRQroX:
1682   case AArch64::LDRSBWroX:
1683   case AArch64::LDRSBXroX:
1684   case AArch64::LDRSHWroX:
1685   case AArch64::LDRSHXroX:
1686   case AArch64::LDRSWroX:
1687   case AArch64::LDRSroX:
1688   case AArch64::LDRWroX:
1689   case AArch64::LDRXroX:
1690   case AArch64::STRBBroX:
1691   case AArch64::STRBroX:
1692   case AArch64::STRDroX:
1693   case AArch64::STRHHroX:
1694   case AArch64::STRHroX:
1695   case AArch64::STRQroX:
1696   case AArch64::STRSroX:
1697   case AArch64::STRWroX:
1698   case AArch64::STRXroX:
1699 
1700     unsigned Val = MI.getOperand(3).getImm();
1701     AArch64_AM::ShiftExtendType ExtType = AArch64_AM::getMemExtendType(Val);
1702     return (ExtType != AArch64_AM::UXTX) || AArch64_AM::getMemDoShift(Val);
1703   }
1704   return false;
1705 }
1706 
1707 /// Check all MachineMemOperands for a hint to suppress pairing.
1708 bool AArch64InstrInfo::isLdStPairSuppressed(const MachineInstr &MI) const {
1709   return llvm::any_of(MI.memoperands(), [](MachineMemOperand *MMO) {
1710     return MMO->getFlags() & MOSuppressPair;
1711   });
1712 }
1713 
1714 /// Set a flag on the first MachineMemOperand to suppress pairing.
1715 void AArch64InstrInfo::suppressLdStPair(MachineInstr &MI) const {
1716   if (MI.memoperands_empty())
1717     return;
1718   (*MI.memoperands_begin())->setFlags(MOSuppressPair);
1719 }
1720 
1721 /// Check all MachineMemOperands for a hint that the load/store is strided.
1722 bool AArch64InstrInfo::isStridedAccess(const MachineInstr &MI) const {
1723   return llvm::any_of(MI.memoperands(), [](MachineMemOperand *MMO) {
1724     return MMO->getFlags() & MOStridedAccess;
1725   });
1726 }
1727 
1728 bool AArch64InstrInfo::isUnscaledLdSt(unsigned Opc) const {
1729   switch (Opc) {
1730   default:
1731     return false;
1732   case AArch64::STURSi:
1733   case AArch64::STURDi:
1734   case AArch64::STURQi:
1735   case AArch64::STURBBi:
1736   case AArch64::STURHHi:
1737   case AArch64::STURWi:
1738   case AArch64::STURXi:
1739   case AArch64::LDURSi:
1740   case AArch64::LDURDi:
1741   case AArch64::LDURQi:
1742   case AArch64::LDURWi:
1743   case AArch64::LDURXi:
1744   case AArch64::LDURSWi:
1745   case AArch64::LDURHHi:
1746   case AArch64::LDURBBi:
1747   case AArch64::LDURSBWi:
1748   case AArch64::LDURSHWi:
1749     return true;
1750   }
1751 }
1752 
1753 bool AArch64InstrInfo::isUnscaledLdSt(MachineInstr &MI) const {
1754   return isUnscaledLdSt(MI.getOpcode());
1755 }
1756 
1757 // Is this a candidate for ld/st merging or pairing?  For example, we don't
1758 // touch volatiles or load/stores that have a hint to avoid pair formation.
1759 bool AArch64InstrInfo::isCandidateToMergeOrPair(MachineInstr &MI) const {
1760   // If this is a volatile load/store, don't mess with it.
1761   if (MI.hasOrderedMemoryRef())
1762     return false;
1763 
1764   // Make sure this is a reg+imm (as opposed to an address reloc).
1765   assert(MI.getOperand(1).isReg() && "Expected a reg operand.");
1766   if (!MI.getOperand(2).isImm())
1767     return false;
1768 
1769   // Can't merge/pair if the instruction modifies the base register.
1770   // e.g., ldr x0, [x0]
1771   unsigned BaseReg = MI.getOperand(1).getReg();
1772   const TargetRegisterInfo *TRI = &getRegisterInfo();
1773   if (MI.modifiesRegister(BaseReg, TRI))
1774     return false;
1775 
1776   // Check if this load/store has a hint to avoid pair formation.
1777   // MachineMemOperands hints are set by the AArch64StorePairSuppress pass.
1778   if (isLdStPairSuppressed(MI))
1779     return false;
1780 
1781   // On some CPUs quad load/store pairs are slower than two single load/stores.
1782   if (Subtarget.isPaired128Slow()) {
1783     switch (MI.getOpcode()) {
1784     default:
1785       break;
1786     case AArch64::LDURQi:
1787     case AArch64::STURQi:
1788     case AArch64::LDRQui:
1789     case AArch64::STRQui:
1790       return false;
1791     }
1792   }
1793 
1794   return true;
1795 }
1796 
1797 bool AArch64InstrInfo::getMemOpBaseRegImmOfs(
1798     MachineInstr &LdSt, unsigned &BaseReg, int64_t &Offset,
1799     const TargetRegisterInfo *TRI) const {
1800   unsigned Width;
1801   return getMemOpBaseRegImmOfsWidth(LdSt, BaseReg, Offset, Width, TRI);
1802 }
1803 
1804 bool AArch64InstrInfo::getMemOpBaseRegImmOfsWidth(
1805     MachineInstr &LdSt, unsigned &BaseReg, int64_t &Offset, unsigned &Width,
1806     const TargetRegisterInfo *TRI) const {
1807   assert(LdSt.mayLoadOrStore() && "Expected a memory operation.");
1808   // Handle only loads/stores with base register followed by immediate offset.
1809   if (LdSt.getNumExplicitOperands() == 3) {
1810     // Non-paired instruction (e.g., ldr x1, [x0, #8]).
1811     if (!LdSt.getOperand(1).isReg() || !LdSt.getOperand(2).isImm())
1812       return false;
1813   } else if (LdSt.getNumExplicitOperands() == 4) {
1814     // Paired instruction (e.g., ldp x1, x2, [x0, #8]).
1815     if (!LdSt.getOperand(1).isReg() || !LdSt.getOperand(2).isReg() ||
1816         !LdSt.getOperand(3).isImm())
1817       return false;
1818   } else
1819     return false;
1820 
1821   // Get the scaling factor for the instruction and set the width for the
1822   // instruction.
1823   unsigned Scale = 0;
1824   int64_t Dummy1, Dummy2;
1825 
1826   // If this returns false, then it's an instruction we don't want to handle.
1827   if (!getMemOpInfo(LdSt.getOpcode(), Scale, Width, Dummy1, Dummy2))
1828     return false;
1829 
1830   // Compute the offset. Offset is calculated as the immediate operand
1831   // multiplied by the scaling factor. Unscaled instructions have scaling factor
1832   // set to 1.
1833   if (LdSt.getNumExplicitOperands() == 3) {
1834     BaseReg = LdSt.getOperand(1).getReg();
1835     Offset = LdSt.getOperand(2).getImm() * Scale;
1836   } else {
1837     assert(LdSt.getNumExplicitOperands() == 4 && "invalid number of operands");
1838     BaseReg = LdSt.getOperand(2).getReg();
1839     Offset = LdSt.getOperand(3).getImm() * Scale;
1840   }
1841   return true;
1842 }
1843 
1844 MachineOperand&
1845 AArch64InstrInfo::getMemOpBaseRegImmOfsOffsetOperand(MachineInstr &LdSt) const {
1846   assert(LdSt.mayLoadOrStore() && "Expected a memory operation.");
1847   MachineOperand &OfsOp = LdSt.getOperand(LdSt.getNumExplicitOperands()-1);
1848   assert(OfsOp.isImm() && "Offset operand wasn't immediate.");
1849   return OfsOp;
1850 }
1851 
1852 bool AArch64InstrInfo::getMemOpInfo(unsigned Opcode, unsigned &Scale,
1853                                     unsigned &Width, int64_t &MinOffset,
1854                                     int64_t &MaxOffset) const {
1855   switch (Opcode) {
1856   // Not a memory operation or something we want to handle.
1857   default:
1858     Scale = Width = 0;
1859     MinOffset = MaxOffset = 0;
1860     return false;
1861   case AArch64::STRWpost:
1862   case AArch64::LDRWpost:
1863     Width = 32;
1864     Scale = 4;
1865     MinOffset = -256;
1866     MaxOffset = 255;
1867     break;
1868   case AArch64::LDURQi:
1869   case AArch64::STURQi:
1870     Width = 16;
1871     Scale = 1;
1872     MinOffset = -256;
1873     MaxOffset = 255;
1874     break;
1875   case AArch64::LDURXi:
1876   case AArch64::LDURDi:
1877   case AArch64::STURXi:
1878   case AArch64::STURDi:
1879     Width = 8;
1880     Scale = 1;
1881     MinOffset = -256;
1882     MaxOffset = 255;
1883     break;
1884   case AArch64::LDURWi:
1885   case AArch64::LDURSi:
1886   case AArch64::LDURSWi:
1887   case AArch64::STURWi:
1888   case AArch64::STURSi:
1889     Width = 4;
1890     Scale = 1;
1891     MinOffset = -256;
1892     MaxOffset = 255;
1893     break;
1894   case AArch64::LDURHi:
1895   case AArch64::LDURHHi:
1896   case AArch64::LDURSHXi:
1897   case AArch64::LDURSHWi:
1898   case AArch64::STURHi:
1899   case AArch64::STURHHi:
1900     Width = 2;
1901     Scale = 1;
1902     MinOffset = -256;
1903     MaxOffset = 255;
1904     break;
1905   case AArch64::LDURBi:
1906   case AArch64::LDURBBi:
1907   case AArch64::LDURSBXi:
1908   case AArch64::LDURSBWi:
1909   case AArch64::STURBi:
1910   case AArch64::STURBBi:
1911     Width = 1;
1912     Scale = 1;
1913     MinOffset = -256;
1914     MaxOffset = 255;
1915     break;
1916   case AArch64::LDPQi:
1917   case AArch64::LDNPQi:
1918   case AArch64::STPQi:
1919   case AArch64::STNPQi:
1920     Scale = 16;
1921     Width = 32;
1922     MinOffset = -64;
1923     MaxOffset = 63;
1924     break;
1925   case AArch64::LDRQui:
1926   case AArch64::STRQui:
1927     Scale = Width = 16;
1928     MinOffset = 0;
1929     MaxOffset = 4095;
1930     break;
1931   case AArch64::LDPXi:
1932   case AArch64::LDPDi:
1933   case AArch64::LDNPXi:
1934   case AArch64::LDNPDi:
1935   case AArch64::STPXi:
1936   case AArch64::STPDi:
1937   case AArch64::STNPXi:
1938   case AArch64::STNPDi:
1939     Scale = 8;
1940     Width = 16;
1941     MinOffset = -64;
1942     MaxOffset = 63;
1943     break;
1944   case AArch64::LDRXui:
1945   case AArch64::LDRDui:
1946   case AArch64::STRXui:
1947   case AArch64::STRDui:
1948     Scale = Width = 8;
1949     MinOffset = 0;
1950     MaxOffset = 4095;
1951     break;
1952   case AArch64::LDPWi:
1953   case AArch64::LDPSi:
1954   case AArch64::LDNPWi:
1955   case AArch64::LDNPSi:
1956   case AArch64::STPWi:
1957   case AArch64::STPSi:
1958   case AArch64::STNPWi:
1959   case AArch64::STNPSi:
1960     Scale = 4;
1961     Width = 8;
1962     MinOffset = -64;
1963     MaxOffset = 63;
1964     break;
1965   case AArch64::LDRWui:
1966   case AArch64::LDRSui:
1967   case AArch64::LDRSWui:
1968   case AArch64::STRWui:
1969   case AArch64::STRSui:
1970     Scale = Width = 4;
1971     MinOffset = 0;
1972     MaxOffset = 4095;
1973     break;
1974   case AArch64::LDRHui:
1975   case AArch64::LDRHHui:
1976   case AArch64::STRHui:
1977   case AArch64::STRHHui:
1978     Scale = Width = 2;
1979     MinOffset = 0;
1980     MaxOffset = 4095;
1981     break;
1982   case AArch64::LDRBui:
1983   case AArch64::LDRBBui:
1984   case AArch64::STRBui:
1985   case AArch64::STRBBui:
1986     Scale = Width = 1;
1987     MinOffset = 0;
1988     MaxOffset = 4095;
1989     break;
1990   }
1991 
1992   return true;
1993 }
1994 
1995 // Scale the unscaled offsets.  Returns false if the unscaled offset can't be
1996 // scaled.
1997 static bool scaleOffset(unsigned Opc, int64_t &Offset) {
1998   unsigned OffsetStride = 1;
1999   switch (Opc) {
2000   default:
2001     return false;
2002   case AArch64::LDURQi:
2003   case AArch64::STURQi:
2004     OffsetStride = 16;
2005     break;
2006   case AArch64::LDURXi:
2007   case AArch64::LDURDi:
2008   case AArch64::STURXi:
2009   case AArch64::STURDi:
2010     OffsetStride = 8;
2011     break;
2012   case AArch64::LDURWi:
2013   case AArch64::LDURSi:
2014   case AArch64::LDURSWi:
2015   case AArch64::STURWi:
2016   case AArch64::STURSi:
2017     OffsetStride = 4;
2018     break;
2019   }
2020   // If the byte-offset isn't a multiple of the stride, we can't scale this
2021   // offset.
2022   if (Offset % OffsetStride != 0)
2023     return false;
2024 
2025   // Convert the byte-offset used by unscaled into an "element" offset used
2026   // by the scaled pair load/store instructions.
2027   Offset /= OffsetStride;
2028   return true;
2029 }
2030 
2031 static bool canPairLdStOpc(unsigned FirstOpc, unsigned SecondOpc) {
2032   if (FirstOpc == SecondOpc)
2033     return true;
2034   // We can also pair sign-ext and zero-ext instructions.
2035   switch (FirstOpc) {
2036   default:
2037     return false;
2038   case AArch64::LDRWui:
2039   case AArch64::LDURWi:
2040     return SecondOpc == AArch64::LDRSWui || SecondOpc == AArch64::LDURSWi;
2041   case AArch64::LDRSWui:
2042   case AArch64::LDURSWi:
2043     return SecondOpc == AArch64::LDRWui || SecondOpc == AArch64::LDURWi;
2044   }
2045   // These instructions can't be paired based on their opcodes.
2046   return false;
2047 }
2048 
2049 /// Detect opportunities for ldp/stp formation.
2050 ///
2051 /// Only called for LdSt for which getMemOpBaseRegImmOfs returns true.
2052 bool AArch64InstrInfo::shouldClusterMemOps(MachineInstr &FirstLdSt,
2053                                            MachineInstr &SecondLdSt,
2054                                            unsigned NumLoads) const {
2055   // Only cluster up to a single pair.
2056   if (NumLoads > 1)
2057     return false;
2058 
2059   if (!isPairableLdStInst(FirstLdSt) || !isPairableLdStInst(SecondLdSt))
2060     return false;
2061 
2062   // Can we pair these instructions based on their opcodes?
2063   unsigned FirstOpc = FirstLdSt.getOpcode();
2064   unsigned SecondOpc = SecondLdSt.getOpcode();
2065   if (!canPairLdStOpc(FirstOpc, SecondOpc))
2066     return false;
2067 
2068   // Can't merge volatiles or load/stores that have a hint to avoid pair
2069   // formation, for example.
2070   if (!isCandidateToMergeOrPair(FirstLdSt) ||
2071       !isCandidateToMergeOrPair(SecondLdSt))
2072     return false;
2073 
2074   // isCandidateToMergeOrPair guarantees that operand 2 is an immediate.
2075   int64_t Offset1 = FirstLdSt.getOperand(2).getImm();
2076   if (isUnscaledLdSt(FirstOpc) && !scaleOffset(FirstOpc, Offset1))
2077     return false;
2078 
2079   int64_t Offset2 = SecondLdSt.getOperand(2).getImm();
2080   if (isUnscaledLdSt(SecondOpc) && !scaleOffset(SecondOpc, Offset2))
2081     return false;
2082 
2083   // Pairwise instructions have a 7-bit signed offset field.
2084   if (Offset1 > 63 || Offset1 < -64)
2085     return false;
2086 
2087   // The caller should already have ordered First/SecondLdSt by offset.
2088   assert(Offset1 <= Offset2 && "Caller should have ordered offsets.");
2089   return Offset1 + 1 == Offset2;
2090 }
2091 
2092 MachineInstr *AArch64InstrInfo::emitFrameIndexDebugValue(
2093     MachineFunction &MF, int FrameIx, uint64_t Offset, const MDNode *Var,
2094     const MDNode *Expr, const DebugLoc &DL) const {
2095   MachineInstrBuilder MIB = BuildMI(MF, DL, get(AArch64::DBG_VALUE))
2096                                 .addFrameIndex(FrameIx)
2097                                 .addImm(0)
2098                                 .addImm(Offset)
2099                                 .addMetadata(Var)
2100                                 .addMetadata(Expr);
2101   return &*MIB;
2102 }
2103 
2104 static const MachineInstrBuilder &AddSubReg(const MachineInstrBuilder &MIB,
2105                                             unsigned Reg, unsigned SubIdx,
2106                                             unsigned State,
2107                                             const TargetRegisterInfo *TRI) {
2108   if (!SubIdx)
2109     return MIB.addReg(Reg, State);
2110 
2111   if (TargetRegisterInfo::isPhysicalRegister(Reg))
2112     return MIB.addReg(TRI->getSubReg(Reg, SubIdx), State);
2113   return MIB.addReg(Reg, State, SubIdx);
2114 }
2115 
2116 static bool forwardCopyWillClobberTuple(unsigned DestReg, unsigned SrcReg,
2117                                         unsigned NumRegs) {
2118   // We really want the positive remainder mod 32 here, that happens to be
2119   // easily obtainable with a mask.
2120   return ((DestReg - SrcReg) & 0x1f) < NumRegs;
2121 }
2122 
2123 void AArch64InstrInfo::copyPhysRegTuple(
2124     MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL,
2125     unsigned DestReg, unsigned SrcReg, bool KillSrc, unsigned Opcode,
2126     ArrayRef<unsigned> Indices) const {
2127   assert(Subtarget.hasNEON() &&
2128          "Unexpected register copy without NEON");
2129   const TargetRegisterInfo *TRI = &getRegisterInfo();
2130   uint16_t DestEncoding = TRI->getEncodingValue(DestReg);
2131   uint16_t SrcEncoding = TRI->getEncodingValue(SrcReg);
2132   unsigned NumRegs = Indices.size();
2133 
2134   int SubReg = 0, End = NumRegs, Incr = 1;
2135   if (forwardCopyWillClobberTuple(DestEncoding, SrcEncoding, NumRegs)) {
2136     SubReg = NumRegs - 1;
2137     End = -1;
2138     Incr = -1;
2139   }
2140 
2141   for (; SubReg != End; SubReg += Incr) {
2142     const MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(Opcode));
2143     AddSubReg(MIB, DestReg, Indices[SubReg], RegState::Define, TRI);
2144     AddSubReg(MIB, SrcReg, Indices[SubReg], 0, TRI);
2145     AddSubReg(MIB, SrcReg, Indices[SubReg], getKillRegState(KillSrc), TRI);
2146   }
2147 }
2148 
2149 void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
2150                                    MachineBasicBlock::iterator I,
2151                                    const DebugLoc &DL, unsigned DestReg,
2152                                    unsigned SrcReg, bool KillSrc) const {
2153   if (AArch64::GPR32spRegClass.contains(DestReg) &&
2154       (AArch64::GPR32spRegClass.contains(SrcReg) || SrcReg == AArch64::WZR)) {
2155     const TargetRegisterInfo *TRI = &getRegisterInfo();
2156 
2157     if (DestReg == AArch64::WSP || SrcReg == AArch64::WSP) {
2158       // If either operand is WSP, expand to ADD #0.
2159       if (Subtarget.hasZeroCycleRegMove()) {
2160         // Cyclone recognizes "ADD Xd, Xn, #0" as a zero-cycle register move.
2161         unsigned DestRegX = TRI->getMatchingSuperReg(DestReg, AArch64::sub_32,
2162                                                      &AArch64::GPR64spRegClass);
2163         unsigned SrcRegX = TRI->getMatchingSuperReg(SrcReg, AArch64::sub_32,
2164                                                     &AArch64::GPR64spRegClass);
2165         // This instruction is reading and writing X registers.  This may upset
2166         // the register scavenger and machine verifier, so we need to indicate
2167         // that we are reading an undefined value from SrcRegX, but a proper
2168         // value from SrcReg.
2169         BuildMI(MBB, I, DL, get(AArch64::ADDXri), DestRegX)
2170             .addReg(SrcRegX, RegState::Undef)
2171             .addImm(0)
2172             .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0))
2173             .addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
2174       } else {
2175         BuildMI(MBB, I, DL, get(AArch64::ADDWri), DestReg)
2176             .addReg(SrcReg, getKillRegState(KillSrc))
2177             .addImm(0)
2178             .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
2179       }
2180     } else if (SrcReg == AArch64::WZR && Subtarget.hasZeroCycleZeroing()) {
2181       BuildMI(MBB, I, DL, get(AArch64::MOVZWi), DestReg).addImm(0).addImm(
2182           AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
2183     } else {
2184       if (Subtarget.hasZeroCycleRegMove()) {
2185         // Cyclone recognizes "ORR Xd, XZR, Xm" as a zero-cycle register move.
2186         unsigned DestRegX = TRI->getMatchingSuperReg(DestReg, AArch64::sub_32,
2187                                                      &AArch64::GPR64spRegClass);
2188         unsigned SrcRegX = TRI->getMatchingSuperReg(SrcReg, AArch64::sub_32,
2189                                                     &AArch64::GPR64spRegClass);
2190         // This instruction is reading and writing X registers.  This may upset
2191         // the register scavenger and machine verifier, so we need to indicate
2192         // that we are reading an undefined value from SrcRegX, but a proper
2193         // value from SrcReg.
2194         BuildMI(MBB, I, DL, get(AArch64::ORRXrr), DestRegX)
2195             .addReg(AArch64::XZR)
2196             .addReg(SrcRegX, RegState::Undef)
2197             .addReg(SrcReg, RegState::Implicit | getKillRegState(KillSrc));
2198       } else {
2199         // Otherwise, expand to ORR WZR.
2200         BuildMI(MBB, I, DL, get(AArch64::ORRWrr), DestReg)
2201             .addReg(AArch64::WZR)
2202             .addReg(SrcReg, getKillRegState(KillSrc));
2203       }
2204     }
2205     return;
2206   }
2207 
2208   if (AArch64::GPR64spRegClass.contains(DestReg) &&
2209       (AArch64::GPR64spRegClass.contains(SrcReg) || SrcReg == AArch64::XZR)) {
2210     if (DestReg == AArch64::SP || SrcReg == AArch64::SP) {
2211       // If either operand is SP, expand to ADD #0.
2212       BuildMI(MBB, I, DL, get(AArch64::ADDXri), DestReg)
2213           .addReg(SrcReg, getKillRegState(KillSrc))
2214           .addImm(0)
2215           .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
2216     } else if (SrcReg == AArch64::XZR && Subtarget.hasZeroCycleZeroing()) {
2217       BuildMI(MBB, I, DL, get(AArch64::MOVZXi), DestReg).addImm(0).addImm(
2218           AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
2219     } else {
2220       // Otherwise, expand to ORR XZR.
2221       BuildMI(MBB, I, DL, get(AArch64::ORRXrr), DestReg)
2222           .addReg(AArch64::XZR)
2223           .addReg(SrcReg, getKillRegState(KillSrc));
2224     }
2225     return;
2226   }
2227 
2228   // Copy a DDDD register quad by copying the individual sub-registers.
2229   if (AArch64::DDDDRegClass.contains(DestReg) &&
2230       AArch64::DDDDRegClass.contains(SrcReg)) {
2231     static const unsigned Indices[] = { AArch64::dsub0, AArch64::dsub1,
2232                                         AArch64::dsub2, AArch64::dsub3 };
2233     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv8i8,
2234                      Indices);
2235     return;
2236   }
2237 
2238   // Copy a DDD register triple by copying the individual sub-registers.
2239   if (AArch64::DDDRegClass.contains(DestReg) &&
2240       AArch64::DDDRegClass.contains(SrcReg)) {
2241     static const unsigned Indices[] = { AArch64::dsub0, AArch64::dsub1,
2242                                         AArch64::dsub2 };
2243     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv8i8,
2244                      Indices);
2245     return;
2246   }
2247 
2248   // Copy a DD register pair by copying the individual sub-registers.
2249   if (AArch64::DDRegClass.contains(DestReg) &&
2250       AArch64::DDRegClass.contains(SrcReg)) {
2251     static const unsigned Indices[] = { AArch64::dsub0, AArch64::dsub1 };
2252     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv8i8,
2253                      Indices);
2254     return;
2255   }
2256 
2257   // Copy a QQQQ register quad by copying the individual sub-registers.
2258   if (AArch64::QQQQRegClass.contains(DestReg) &&
2259       AArch64::QQQQRegClass.contains(SrcReg)) {
2260     static const unsigned Indices[] = { AArch64::qsub0, AArch64::qsub1,
2261                                         AArch64::qsub2, AArch64::qsub3 };
2262     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv16i8,
2263                      Indices);
2264     return;
2265   }
2266 
2267   // Copy a QQQ register triple by copying the individual sub-registers.
2268   if (AArch64::QQQRegClass.contains(DestReg) &&
2269       AArch64::QQQRegClass.contains(SrcReg)) {
2270     static const unsigned Indices[] = { AArch64::qsub0, AArch64::qsub1,
2271                                         AArch64::qsub2 };
2272     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv16i8,
2273                      Indices);
2274     return;
2275   }
2276 
2277   // Copy a QQ register pair by copying the individual sub-registers.
2278   if (AArch64::QQRegClass.contains(DestReg) &&
2279       AArch64::QQRegClass.contains(SrcReg)) {
2280     static const unsigned Indices[] = { AArch64::qsub0, AArch64::qsub1 };
2281     copyPhysRegTuple(MBB, I, DL, DestReg, SrcReg, KillSrc, AArch64::ORRv16i8,
2282                      Indices);
2283     return;
2284   }
2285 
2286   if (AArch64::FPR128RegClass.contains(DestReg) &&
2287       AArch64::FPR128RegClass.contains(SrcReg)) {
2288     if(Subtarget.hasNEON()) {
2289       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2290           .addReg(SrcReg)
2291           .addReg(SrcReg, getKillRegState(KillSrc));
2292     } else {
2293       BuildMI(MBB, I, DL, get(AArch64::STRQpre))
2294         .addReg(AArch64::SP, RegState::Define)
2295         .addReg(SrcReg, getKillRegState(KillSrc))
2296         .addReg(AArch64::SP)
2297         .addImm(-16);
2298       BuildMI(MBB, I, DL, get(AArch64::LDRQpre))
2299         .addReg(AArch64::SP, RegState::Define)
2300         .addReg(DestReg, RegState::Define)
2301         .addReg(AArch64::SP)
2302         .addImm(16);
2303     }
2304     return;
2305   }
2306 
2307   if (AArch64::FPR64RegClass.contains(DestReg) &&
2308       AArch64::FPR64RegClass.contains(SrcReg)) {
2309     if(Subtarget.hasNEON()) {
2310       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::dsub,
2311                                        &AArch64::FPR128RegClass);
2312       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::dsub,
2313                                       &AArch64::FPR128RegClass);
2314       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2315           .addReg(SrcReg)
2316           .addReg(SrcReg, getKillRegState(KillSrc));
2317     } else {
2318       BuildMI(MBB, I, DL, get(AArch64::FMOVDr), DestReg)
2319           .addReg(SrcReg, getKillRegState(KillSrc));
2320     }
2321     return;
2322   }
2323 
2324   if (AArch64::FPR32RegClass.contains(DestReg) &&
2325       AArch64::FPR32RegClass.contains(SrcReg)) {
2326     if(Subtarget.hasNEON()) {
2327       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::ssub,
2328                                        &AArch64::FPR128RegClass);
2329       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::ssub,
2330                                       &AArch64::FPR128RegClass);
2331       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2332           .addReg(SrcReg)
2333           .addReg(SrcReg, getKillRegState(KillSrc));
2334     } else {
2335       BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
2336           .addReg(SrcReg, getKillRegState(KillSrc));
2337     }
2338     return;
2339   }
2340 
2341   if (AArch64::FPR16RegClass.contains(DestReg) &&
2342       AArch64::FPR16RegClass.contains(SrcReg)) {
2343     if(Subtarget.hasNEON()) {
2344       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
2345                                        &AArch64::FPR128RegClass);
2346       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
2347                                       &AArch64::FPR128RegClass);
2348       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2349           .addReg(SrcReg)
2350           .addReg(SrcReg, getKillRegState(KillSrc));
2351     } else {
2352       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
2353                                        &AArch64::FPR32RegClass);
2354       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
2355                                       &AArch64::FPR32RegClass);
2356       BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
2357           .addReg(SrcReg, getKillRegState(KillSrc));
2358     }
2359     return;
2360   }
2361 
2362   if (AArch64::FPR8RegClass.contains(DestReg) &&
2363       AArch64::FPR8RegClass.contains(SrcReg)) {
2364     if(Subtarget.hasNEON()) {
2365       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
2366                                        &AArch64::FPR128RegClass);
2367       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
2368                                       &AArch64::FPR128RegClass);
2369       BuildMI(MBB, I, DL, get(AArch64::ORRv16i8), DestReg)
2370           .addReg(SrcReg)
2371           .addReg(SrcReg, getKillRegState(KillSrc));
2372     } else {
2373       DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
2374                                        &AArch64::FPR32RegClass);
2375       SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
2376                                       &AArch64::FPR32RegClass);
2377       BuildMI(MBB, I, DL, get(AArch64::FMOVSr), DestReg)
2378           .addReg(SrcReg, getKillRegState(KillSrc));
2379     }
2380     return;
2381   }
2382 
2383   // Copies between GPR64 and FPR64.
2384   if (AArch64::FPR64RegClass.contains(DestReg) &&
2385       AArch64::GPR64RegClass.contains(SrcReg)) {
2386     BuildMI(MBB, I, DL, get(AArch64::FMOVXDr), DestReg)
2387         .addReg(SrcReg, getKillRegState(KillSrc));
2388     return;
2389   }
2390   if (AArch64::GPR64RegClass.contains(DestReg) &&
2391       AArch64::FPR64RegClass.contains(SrcReg)) {
2392     BuildMI(MBB, I, DL, get(AArch64::FMOVDXr), DestReg)
2393         .addReg(SrcReg, getKillRegState(KillSrc));
2394     return;
2395   }
2396   // Copies between GPR32 and FPR32.
2397   if (AArch64::FPR32RegClass.contains(DestReg) &&
2398       AArch64::GPR32RegClass.contains(SrcReg)) {
2399     BuildMI(MBB, I, DL, get(AArch64::FMOVWSr), DestReg)
2400         .addReg(SrcReg, getKillRegState(KillSrc));
2401     return;
2402   }
2403   if (AArch64::GPR32RegClass.contains(DestReg) &&
2404       AArch64::FPR32RegClass.contains(SrcReg)) {
2405     BuildMI(MBB, I, DL, get(AArch64::FMOVSWr), DestReg)
2406         .addReg(SrcReg, getKillRegState(KillSrc));
2407     return;
2408   }
2409 
2410   if (DestReg == AArch64::NZCV) {
2411     assert(AArch64::GPR64RegClass.contains(SrcReg) && "Invalid NZCV copy");
2412     BuildMI(MBB, I, DL, get(AArch64::MSR))
2413       .addImm(AArch64SysReg::NZCV)
2414       .addReg(SrcReg, getKillRegState(KillSrc))
2415       .addReg(AArch64::NZCV, RegState::Implicit | RegState::Define);
2416     return;
2417   }
2418 
2419   if (SrcReg == AArch64::NZCV) {
2420     assert(AArch64::GPR64RegClass.contains(DestReg) && "Invalid NZCV copy");
2421     BuildMI(MBB, I, DL, get(AArch64::MRS), DestReg)
2422       .addImm(AArch64SysReg::NZCV)
2423       .addReg(AArch64::NZCV, RegState::Implicit | getKillRegState(KillSrc));
2424     return;
2425   }
2426 
2427   llvm_unreachable("unimplemented reg-to-reg copy");
2428 }
2429 
2430 void AArch64InstrInfo::storeRegToStackSlot(
2431     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg,
2432     bool isKill, int FI, const TargetRegisterClass *RC,
2433     const TargetRegisterInfo *TRI) const {
2434   DebugLoc DL;
2435   if (MBBI != MBB.end())
2436     DL = MBBI->getDebugLoc();
2437   MachineFunction &MF = *MBB.getParent();
2438   MachineFrameInfo &MFI = MF.getFrameInfo();
2439   unsigned Align = MFI.getObjectAlignment(FI);
2440 
2441   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FI);
2442   MachineMemOperand *MMO = MF.getMachineMemOperand(
2443       PtrInfo, MachineMemOperand::MOStore, MFI.getObjectSize(FI), Align);
2444   unsigned Opc = 0;
2445   bool Offset = true;
2446   switch (TRI->getSpillSize(*RC)) {
2447   case 1:
2448     if (AArch64::FPR8RegClass.hasSubClassEq(RC))
2449       Opc = AArch64::STRBui;
2450     break;
2451   case 2:
2452     if (AArch64::FPR16RegClass.hasSubClassEq(RC))
2453       Opc = AArch64::STRHui;
2454     break;
2455   case 4:
2456     if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
2457       Opc = AArch64::STRWui;
2458       if (TargetRegisterInfo::isVirtualRegister(SrcReg))
2459         MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR32RegClass);
2460       else
2461         assert(SrcReg != AArch64::WSP);
2462     } else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
2463       Opc = AArch64::STRSui;
2464     break;
2465   case 8:
2466     if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
2467       Opc = AArch64::STRXui;
2468       if (TargetRegisterInfo::isVirtualRegister(SrcReg))
2469         MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR64RegClass);
2470       else
2471         assert(SrcReg != AArch64::SP);
2472     } else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
2473       Opc = AArch64::STRDui;
2474     break;
2475   case 16:
2476     if (AArch64::FPR128RegClass.hasSubClassEq(RC))
2477       Opc = AArch64::STRQui;
2478     else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
2479       assert(Subtarget.hasNEON() &&
2480              "Unexpected register store without NEON");
2481       Opc = AArch64::ST1Twov1d;
2482       Offset = false;
2483     }
2484     break;
2485   case 24:
2486     if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
2487       assert(Subtarget.hasNEON() &&
2488              "Unexpected register store without NEON");
2489       Opc = AArch64::ST1Threev1d;
2490       Offset = false;
2491     }
2492     break;
2493   case 32:
2494     if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
2495       assert(Subtarget.hasNEON() &&
2496              "Unexpected register store without NEON");
2497       Opc = AArch64::ST1Fourv1d;
2498       Offset = false;
2499     } else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
2500       assert(Subtarget.hasNEON() &&
2501              "Unexpected register store without NEON");
2502       Opc = AArch64::ST1Twov2d;
2503       Offset = false;
2504     }
2505     break;
2506   case 48:
2507     if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
2508       assert(Subtarget.hasNEON() &&
2509              "Unexpected register store without NEON");
2510       Opc = AArch64::ST1Threev2d;
2511       Offset = false;
2512     }
2513     break;
2514   case 64:
2515     if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
2516       assert(Subtarget.hasNEON() &&
2517              "Unexpected register store without NEON");
2518       Opc = AArch64::ST1Fourv2d;
2519       Offset = false;
2520     }
2521     break;
2522   }
2523   assert(Opc && "Unknown register class");
2524 
2525   const MachineInstrBuilder MI = BuildMI(MBB, MBBI, DL, get(Opc))
2526                                       .addReg(SrcReg, getKillRegState(isKill))
2527                                       .addFrameIndex(FI);
2528 
2529   if (Offset)
2530     MI.addImm(0);
2531   MI.addMemOperand(MMO);
2532 }
2533 
2534 void AArch64InstrInfo::loadRegFromStackSlot(
2535     MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg,
2536     int FI, const TargetRegisterClass *RC,
2537     const TargetRegisterInfo *TRI) const {
2538   DebugLoc DL;
2539   if (MBBI != MBB.end())
2540     DL = MBBI->getDebugLoc();
2541   MachineFunction &MF = *MBB.getParent();
2542   MachineFrameInfo &MFI = MF.getFrameInfo();
2543   unsigned Align = MFI.getObjectAlignment(FI);
2544   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, FI);
2545   MachineMemOperand *MMO = MF.getMachineMemOperand(
2546       PtrInfo, MachineMemOperand::MOLoad, MFI.getObjectSize(FI), Align);
2547 
2548   unsigned Opc = 0;
2549   bool Offset = true;
2550   switch (TRI->getSpillSize(*RC)) {
2551   case 1:
2552     if (AArch64::FPR8RegClass.hasSubClassEq(RC))
2553       Opc = AArch64::LDRBui;
2554     break;
2555   case 2:
2556     if (AArch64::FPR16RegClass.hasSubClassEq(RC))
2557       Opc = AArch64::LDRHui;
2558     break;
2559   case 4:
2560     if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
2561       Opc = AArch64::LDRWui;
2562       if (TargetRegisterInfo::isVirtualRegister(DestReg))
2563         MF.getRegInfo().constrainRegClass(DestReg, &AArch64::GPR32RegClass);
2564       else
2565         assert(DestReg != AArch64::WSP);
2566     } else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
2567       Opc = AArch64::LDRSui;
2568     break;
2569   case 8:
2570     if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
2571       Opc = AArch64::LDRXui;
2572       if (TargetRegisterInfo::isVirtualRegister(DestReg))
2573         MF.getRegInfo().constrainRegClass(DestReg, &AArch64::GPR64RegClass);
2574       else
2575         assert(DestReg != AArch64::SP);
2576     } else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
2577       Opc = AArch64::LDRDui;
2578     break;
2579   case 16:
2580     if (AArch64::FPR128RegClass.hasSubClassEq(RC))
2581       Opc = AArch64::LDRQui;
2582     else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
2583       assert(Subtarget.hasNEON() &&
2584              "Unexpected register load without NEON");
2585       Opc = AArch64::LD1Twov1d;
2586       Offset = false;
2587     }
2588     break;
2589   case 24:
2590     if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
2591       assert(Subtarget.hasNEON() &&
2592              "Unexpected register load without NEON");
2593       Opc = AArch64::LD1Threev1d;
2594       Offset = false;
2595     }
2596     break;
2597   case 32:
2598     if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
2599       assert(Subtarget.hasNEON() &&
2600              "Unexpected register load without NEON");
2601       Opc = AArch64::LD1Fourv1d;
2602       Offset = false;
2603     } else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
2604       assert(Subtarget.hasNEON() &&
2605              "Unexpected register load without NEON");
2606       Opc = AArch64::LD1Twov2d;
2607       Offset = false;
2608     }
2609     break;
2610   case 48:
2611     if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
2612       assert(Subtarget.hasNEON() &&
2613              "Unexpected register load without NEON");
2614       Opc = AArch64::LD1Threev2d;
2615       Offset = false;
2616     }
2617     break;
2618   case 64:
2619     if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
2620       assert(Subtarget.hasNEON() &&
2621              "Unexpected register load without NEON");
2622       Opc = AArch64::LD1Fourv2d;
2623       Offset = false;
2624     }
2625     break;
2626   }
2627   assert(Opc && "Unknown register class");
2628 
2629   const MachineInstrBuilder MI = BuildMI(MBB, MBBI, DL, get(Opc))
2630                                       .addReg(DestReg, getDefRegState(true))
2631                                       .addFrameIndex(FI);
2632   if (Offset)
2633     MI.addImm(0);
2634   MI.addMemOperand(MMO);
2635 }
2636 
2637 void llvm::emitFrameOffset(MachineBasicBlock &MBB,
2638                            MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
2639                            unsigned DestReg, unsigned SrcReg, int Offset,
2640                            const TargetInstrInfo *TII,
2641                            MachineInstr::MIFlag Flag, bool SetNZCV) {
2642   if (DestReg == SrcReg && Offset == 0)
2643     return;
2644 
2645   assert((DestReg != AArch64::SP || Offset % 16 == 0) &&
2646          "SP increment/decrement not 16-byte aligned");
2647 
2648   bool isSub = Offset < 0;
2649   if (isSub)
2650     Offset = -Offset;
2651 
2652   // FIXME: If the offset won't fit in 24-bits, compute the offset into a
2653   // scratch register.  If DestReg is a virtual register, use it as the
2654   // scratch register; otherwise, create a new virtual register (to be
2655   // replaced by the scavenger at the end of PEI).  That case can be optimized
2656   // slightly if DestReg is SP which is always 16-byte aligned, so the scratch
2657   // register can be loaded with offset%8 and the add/sub can use an extending
2658   // instruction with LSL#3.
2659   // Currently the function handles any offsets but generates a poor sequence
2660   // of code.
2661   //  assert(Offset < (1 << 24) && "unimplemented reg plus immediate");
2662 
2663   unsigned Opc;
2664   if (SetNZCV)
2665     Opc = isSub ? AArch64::SUBSXri : AArch64::ADDSXri;
2666   else
2667     Opc = isSub ? AArch64::SUBXri : AArch64::ADDXri;
2668   const unsigned MaxEncoding = 0xfff;
2669   const unsigned ShiftSize = 12;
2670   const unsigned MaxEncodableValue = MaxEncoding << ShiftSize;
2671   while (((unsigned)Offset) >= (1 << ShiftSize)) {
2672     unsigned ThisVal;
2673     if (((unsigned)Offset) > MaxEncodableValue) {
2674       ThisVal = MaxEncodableValue;
2675     } else {
2676       ThisVal = Offset & MaxEncodableValue;
2677     }
2678     assert((ThisVal >> ShiftSize) <= MaxEncoding &&
2679            "Encoding cannot handle value that big");
2680     BuildMI(MBB, MBBI, DL, TII->get(Opc), DestReg)
2681         .addReg(SrcReg)
2682         .addImm(ThisVal >> ShiftSize)
2683         .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftSize))
2684         .setMIFlag(Flag);
2685 
2686     SrcReg = DestReg;
2687     Offset -= ThisVal;
2688     if (Offset == 0)
2689       return;
2690   }
2691   BuildMI(MBB, MBBI, DL, TII->get(Opc), DestReg)
2692       .addReg(SrcReg)
2693       .addImm(Offset)
2694       .addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0))
2695       .setMIFlag(Flag);
2696 }
2697 
2698 MachineInstr *AArch64InstrInfo::foldMemoryOperandImpl(
2699     MachineFunction &MF, MachineInstr &MI, ArrayRef<unsigned> Ops,
2700     MachineBasicBlock::iterator InsertPt, int FrameIndex,
2701     LiveIntervals *LIS) const {
2702   // This is a bit of a hack. Consider this instruction:
2703   //
2704   //   %vreg0<def> = COPY %SP; GPR64all:%vreg0
2705   //
2706   // We explicitly chose GPR64all for the virtual register so such a copy might
2707   // be eliminated by RegisterCoalescer. However, that may not be possible, and
2708   // %vreg0 may even spill. We can't spill %SP, and since it is in the GPR64all
2709   // register class, TargetInstrInfo::foldMemoryOperand() is going to try.
2710   //
2711   // To prevent that, we are going to constrain the %vreg0 register class here.
2712   //
2713   // <rdar://problem/11522048>
2714   //
2715   if (MI.isFullCopy()) {
2716     unsigned DstReg = MI.getOperand(0).getReg();
2717     unsigned SrcReg = MI.getOperand(1).getReg();
2718     if (SrcReg == AArch64::SP &&
2719         TargetRegisterInfo::isVirtualRegister(DstReg)) {
2720       MF.getRegInfo().constrainRegClass(DstReg, &AArch64::GPR64RegClass);
2721       return nullptr;
2722     }
2723     if (DstReg == AArch64::SP &&
2724         TargetRegisterInfo::isVirtualRegister(SrcReg)) {
2725       MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::GPR64RegClass);
2726       return nullptr;
2727     }
2728   }
2729 
2730   // Handle the case where a copy is being spilled or filled but the source
2731   // and destination register class don't match.  For example:
2732   //
2733   //   %vreg0<def> = COPY %XZR; GPR64common:%vreg0
2734   //
2735   // In this case we can still safely fold away the COPY and generate the
2736   // following spill code:
2737   //
2738   //   STRXui %XZR, <fi#0>
2739   //
2740   // This also eliminates spilled cross register class COPYs (e.g. between x and
2741   // d regs) of the same size.  For example:
2742   //
2743   //   %vreg0<def> = COPY %vreg1; GPR64:%vreg0, FPR64:%vreg1
2744   //
2745   // will be filled as
2746   //
2747   //   LDRDui %vreg0, fi<#0>
2748   //
2749   // instead of
2750   //
2751   //   LDRXui %vregTemp, fi<#0>
2752   //   %vreg0 = FMOV %vregTemp
2753   //
2754   if (MI.isCopy() && Ops.size() == 1 &&
2755       // Make sure we're only folding the explicit COPY defs/uses.
2756       (Ops[0] == 0 || Ops[0] == 1)) {
2757     bool IsSpill = Ops[0] == 0;
2758     bool IsFill = !IsSpill;
2759     const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
2760     const MachineRegisterInfo &MRI = MF.getRegInfo();
2761     MachineBasicBlock &MBB = *MI.getParent();
2762     const MachineOperand &DstMO = MI.getOperand(0);
2763     const MachineOperand &SrcMO = MI.getOperand(1);
2764     unsigned DstReg = DstMO.getReg();
2765     unsigned SrcReg = SrcMO.getReg();
2766     // This is slightly expensive to compute for physical regs since
2767     // getMinimalPhysRegClass is slow.
2768     auto getRegClass = [&](unsigned Reg) {
2769       return TargetRegisterInfo::isVirtualRegister(Reg)
2770                  ? MRI.getRegClass(Reg)
2771                  : TRI.getMinimalPhysRegClass(Reg);
2772     };
2773 
2774     if (DstMO.getSubReg() == 0 && SrcMO.getSubReg() == 0) {
2775       assert(TRI.getRegSizeInBits(*getRegClass(DstReg)) ==
2776              TRI.getRegSizeInBits(*getRegClass(SrcReg)) &&
2777              "Mismatched register size in non subreg COPY");
2778       if (IsSpill)
2779         storeRegToStackSlot(MBB, InsertPt, SrcReg, SrcMO.isKill(), FrameIndex,
2780                             getRegClass(SrcReg), &TRI);
2781       else
2782         loadRegFromStackSlot(MBB, InsertPt, DstReg, FrameIndex,
2783                              getRegClass(DstReg), &TRI);
2784       return &*--InsertPt;
2785     }
2786 
2787     // Handle cases like spilling def of:
2788     //
2789     //   %vreg0:sub_32<def,read-undef> = COPY %WZR; GPR64common:%vreg0
2790     //
2791     // where the physical register source can be widened and stored to the full
2792     // virtual reg destination stack slot, in this case producing:
2793     //
2794     //   STRXui %XZR, <fi#0>
2795     //
2796     if (IsSpill && DstMO.isUndef() &&
2797         TargetRegisterInfo::isPhysicalRegister(SrcReg)) {
2798       assert(SrcMO.getSubReg() == 0 &&
2799              "Unexpected subreg on physical register");
2800       const TargetRegisterClass *SpillRC;
2801       unsigned SpillSubreg;
2802       switch (DstMO.getSubReg()) {
2803       default:
2804         SpillRC = nullptr;
2805         break;
2806       case AArch64::sub_32:
2807       case AArch64::ssub:
2808         if (AArch64::GPR32RegClass.contains(SrcReg)) {
2809           SpillRC = &AArch64::GPR64RegClass;
2810           SpillSubreg = AArch64::sub_32;
2811         } else if (AArch64::FPR32RegClass.contains(SrcReg)) {
2812           SpillRC = &AArch64::FPR64RegClass;
2813           SpillSubreg = AArch64::ssub;
2814         } else
2815           SpillRC = nullptr;
2816         break;
2817       case AArch64::dsub:
2818         if (AArch64::FPR64RegClass.contains(SrcReg)) {
2819           SpillRC = &AArch64::FPR128RegClass;
2820           SpillSubreg = AArch64::dsub;
2821         } else
2822           SpillRC = nullptr;
2823         break;
2824       }
2825 
2826       if (SpillRC)
2827         if (unsigned WidenedSrcReg =
2828                 TRI.getMatchingSuperReg(SrcReg, SpillSubreg, SpillRC)) {
2829           storeRegToStackSlot(MBB, InsertPt, WidenedSrcReg, SrcMO.isKill(),
2830                               FrameIndex, SpillRC, &TRI);
2831           return &*--InsertPt;
2832         }
2833     }
2834 
2835     // Handle cases like filling use of:
2836     //
2837     //   %vreg0:sub_32<def,read-undef> = COPY %vreg1; GPR64:%vreg0, GPR32:%vreg1
2838     //
2839     // where we can load the full virtual reg source stack slot, into the subreg
2840     // destination, in this case producing:
2841     //
2842     //   LDRWui %vreg0:sub_32<def,read-undef>, <fi#0>
2843     //
2844     if (IsFill && SrcMO.getSubReg() == 0 && DstMO.isUndef()) {
2845       const TargetRegisterClass *FillRC;
2846       switch (DstMO.getSubReg()) {
2847       default:
2848         FillRC = nullptr;
2849         break;
2850       case AArch64::sub_32:
2851         FillRC = &AArch64::GPR32RegClass;
2852         break;
2853       case AArch64::ssub:
2854         FillRC = &AArch64::FPR32RegClass;
2855         break;
2856       case AArch64::dsub:
2857         FillRC = &AArch64::FPR64RegClass;
2858         break;
2859       }
2860 
2861       if (FillRC) {
2862         assert(TRI.getRegSizeInBits(*getRegClass(SrcReg)) ==
2863                    TRI.getRegSizeInBits(*FillRC) &&
2864                "Mismatched regclass size on folded subreg COPY");
2865         loadRegFromStackSlot(MBB, InsertPt, DstReg, FrameIndex, FillRC, &TRI);
2866         MachineInstr &LoadMI = *--InsertPt;
2867         MachineOperand &LoadDst = LoadMI.getOperand(0);
2868         assert(LoadDst.getSubReg() == 0 && "unexpected subreg on fill load");
2869         LoadDst.setSubReg(DstMO.getSubReg());
2870         LoadDst.setIsUndef();
2871         return &LoadMI;
2872       }
2873     }
2874   }
2875 
2876   // Cannot fold.
2877   return nullptr;
2878 }
2879 
2880 int llvm::isAArch64FrameOffsetLegal(const MachineInstr &MI, int &Offset,
2881                                     bool *OutUseUnscaledOp,
2882                                     unsigned *OutUnscaledOp,
2883                                     int *EmittableOffset) {
2884   int Scale = 1;
2885   bool IsSigned = false;
2886   // The ImmIdx should be changed case by case if it is not 2.
2887   unsigned ImmIdx = 2;
2888   unsigned UnscaledOp = 0;
2889   // Set output values in case of early exit.
2890   if (EmittableOffset)
2891     *EmittableOffset = 0;
2892   if (OutUseUnscaledOp)
2893     *OutUseUnscaledOp = false;
2894   if (OutUnscaledOp)
2895     *OutUnscaledOp = 0;
2896   switch (MI.getOpcode()) {
2897   default:
2898     llvm_unreachable("unhandled opcode in rewriteAArch64FrameIndex");
2899   // Vector spills/fills can't take an immediate offset.
2900   case AArch64::LD1Twov2d:
2901   case AArch64::LD1Threev2d:
2902   case AArch64::LD1Fourv2d:
2903   case AArch64::LD1Twov1d:
2904   case AArch64::LD1Threev1d:
2905   case AArch64::LD1Fourv1d:
2906   case AArch64::ST1Twov2d:
2907   case AArch64::ST1Threev2d:
2908   case AArch64::ST1Fourv2d:
2909   case AArch64::ST1Twov1d:
2910   case AArch64::ST1Threev1d:
2911   case AArch64::ST1Fourv1d:
2912     return AArch64FrameOffsetCannotUpdate;
2913   case AArch64::PRFMui:
2914     Scale = 8;
2915     UnscaledOp = AArch64::PRFUMi;
2916     break;
2917   case AArch64::LDRXui:
2918     Scale = 8;
2919     UnscaledOp = AArch64::LDURXi;
2920     break;
2921   case AArch64::LDRWui:
2922     Scale = 4;
2923     UnscaledOp = AArch64::LDURWi;
2924     break;
2925   case AArch64::LDRBui:
2926     Scale = 1;
2927     UnscaledOp = AArch64::LDURBi;
2928     break;
2929   case AArch64::LDRHui:
2930     Scale = 2;
2931     UnscaledOp = AArch64::LDURHi;
2932     break;
2933   case AArch64::LDRSui:
2934     Scale = 4;
2935     UnscaledOp = AArch64::LDURSi;
2936     break;
2937   case AArch64::LDRDui:
2938     Scale = 8;
2939     UnscaledOp = AArch64::LDURDi;
2940     break;
2941   case AArch64::LDRQui:
2942     Scale = 16;
2943     UnscaledOp = AArch64::LDURQi;
2944     break;
2945   case AArch64::LDRBBui:
2946     Scale = 1;
2947     UnscaledOp = AArch64::LDURBBi;
2948     break;
2949   case AArch64::LDRHHui:
2950     Scale = 2;
2951     UnscaledOp = AArch64::LDURHHi;
2952     break;
2953   case AArch64::LDRSBXui:
2954     Scale = 1;
2955     UnscaledOp = AArch64::LDURSBXi;
2956     break;
2957   case AArch64::LDRSBWui:
2958     Scale = 1;
2959     UnscaledOp = AArch64::LDURSBWi;
2960     break;
2961   case AArch64::LDRSHXui:
2962     Scale = 2;
2963     UnscaledOp = AArch64::LDURSHXi;
2964     break;
2965   case AArch64::LDRSHWui:
2966     Scale = 2;
2967     UnscaledOp = AArch64::LDURSHWi;
2968     break;
2969   case AArch64::LDRSWui:
2970     Scale = 4;
2971     UnscaledOp = AArch64::LDURSWi;
2972     break;
2973 
2974   case AArch64::STRXui:
2975     Scale = 8;
2976     UnscaledOp = AArch64::STURXi;
2977     break;
2978   case AArch64::STRWui:
2979     Scale = 4;
2980     UnscaledOp = AArch64::STURWi;
2981     break;
2982   case AArch64::STRBui:
2983     Scale = 1;
2984     UnscaledOp = AArch64::STURBi;
2985     break;
2986   case AArch64::STRHui:
2987     Scale = 2;
2988     UnscaledOp = AArch64::STURHi;
2989     break;
2990   case AArch64::STRSui:
2991     Scale = 4;
2992     UnscaledOp = AArch64::STURSi;
2993     break;
2994   case AArch64::STRDui:
2995     Scale = 8;
2996     UnscaledOp = AArch64::STURDi;
2997     break;
2998   case AArch64::STRQui:
2999     Scale = 16;
3000     UnscaledOp = AArch64::STURQi;
3001     break;
3002   case AArch64::STRBBui:
3003     Scale = 1;
3004     UnscaledOp = AArch64::STURBBi;
3005     break;
3006   case AArch64::STRHHui:
3007     Scale = 2;
3008     UnscaledOp = AArch64::STURHHi;
3009     break;
3010 
3011   case AArch64::LDPXi:
3012   case AArch64::LDPDi:
3013   case AArch64::STPXi:
3014   case AArch64::STPDi:
3015   case AArch64::LDNPXi:
3016   case AArch64::LDNPDi:
3017   case AArch64::STNPXi:
3018   case AArch64::STNPDi:
3019     ImmIdx = 3;
3020     IsSigned = true;
3021     Scale = 8;
3022     break;
3023   case AArch64::LDPQi:
3024   case AArch64::STPQi:
3025   case AArch64::LDNPQi:
3026   case AArch64::STNPQi:
3027     ImmIdx = 3;
3028     IsSigned = true;
3029     Scale = 16;
3030     break;
3031   case AArch64::LDPWi:
3032   case AArch64::LDPSi:
3033   case AArch64::STPWi:
3034   case AArch64::STPSi:
3035   case AArch64::LDNPWi:
3036   case AArch64::LDNPSi:
3037   case AArch64::STNPWi:
3038   case AArch64::STNPSi:
3039     ImmIdx = 3;
3040     IsSigned = true;
3041     Scale = 4;
3042     break;
3043 
3044   case AArch64::LDURXi:
3045   case AArch64::LDURWi:
3046   case AArch64::LDURBi:
3047   case AArch64::LDURHi:
3048   case AArch64::LDURSi:
3049   case AArch64::LDURDi:
3050   case AArch64::LDURQi:
3051   case AArch64::LDURHHi:
3052   case AArch64::LDURBBi:
3053   case AArch64::LDURSBXi:
3054   case AArch64::LDURSBWi:
3055   case AArch64::LDURSHXi:
3056   case AArch64::LDURSHWi:
3057   case AArch64::LDURSWi:
3058   case AArch64::STURXi:
3059   case AArch64::STURWi:
3060   case AArch64::STURBi:
3061   case AArch64::STURHi:
3062   case AArch64::STURSi:
3063   case AArch64::STURDi:
3064   case AArch64::STURQi:
3065   case AArch64::STURBBi:
3066   case AArch64::STURHHi:
3067     Scale = 1;
3068     break;
3069   }
3070 
3071   Offset += MI.getOperand(ImmIdx).getImm() * Scale;
3072 
3073   bool useUnscaledOp = false;
3074   // If the offset doesn't match the scale, we rewrite the instruction to
3075   // use the unscaled instruction instead. Likewise, if we have a negative
3076   // offset (and have an unscaled op to use).
3077   if ((Offset & (Scale - 1)) != 0 || (Offset < 0 && UnscaledOp != 0))
3078     useUnscaledOp = true;
3079 
3080   // Use an unscaled addressing mode if the instruction has a negative offset
3081   // (or if the instruction is already using an unscaled addressing mode).
3082   unsigned MaskBits;
3083   if (IsSigned) {
3084     // ldp/stp instructions.
3085     MaskBits = 7;
3086     Offset /= Scale;
3087   } else if (UnscaledOp == 0 || useUnscaledOp) {
3088     MaskBits = 9;
3089     IsSigned = true;
3090     Scale = 1;
3091   } else {
3092     MaskBits = 12;
3093     IsSigned = false;
3094     Offset /= Scale;
3095   }
3096 
3097   // Attempt to fold address computation.
3098   int MaxOff = (1 << (MaskBits - IsSigned)) - 1;
3099   int MinOff = (IsSigned ? (-MaxOff - 1) : 0);
3100   if (Offset >= MinOff && Offset <= MaxOff) {
3101     if (EmittableOffset)
3102       *EmittableOffset = Offset;
3103     Offset = 0;
3104   } else {
3105     int NewOff = Offset < 0 ? MinOff : MaxOff;
3106     if (EmittableOffset)
3107       *EmittableOffset = NewOff;
3108     Offset = (Offset - NewOff) * Scale;
3109   }
3110   if (OutUseUnscaledOp)
3111     *OutUseUnscaledOp = useUnscaledOp;
3112   if (OutUnscaledOp)
3113     *OutUnscaledOp = UnscaledOp;
3114   return AArch64FrameOffsetCanUpdate |
3115          (Offset == 0 ? AArch64FrameOffsetIsLegal : 0);
3116 }
3117 
3118 bool llvm::rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
3119                                     unsigned FrameReg, int &Offset,
3120                                     const AArch64InstrInfo *TII) {
3121   unsigned Opcode = MI.getOpcode();
3122   unsigned ImmIdx = FrameRegIdx + 1;
3123 
3124   if (Opcode == AArch64::ADDSXri || Opcode == AArch64::ADDXri) {
3125     Offset += MI.getOperand(ImmIdx).getImm();
3126     emitFrameOffset(*MI.getParent(), MI, MI.getDebugLoc(),
3127                     MI.getOperand(0).getReg(), FrameReg, Offset, TII,
3128                     MachineInstr::NoFlags, (Opcode == AArch64::ADDSXri));
3129     MI.eraseFromParent();
3130     Offset = 0;
3131     return true;
3132   }
3133 
3134   int NewOffset;
3135   unsigned UnscaledOp;
3136   bool UseUnscaledOp;
3137   int Status = isAArch64FrameOffsetLegal(MI, Offset, &UseUnscaledOp,
3138                                          &UnscaledOp, &NewOffset);
3139   if (Status & AArch64FrameOffsetCanUpdate) {
3140     if (Status & AArch64FrameOffsetIsLegal)
3141       // Replace the FrameIndex with FrameReg.
3142       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
3143     if (UseUnscaledOp)
3144       MI.setDesc(TII->get(UnscaledOp));
3145 
3146     MI.getOperand(ImmIdx).ChangeToImmediate(NewOffset);
3147     return Offset == 0;
3148   }
3149 
3150   return false;
3151 }
3152 
3153 void AArch64InstrInfo::getNoop(MCInst &NopInst) const {
3154   NopInst.setOpcode(AArch64::HINT);
3155   NopInst.addOperand(MCOperand::createImm(0));
3156 }
3157 
3158 // AArch64 supports MachineCombiner.
3159 bool AArch64InstrInfo::useMachineCombiner() const {
3160 
3161   return true;
3162 }
3163 
3164 // True when Opc sets flag
3165 static bool isCombineInstrSettingFlag(unsigned Opc) {
3166   switch (Opc) {
3167   case AArch64::ADDSWrr:
3168   case AArch64::ADDSWri:
3169   case AArch64::ADDSXrr:
3170   case AArch64::ADDSXri:
3171   case AArch64::SUBSWrr:
3172   case AArch64::SUBSXrr:
3173   // Note: MSUB Wd,Wn,Wm,Wi -> Wd = Wi - WnxWm, not Wd=WnxWm - Wi.
3174   case AArch64::SUBSWri:
3175   case AArch64::SUBSXri:
3176     return true;
3177   default:
3178     break;
3179   }
3180   return false;
3181 }
3182 
3183 // 32b Opcodes that can be combined with a MUL
3184 static bool isCombineInstrCandidate32(unsigned Opc) {
3185   switch (Opc) {
3186   case AArch64::ADDWrr:
3187   case AArch64::ADDWri:
3188   case AArch64::SUBWrr:
3189   case AArch64::ADDSWrr:
3190   case AArch64::ADDSWri:
3191   case AArch64::SUBSWrr:
3192   // Note: MSUB Wd,Wn,Wm,Wi -> Wd = Wi - WnxWm, not Wd=WnxWm - Wi.
3193   case AArch64::SUBWri:
3194   case AArch64::SUBSWri:
3195     return true;
3196   default:
3197     break;
3198   }
3199   return false;
3200 }
3201 
3202 // 64b Opcodes that can be combined with a MUL
3203 static bool isCombineInstrCandidate64(unsigned Opc) {
3204   switch (Opc) {
3205   case AArch64::ADDXrr:
3206   case AArch64::ADDXri:
3207   case AArch64::SUBXrr:
3208   case AArch64::ADDSXrr:
3209   case AArch64::ADDSXri:
3210   case AArch64::SUBSXrr:
3211   // Note: MSUB Wd,Wn,Wm,Wi -> Wd = Wi - WnxWm, not Wd=WnxWm - Wi.
3212   case AArch64::SUBXri:
3213   case AArch64::SUBSXri:
3214     return true;
3215   default:
3216     break;
3217   }
3218   return false;
3219 }
3220 
3221 // FP Opcodes that can be combined with a FMUL
3222 static bool isCombineInstrCandidateFP(const MachineInstr &Inst) {
3223   switch (Inst.getOpcode()) {
3224   default:
3225     break;
3226   case AArch64::FADDSrr:
3227   case AArch64::FADDDrr:
3228   case AArch64::FADDv2f32:
3229   case AArch64::FADDv2f64:
3230   case AArch64::FADDv4f32:
3231   case AArch64::FSUBSrr:
3232   case AArch64::FSUBDrr:
3233   case AArch64::FSUBv2f32:
3234   case AArch64::FSUBv2f64:
3235   case AArch64::FSUBv4f32:
3236     TargetOptions Options = Inst.getParent()->getParent()->getTarget().Options;
3237     return (Options.UnsafeFPMath ||
3238             Options.AllowFPOpFusion == FPOpFusion::Fast);
3239   }
3240   return false;
3241 }
3242 
3243 // Opcodes that can be combined with a MUL
3244 static bool isCombineInstrCandidate(unsigned Opc) {
3245   return (isCombineInstrCandidate32(Opc) || isCombineInstrCandidate64(Opc));
3246 }
3247 
3248 //
3249 // Utility routine that checks if \param MO is defined by an
3250 // \param CombineOpc instruction in the basic block \param MBB
3251 static bool canCombine(MachineBasicBlock &MBB, MachineOperand &MO,
3252                        unsigned CombineOpc, unsigned ZeroReg = 0,
3253                        bool CheckZeroReg = false) {
3254   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
3255   MachineInstr *MI = nullptr;
3256 
3257   if (MO.isReg() && TargetRegisterInfo::isVirtualRegister(MO.getReg()))
3258     MI = MRI.getUniqueVRegDef(MO.getReg());
3259   // And it needs to be in the trace (otherwise, it won't have a depth).
3260   if (!MI || MI->getParent() != &MBB || (unsigned)MI->getOpcode() != CombineOpc)
3261     return false;
3262   // Must only used by the user we combine with.
3263   if (!MRI.hasOneNonDBGUse(MI->getOperand(0).getReg()))
3264     return false;
3265 
3266   if (CheckZeroReg) {
3267     assert(MI->getNumOperands() >= 4 && MI->getOperand(0).isReg() &&
3268            MI->getOperand(1).isReg() && MI->getOperand(2).isReg() &&
3269            MI->getOperand(3).isReg() && "MAdd/MSub must have a least 4 regs");
3270     // The third input reg must be zero.
3271     if (MI->getOperand(3).getReg() != ZeroReg)
3272       return false;
3273   }
3274 
3275   return true;
3276 }
3277 
3278 //
3279 // Is \param MO defined by an integer multiply and can be combined?
3280 static bool canCombineWithMUL(MachineBasicBlock &MBB, MachineOperand &MO,
3281                               unsigned MulOpc, unsigned ZeroReg) {
3282   return canCombine(MBB, MO, MulOpc, ZeroReg, true);
3283 }
3284 
3285 //
3286 // Is \param MO defined by a floating-point multiply and can be combined?
3287 static bool canCombineWithFMUL(MachineBasicBlock &MBB, MachineOperand &MO,
3288                                unsigned MulOpc) {
3289   return canCombine(MBB, MO, MulOpc);
3290 }
3291 
3292 // TODO: There are many more machine instruction opcodes to match:
3293 //       1. Other data types (integer, vectors)
3294 //       2. Other math / logic operations (xor, or)
3295 //       3. Other forms of the same operation (intrinsics and other variants)
3296 bool AArch64InstrInfo::isAssociativeAndCommutative(const MachineInstr &Inst) const {
3297   switch (Inst.getOpcode()) {
3298   case AArch64::FADDDrr:
3299   case AArch64::FADDSrr:
3300   case AArch64::FADDv2f32:
3301   case AArch64::FADDv2f64:
3302   case AArch64::FADDv4f32:
3303   case AArch64::FMULDrr:
3304   case AArch64::FMULSrr:
3305   case AArch64::FMULX32:
3306   case AArch64::FMULX64:
3307   case AArch64::FMULXv2f32:
3308   case AArch64::FMULXv2f64:
3309   case AArch64::FMULXv4f32:
3310   case AArch64::FMULv2f32:
3311   case AArch64::FMULv2f64:
3312   case AArch64::FMULv4f32:
3313     return Inst.getParent()->getParent()->getTarget().Options.UnsafeFPMath;
3314   default:
3315     return false;
3316   }
3317 }
3318 
3319 /// Find instructions that can be turned into madd.
3320 static bool getMaddPatterns(MachineInstr &Root,
3321                             SmallVectorImpl<MachineCombinerPattern> &Patterns) {
3322   unsigned Opc = Root.getOpcode();
3323   MachineBasicBlock &MBB = *Root.getParent();
3324   bool Found = false;
3325 
3326   if (!isCombineInstrCandidate(Opc))
3327     return false;
3328   if (isCombineInstrSettingFlag(Opc)) {
3329     int Cmp_NZCV = Root.findRegisterDefOperandIdx(AArch64::NZCV, true);
3330     // When NZCV is live bail out.
3331     if (Cmp_NZCV == -1)
3332       return false;
3333     unsigned NewOpc = convertToNonFlagSettingOpc(Root);
3334     // When opcode can't change bail out.
3335     // CHECKME: do we miss any cases for opcode conversion?
3336     if (NewOpc == Opc)
3337       return false;
3338     Opc = NewOpc;
3339   }
3340 
3341   switch (Opc) {
3342   default:
3343     break;
3344   case AArch64::ADDWrr:
3345     assert(Root.getOperand(1).isReg() && Root.getOperand(2).isReg() &&
3346            "ADDWrr does not have register operands");
3347     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3348                           AArch64::WZR)) {
3349       Patterns.push_back(MachineCombinerPattern::MULADDW_OP1);
3350       Found = true;
3351     }
3352     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDWrrr,
3353                           AArch64::WZR)) {
3354       Patterns.push_back(MachineCombinerPattern::MULADDW_OP2);
3355       Found = true;
3356     }
3357     break;
3358   case AArch64::ADDXrr:
3359     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3360                           AArch64::XZR)) {
3361       Patterns.push_back(MachineCombinerPattern::MULADDX_OP1);
3362       Found = true;
3363     }
3364     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDXrrr,
3365                           AArch64::XZR)) {
3366       Patterns.push_back(MachineCombinerPattern::MULADDX_OP2);
3367       Found = true;
3368     }
3369     break;
3370   case AArch64::SUBWrr:
3371     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3372                           AArch64::WZR)) {
3373       Patterns.push_back(MachineCombinerPattern::MULSUBW_OP1);
3374       Found = true;
3375     }
3376     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDWrrr,
3377                           AArch64::WZR)) {
3378       Patterns.push_back(MachineCombinerPattern::MULSUBW_OP2);
3379       Found = true;
3380     }
3381     break;
3382   case AArch64::SUBXrr:
3383     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3384                           AArch64::XZR)) {
3385       Patterns.push_back(MachineCombinerPattern::MULSUBX_OP1);
3386       Found = true;
3387     }
3388     if (canCombineWithMUL(MBB, Root.getOperand(2), AArch64::MADDXrrr,
3389                           AArch64::XZR)) {
3390       Patterns.push_back(MachineCombinerPattern::MULSUBX_OP2);
3391       Found = true;
3392     }
3393     break;
3394   case AArch64::ADDWri:
3395     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3396                           AArch64::WZR)) {
3397       Patterns.push_back(MachineCombinerPattern::MULADDWI_OP1);
3398       Found = true;
3399     }
3400     break;
3401   case AArch64::ADDXri:
3402     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3403                           AArch64::XZR)) {
3404       Patterns.push_back(MachineCombinerPattern::MULADDXI_OP1);
3405       Found = true;
3406     }
3407     break;
3408   case AArch64::SUBWri:
3409     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDWrrr,
3410                           AArch64::WZR)) {
3411       Patterns.push_back(MachineCombinerPattern::MULSUBWI_OP1);
3412       Found = true;
3413     }
3414     break;
3415   case AArch64::SUBXri:
3416     if (canCombineWithMUL(MBB, Root.getOperand(1), AArch64::MADDXrrr,
3417                           AArch64::XZR)) {
3418       Patterns.push_back(MachineCombinerPattern::MULSUBXI_OP1);
3419       Found = true;
3420     }
3421     break;
3422   }
3423   return Found;
3424 }
3425 /// Floating-Point Support
3426 
3427 /// Find instructions that can be turned into madd.
3428 static bool getFMAPatterns(MachineInstr &Root,
3429                            SmallVectorImpl<MachineCombinerPattern> &Patterns) {
3430 
3431   if (!isCombineInstrCandidateFP(Root))
3432     return false;
3433 
3434   MachineBasicBlock &MBB = *Root.getParent();
3435   bool Found = false;
3436 
3437   switch (Root.getOpcode()) {
3438   default:
3439     assert(false && "Unsupported FP instruction in combiner\n");
3440     break;
3441   case AArch64::FADDSrr:
3442     assert(Root.getOperand(1).isReg() && Root.getOperand(2).isReg() &&
3443            "FADDWrr does not have register operands");
3444     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULSrr)) {
3445       Patterns.push_back(MachineCombinerPattern::FMULADDS_OP1);
3446       Found = true;
3447     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3448                                   AArch64::FMULv1i32_indexed)) {
3449       Patterns.push_back(MachineCombinerPattern::FMLAv1i32_indexed_OP1);
3450       Found = true;
3451     }
3452     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULSrr)) {
3453       Patterns.push_back(MachineCombinerPattern::FMULADDS_OP2);
3454       Found = true;
3455     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3456                                   AArch64::FMULv1i32_indexed)) {
3457       Patterns.push_back(MachineCombinerPattern::FMLAv1i32_indexed_OP2);
3458       Found = true;
3459     }
3460     break;
3461   case AArch64::FADDDrr:
3462     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULDrr)) {
3463       Patterns.push_back(MachineCombinerPattern::FMULADDD_OP1);
3464       Found = true;
3465     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3466                                   AArch64::FMULv1i64_indexed)) {
3467       Patterns.push_back(MachineCombinerPattern::FMLAv1i64_indexed_OP1);
3468       Found = true;
3469     }
3470     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULDrr)) {
3471       Patterns.push_back(MachineCombinerPattern::FMULADDD_OP2);
3472       Found = true;
3473     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3474                                   AArch64::FMULv1i64_indexed)) {
3475       Patterns.push_back(MachineCombinerPattern::FMLAv1i64_indexed_OP2);
3476       Found = true;
3477     }
3478     break;
3479   case AArch64::FADDv2f32:
3480     if (canCombineWithFMUL(MBB, Root.getOperand(1),
3481                            AArch64::FMULv2i32_indexed)) {
3482       Patterns.push_back(MachineCombinerPattern::FMLAv2i32_indexed_OP1);
3483       Found = true;
3484     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3485                                   AArch64::FMULv2f32)) {
3486       Patterns.push_back(MachineCombinerPattern::FMLAv2f32_OP1);
3487       Found = true;
3488     }
3489     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3490                            AArch64::FMULv2i32_indexed)) {
3491       Patterns.push_back(MachineCombinerPattern::FMLAv2i32_indexed_OP2);
3492       Found = true;
3493     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3494                                   AArch64::FMULv2f32)) {
3495       Patterns.push_back(MachineCombinerPattern::FMLAv2f32_OP2);
3496       Found = true;
3497     }
3498     break;
3499   case AArch64::FADDv2f64:
3500     if (canCombineWithFMUL(MBB, Root.getOperand(1),
3501                            AArch64::FMULv2i64_indexed)) {
3502       Patterns.push_back(MachineCombinerPattern::FMLAv2i64_indexed_OP1);
3503       Found = true;
3504     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3505                                   AArch64::FMULv2f64)) {
3506       Patterns.push_back(MachineCombinerPattern::FMLAv2f64_OP1);
3507       Found = true;
3508     }
3509     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3510                            AArch64::FMULv2i64_indexed)) {
3511       Patterns.push_back(MachineCombinerPattern::FMLAv2i64_indexed_OP2);
3512       Found = true;
3513     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3514                                   AArch64::FMULv2f64)) {
3515       Patterns.push_back(MachineCombinerPattern::FMLAv2f64_OP2);
3516       Found = true;
3517     }
3518     break;
3519   case AArch64::FADDv4f32:
3520     if (canCombineWithFMUL(MBB, Root.getOperand(1),
3521                            AArch64::FMULv4i32_indexed)) {
3522       Patterns.push_back(MachineCombinerPattern::FMLAv4i32_indexed_OP1);
3523       Found = true;
3524     } else if (canCombineWithFMUL(MBB, Root.getOperand(1),
3525                                   AArch64::FMULv4f32)) {
3526       Patterns.push_back(MachineCombinerPattern::FMLAv4f32_OP1);
3527       Found = true;
3528     }
3529     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3530                            AArch64::FMULv4i32_indexed)) {
3531       Patterns.push_back(MachineCombinerPattern::FMLAv4i32_indexed_OP2);
3532       Found = true;
3533     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3534                                   AArch64::FMULv4f32)) {
3535       Patterns.push_back(MachineCombinerPattern::FMLAv4f32_OP2);
3536       Found = true;
3537     }
3538     break;
3539 
3540   case AArch64::FSUBSrr:
3541     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULSrr)) {
3542       Patterns.push_back(MachineCombinerPattern::FMULSUBS_OP1);
3543       Found = true;
3544     }
3545     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULSrr)) {
3546       Patterns.push_back(MachineCombinerPattern::FMULSUBS_OP2);
3547       Found = true;
3548     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3549                                   AArch64::FMULv1i32_indexed)) {
3550       Patterns.push_back(MachineCombinerPattern::FMLSv1i32_indexed_OP2);
3551       Found = true;
3552     }
3553     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FNMULSrr)) {
3554       Patterns.push_back(MachineCombinerPattern::FNMULSUBS_OP1);
3555       Found = true;
3556     }
3557     break;
3558   case AArch64::FSUBDrr:
3559     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FMULDrr)) {
3560       Patterns.push_back(MachineCombinerPattern::FMULSUBD_OP1);
3561       Found = true;
3562     }
3563     if (canCombineWithFMUL(MBB, Root.getOperand(2), AArch64::FMULDrr)) {
3564       Patterns.push_back(MachineCombinerPattern::FMULSUBD_OP2);
3565       Found = true;
3566     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3567                                   AArch64::FMULv1i64_indexed)) {
3568       Patterns.push_back(MachineCombinerPattern::FMLSv1i64_indexed_OP2);
3569       Found = true;
3570     }
3571     if (canCombineWithFMUL(MBB, Root.getOperand(1), AArch64::FNMULDrr)) {
3572       Patterns.push_back(MachineCombinerPattern::FNMULSUBD_OP1);
3573       Found = true;
3574     }
3575     break;
3576   case AArch64::FSUBv2f32:
3577     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3578                            AArch64::FMULv2i32_indexed)) {
3579       Patterns.push_back(MachineCombinerPattern::FMLSv2i32_indexed_OP2);
3580       Found = true;
3581     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3582                                   AArch64::FMULv2f32)) {
3583       Patterns.push_back(MachineCombinerPattern::FMLSv2f32_OP2);
3584       Found = true;
3585     }
3586     break;
3587   case AArch64::FSUBv2f64:
3588     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3589                            AArch64::FMULv2i64_indexed)) {
3590       Patterns.push_back(MachineCombinerPattern::FMLSv2i64_indexed_OP2);
3591       Found = true;
3592     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3593                                   AArch64::FMULv2f64)) {
3594       Patterns.push_back(MachineCombinerPattern::FMLSv2f64_OP2);
3595       Found = true;
3596     }
3597     break;
3598   case AArch64::FSUBv4f32:
3599     if (canCombineWithFMUL(MBB, Root.getOperand(2),
3600                            AArch64::FMULv4i32_indexed)) {
3601       Patterns.push_back(MachineCombinerPattern::FMLSv4i32_indexed_OP2);
3602       Found = true;
3603     } else if (canCombineWithFMUL(MBB, Root.getOperand(2),
3604                                   AArch64::FMULv4f32)) {
3605       Patterns.push_back(MachineCombinerPattern::FMLSv4f32_OP2);
3606       Found = true;
3607     }
3608     break;
3609   }
3610   return Found;
3611 }
3612 
3613 /// Return true when a code sequence can improve throughput. It
3614 /// should be called only for instructions in loops.
3615 /// \param Pattern - combiner pattern
3616 bool
3617 AArch64InstrInfo::isThroughputPattern(MachineCombinerPattern Pattern) const {
3618   switch (Pattern) {
3619   default:
3620     break;
3621   case MachineCombinerPattern::FMULADDS_OP1:
3622   case MachineCombinerPattern::FMULADDS_OP2:
3623   case MachineCombinerPattern::FMULSUBS_OP1:
3624   case MachineCombinerPattern::FMULSUBS_OP2:
3625   case MachineCombinerPattern::FMULADDD_OP1:
3626   case MachineCombinerPattern::FMULADDD_OP2:
3627   case MachineCombinerPattern::FMULSUBD_OP1:
3628   case MachineCombinerPattern::FMULSUBD_OP2:
3629   case MachineCombinerPattern::FNMULSUBS_OP1:
3630   case MachineCombinerPattern::FNMULSUBD_OP1:
3631   case MachineCombinerPattern::FMLAv1i32_indexed_OP1:
3632   case MachineCombinerPattern::FMLAv1i32_indexed_OP2:
3633   case MachineCombinerPattern::FMLAv1i64_indexed_OP1:
3634   case MachineCombinerPattern::FMLAv1i64_indexed_OP2:
3635   case MachineCombinerPattern::FMLAv2f32_OP2:
3636   case MachineCombinerPattern::FMLAv2f32_OP1:
3637   case MachineCombinerPattern::FMLAv2f64_OP1:
3638   case MachineCombinerPattern::FMLAv2f64_OP2:
3639   case MachineCombinerPattern::FMLAv2i32_indexed_OP1:
3640   case MachineCombinerPattern::FMLAv2i32_indexed_OP2:
3641   case MachineCombinerPattern::FMLAv2i64_indexed_OP1:
3642   case MachineCombinerPattern::FMLAv2i64_indexed_OP2:
3643   case MachineCombinerPattern::FMLAv4f32_OP1:
3644   case MachineCombinerPattern::FMLAv4f32_OP2:
3645   case MachineCombinerPattern::FMLAv4i32_indexed_OP1:
3646   case MachineCombinerPattern::FMLAv4i32_indexed_OP2:
3647   case MachineCombinerPattern::FMLSv1i32_indexed_OP2:
3648   case MachineCombinerPattern::FMLSv1i64_indexed_OP2:
3649   case MachineCombinerPattern::FMLSv2i32_indexed_OP2:
3650   case MachineCombinerPattern::FMLSv2i64_indexed_OP2:
3651   case MachineCombinerPattern::FMLSv2f32_OP2:
3652   case MachineCombinerPattern::FMLSv2f64_OP2:
3653   case MachineCombinerPattern::FMLSv4i32_indexed_OP2:
3654   case MachineCombinerPattern::FMLSv4f32_OP2:
3655     return true;
3656   } // end switch (Pattern)
3657   return false;
3658 }
3659 /// Return true when there is potentially a faster code sequence for an
3660 /// instruction chain ending in \p Root. All potential patterns are listed in
3661 /// the \p Pattern vector. Pattern should be sorted in priority order since the
3662 /// pattern evaluator stops checking as soon as it finds a faster sequence.
3663 
3664 bool AArch64InstrInfo::getMachineCombinerPatterns(
3665     MachineInstr &Root,
3666     SmallVectorImpl<MachineCombinerPattern> &Patterns) const {
3667   // Integer patterns
3668   if (getMaddPatterns(Root, Patterns))
3669     return true;
3670   // Floating point patterns
3671   if (getFMAPatterns(Root, Patterns))
3672     return true;
3673 
3674   return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns);
3675 }
3676 
3677 enum class FMAInstKind { Default, Indexed, Accumulator };
3678 /// genFusedMultiply - Generate fused multiply instructions.
3679 /// This function supports both integer and floating point instructions.
3680 /// A typical example:
3681 ///  F|MUL I=A,B,0
3682 ///  F|ADD R,I,C
3683 ///  ==> F|MADD R,A,B,C
3684 /// \param MF Containing MachineFunction
3685 /// \param MRI Register information
3686 /// \param TII Target information
3687 /// \param Root is the F|ADD instruction
3688 /// \param [out] InsInstrs is a vector of machine instructions and will
3689 /// contain the generated madd instruction
3690 /// \param IdxMulOpd is index of operand in Root that is the result of
3691 /// the F|MUL. In the example above IdxMulOpd is 1.
3692 /// \param MaddOpc the opcode fo the f|madd instruction
3693 /// \param RC Register class of operands
3694 /// \param kind of fma instruction (addressing mode) to be generated
3695 static MachineInstr *
3696 genFusedMultiply(MachineFunction &MF, MachineRegisterInfo &MRI,
3697                  const TargetInstrInfo *TII, MachineInstr &Root,
3698                  SmallVectorImpl<MachineInstr *> &InsInstrs, unsigned IdxMulOpd,
3699                  unsigned MaddOpc, const TargetRegisterClass *RC,
3700                  FMAInstKind kind = FMAInstKind::Default) {
3701   assert(IdxMulOpd == 1 || IdxMulOpd == 2);
3702 
3703   unsigned IdxOtherOpd = IdxMulOpd == 1 ? 2 : 1;
3704   MachineInstr *MUL = MRI.getUniqueVRegDef(Root.getOperand(IdxMulOpd).getReg());
3705   unsigned ResultReg = Root.getOperand(0).getReg();
3706   unsigned SrcReg0 = MUL->getOperand(1).getReg();
3707   bool Src0IsKill = MUL->getOperand(1).isKill();
3708   unsigned SrcReg1 = MUL->getOperand(2).getReg();
3709   bool Src1IsKill = MUL->getOperand(2).isKill();
3710   unsigned SrcReg2 = Root.getOperand(IdxOtherOpd).getReg();
3711   bool Src2IsKill = Root.getOperand(IdxOtherOpd).isKill();
3712 
3713   if (TargetRegisterInfo::isVirtualRegister(ResultReg))
3714     MRI.constrainRegClass(ResultReg, RC);
3715   if (TargetRegisterInfo::isVirtualRegister(SrcReg0))
3716     MRI.constrainRegClass(SrcReg0, RC);
3717   if (TargetRegisterInfo::isVirtualRegister(SrcReg1))
3718     MRI.constrainRegClass(SrcReg1, RC);
3719   if (TargetRegisterInfo::isVirtualRegister(SrcReg2))
3720     MRI.constrainRegClass(SrcReg2, RC);
3721 
3722   MachineInstrBuilder MIB;
3723   if (kind == FMAInstKind::Default)
3724     MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc), ResultReg)
3725               .addReg(SrcReg0, getKillRegState(Src0IsKill))
3726               .addReg(SrcReg1, getKillRegState(Src1IsKill))
3727               .addReg(SrcReg2, getKillRegState(Src2IsKill));
3728   else if (kind == FMAInstKind::Indexed)
3729     MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc), ResultReg)
3730               .addReg(SrcReg2, getKillRegState(Src2IsKill))
3731               .addReg(SrcReg0, getKillRegState(Src0IsKill))
3732               .addReg(SrcReg1, getKillRegState(Src1IsKill))
3733               .addImm(MUL->getOperand(3).getImm());
3734   else if (kind == FMAInstKind::Accumulator)
3735     MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc), ResultReg)
3736               .addReg(SrcReg2, getKillRegState(Src2IsKill))
3737               .addReg(SrcReg0, getKillRegState(Src0IsKill))
3738               .addReg(SrcReg1, getKillRegState(Src1IsKill));
3739   else
3740     assert(false && "Invalid FMA instruction kind \n");
3741   // Insert the MADD (MADD, FMA, FMS, FMLA, FMSL)
3742   InsInstrs.push_back(MIB);
3743   return MUL;
3744 }
3745 
3746 /// genMaddR - Generate madd instruction and combine mul and add using
3747 /// an extra virtual register
3748 /// Example - an ADD intermediate needs to be stored in a register:
3749 ///   MUL I=A,B,0
3750 ///   ADD R,I,Imm
3751 ///   ==> ORR  V, ZR, Imm
3752 ///   ==> MADD R,A,B,V
3753 /// \param MF Containing MachineFunction
3754 /// \param MRI Register information
3755 /// \param TII Target information
3756 /// \param Root is the ADD instruction
3757 /// \param [out] InsInstrs is a vector of machine instructions and will
3758 /// contain the generated madd instruction
3759 /// \param IdxMulOpd is index of operand in Root that is the result of
3760 /// the MUL. In the example above IdxMulOpd is 1.
3761 /// \param MaddOpc the opcode fo the madd instruction
3762 /// \param VR is a virtual register that holds the value of an ADD operand
3763 /// (V in the example above).
3764 /// \param RC Register class of operands
3765 static MachineInstr *genMaddR(MachineFunction &MF, MachineRegisterInfo &MRI,
3766                               const TargetInstrInfo *TII, MachineInstr &Root,
3767                               SmallVectorImpl<MachineInstr *> &InsInstrs,
3768                               unsigned IdxMulOpd, unsigned MaddOpc,
3769                               unsigned VR, const TargetRegisterClass *RC) {
3770   assert(IdxMulOpd == 1 || IdxMulOpd == 2);
3771 
3772   MachineInstr *MUL = MRI.getUniqueVRegDef(Root.getOperand(IdxMulOpd).getReg());
3773   unsigned ResultReg = Root.getOperand(0).getReg();
3774   unsigned SrcReg0 = MUL->getOperand(1).getReg();
3775   bool Src0IsKill = MUL->getOperand(1).isKill();
3776   unsigned SrcReg1 = MUL->getOperand(2).getReg();
3777   bool Src1IsKill = MUL->getOperand(2).isKill();
3778 
3779   if (TargetRegisterInfo::isVirtualRegister(ResultReg))
3780     MRI.constrainRegClass(ResultReg, RC);
3781   if (TargetRegisterInfo::isVirtualRegister(SrcReg0))
3782     MRI.constrainRegClass(SrcReg0, RC);
3783   if (TargetRegisterInfo::isVirtualRegister(SrcReg1))
3784     MRI.constrainRegClass(SrcReg1, RC);
3785   if (TargetRegisterInfo::isVirtualRegister(VR))
3786     MRI.constrainRegClass(VR, RC);
3787 
3788   MachineInstrBuilder MIB = BuildMI(MF, Root.getDebugLoc(), TII->get(MaddOpc),
3789                                     ResultReg)
3790                                 .addReg(SrcReg0, getKillRegState(Src0IsKill))
3791                                 .addReg(SrcReg1, getKillRegState(Src1IsKill))
3792                                 .addReg(VR);
3793   // Insert the MADD
3794   InsInstrs.push_back(MIB);
3795   return MUL;
3796 }
3797 
3798 /// When getMachineCombinerPatterns() finds potential patterns,
3799 /// this function generates the instructions that could replace the
3800 /// original code sequence
3801 void AArch64InstrInfo::genAlternativeCodeSequence(
3802     MachineInstr &Root, MachineCombinerPattern Pattern,
3803     SmallVectorImpl<MachineInstr *> &InsInstrs,
3804     SmallVectorImpl<MachineInstr *> &DelInstrs,
3805     DenseMap<unsigned, unsigned> &InstrIdxForVirtReg) const {
3806   MachineBasicBlock &MBB = *Root.getParent();
3807   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
3808   MachineFunction &MF = *MBB.getParent();
3809   const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
3810 
3811   MachineInstr *MUL;
3812   const TargetRegisterClass *RC;
3813   unsigned Opc;
3814   switch (Pattern) {
3815   default:
3816     // Reassociate instructions.
3817     TargetInstrInfo::genAlternativeCodeSequence(Root, Pattern, InsInstrs,
3818                                                 DelInstrs, InstrIdxForVirtReg);
3819     return;
3820   case MachineCombinerPattern::MULADDW_OP1:
3821   case MachineCombinerPattern::MULADDX_OP1:
3822     // MUL I=A,B,0
3823     // ADD R,I,C
3824     // ==> MADD R,A,B,C
3825     // --- Create(MADD);
3826     if (Pattern == MachineCombinerPattern::MULADDW_OP1) {
3827       Opc = AArch64::MADDWrrr;
3828       RC = &AArch64::GPR32RegClass;
3829     } else {
3830       Opc = AArch64::MADDXrrr;
3831       RC = &AArch64::GPR64RegClass;
3832     }
3833     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
3834     break;
3835   case MachineCombinerPattern::MULADDW_OP2:
3836   case MachineCombinerPattern::MULADDX_OP2:
3837     // MUL I=A,B,0
3838     // ADD R,C,I
3839     // ==> MADD R,A,B,C
3840     // --- Create(MADD);
3841     if (Pattern == MachineCombinerPattern::MULADDW_OP2) {
3842       Opc = AArch64::MADDWrrr;
3843       RC = &AArch64::GPR32RegClass;
3844     } else {
3845       Opc = AArch64::MADDXrrr;
3846       RC = &AArch64::GPR64RegClass;
3847     }
3848     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
3849     break;
3850   case MachineCombinerPattern::MULADDWI_OP1:
3851   case MachineCombinerPattern::MULADDXI_OP1: {
3852     // MUL I=A,B,0
3853     // ADD R,I,Imm
3854     // ==> ORR  V, ZR, Imm
3855     // ==> MADD R,A,B,V
3856     // --- Create(MADD);
3857     const TargetRegisterClass *OrrRC;
3858     unsigned BitSize, OrrOpc, ZeroReg;
3859     if (Pattern == MachineCombinerPattern::MULADDWI_OP1) {
3860       OrrOpc = AArch64::ORRWri;
3861       OrrRC = &AArch64::GPR32spRegClass;
3862       BitSize = 32;
3863       ZeroReg = AArch64::WZR;
3864       Opc = AArch64::MADDWrrr;
3865       RC = &AArch64::GPR32RegClass;
3866     } else {
3867       OrrOpc = AArch64::ORRXri;
3868       OrrRC = &AArch64::GPR64spRegClass;
3869       BitSize = 64;
3870       ZeroReg = AArch64::XZR;
3871       Opc = AArch64::MADDXrrr;
3872       RC = &AArch64::GPR64RegClass;
3873     }
3874     unsigned NewVR = MRI.createVirtualRegister(OrrRC);
3875     uint64_t Imm = Root.getOperand(2).getImm();
3876 
3877     if (Root.getOperand(3).isImm()) {
3878       unsigned Val = Root.getOperand(3).getImm();
3879       Imm = Imm << Val;
3880     }
3881     uint64_t UImm = SignExtend64(Imm, BitSize);
3882     uint64_t Encoding;
3883     if (AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding)) {
3884       MachineInstrBuilder MIB1 =
3885           BuildMI(MF, Root.getDebugLoc(), TII->get(OrrOpc), NewVR)
3886               .addReg(ZeroReg)
3887               .addImm(Encoding);
3888       InsInstrs.push_back(MIB1);
3889       InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
3890       MUL = genMaddR(MF, MRI, TII, Root, InsInstrs, 1, Opc, NewVR, RC);
3891     }
3892     break;
3893   }
3894   case MachineCombinerPattern::MULSUBW_OP1:
3895   case MachineCombinerPattern::MULSUBX_OP1: {
3896     // MUL I=A,B,0
3897     // SUB R,I, C
3898     // ==> SUB  V, 0, C
3899     // ==> MADD R,A,B,V // = -C + A*B
3900     // --- Create(MADD);
3901     const TargetRegisterClass *SubRC;
3902     unsigned SubOpc, ZeroReg;
3903     if (Pattern == MachineCombinerPattern::MULSUBW_OP1) {
3904       SubOpc = AArch64::SUBWrr;
3905       SubRC = &AArch64::GPR32spRegClass;
3906       ZeroReg = AArch64::WZR;
3907       Opc = AArch64::MADDWrrr;
3908       RC = &AArch64::GPR32RegClass;
3909     } else {
3910       SubOpc = AArch64::SUBXrr;
3911       SubRC = &AArch64::GPR64spRegClass;
3912       ZeroReg = AArch64::XZR;
3913       Opc = AArch64::MADDXrrr;
3914       RC = &AArch64::GPR64RegClass;
3915     }
3916     unsigned NewVR = MRI.createVirtualRegister(SubRC);
3917     // SUB NewVR, 0, C
3918     MachineInstrBuilder MIB1 =
3919         BuildMI(MF, Root.getDebugLoc(), TII->get(SubOpc), NewVR)
3920             .addReg(ZeroReg)
3921             .add(Root.getOperand(2));
3922     InsInstrs.push_back(MIB1);
3923     InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
3924     MUL = genMaddR(MF, MRI, TII, Root, InsInstrs, 1, Opc, NewVR, RC);
3925     break;
3926   }
3927   case MachineCombinerPattern::MULSUBW_OP2:
3928   case MachineCombinerPattern::MULSUBX_OP2:
3929     // MUL I=A,B,0
3930     // SUB R,C,I
3931     // ==> MSUB R,A,B,C (computes C - A*B)
3932     // --- Create(MSUB);
3933     if (Pattern == MachineCombinerPattern::MULSUBW_OP2) {
3934       Opc = AArch64::MSUBWrrr;
3935       RC = &AArch64::GPR32RegClass;
3936     } else {
3937       Opc = AArch64::MSUBXrrr;
3938       RC = &AArch64::GPR64RegClass;
3939     }
3940     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
3941     break;
3942   case MachineCombinerPattern::MULSUBWI_OP1:
3943   case MachineCombinerPattern::MULSUBXI_OP1: {
3944     // MUL I=A,B,0
3945     // SUB R,I, Imm
3946     // ==> ORR  V, ZR, -Imm
3947     // ==> MADD R,A,B,V // = -Imm + A*B
3948     // --- Create(MADD);
3949     const TargetRegisterClass *OrrRC;
3950     unsigned BitSize, OrrOpc, ZeroReg;
3951     if (Pattern == MachineCombinerPattern::MULSUBWI_OP1) {
3952       OrrOpc = AArch64::ORRWri;
3953       OrrRC = &AArch64::GPR32spRegClass;
3954       BitSize = 32;
3955       ZeroReg = AArch64::WZR;
3956       Opc = AArch64::MADDWrrr;
3957       RC = &AArch64::GPR32RegClass;
3958     } else {
3959       OrrOpc = AArch64::ORRXri;
3960       OrrRC = &AArch64::GPR64spRegClass;
3961       BitSize = 64;
3962       ZeroReg = AArch64::XZR;
3963       Opc = AArch64::MADDXrrr;
3964       RC = &AArch64::GPR64RegClass;
3965     }
3966     unsigned NewVR = MRI.createVirtualRegister(OrrRC);
3967     uint64_t Imm = Root.getOperand(2).getImm();
3968     if (Root.getOperand(3).isImm()) {
3969       unsigned Val = Root.getOperand(3).getImm();
3970       Imm = Imm << Val;
3971     }
3972     uint64_t UImm = SignExtend64(-Imm, BitSize);
3973     uint64_t Encoding;
3974     if (AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding)) {
3975       MachineInstrBuilder MIB1 =
3976           BuildMI(MF, Root.getDebugLoc(), TII->get(OrrOpc), NewVR)
3977               .addReg(ZeroReg)
3978               .addImm(Encoding);
3979       InsInstrs.push_back(MIB1);
3980       InstrIdxForVirtReg.insert(std::make_pair(NewVR, 0));
3981       MUL = genMaddR(MF, MRI, TII, Root, InsInstrs, 1, Opc, NewVR, RC);
3982     }
3983     break;
3984   }
3985   // Floating Point Support
3986   case MachineCombinerPattern::FMULADDS_OP1:
3987   case MachineCombinerPattern::FMULADDD_OP1:
3988     // MUL I=A,B,0
3989     // ADD R,I,C
3990     // ==> MADD R,A,B,C
3991     // --- Create(MADD);
3992     if (Pattern == MachineCombinerPattern::FMULADDS_OP1) {
3993       Opc = AArch64::FMADDSrrr;
3994       RC = &AArch64::FPR32RegClass;
3995     } else {
3996       Opc = AArch64::FMADDDrrr;
3997       RC = &AArch64::FPR64RegClass;
3998     }
3999     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
4000     break;
4001   case MachineCombinerPattern::FMULADDS_OP2:
4002   case MachineCombinerPattern::FMULADDD_OP2:
4003     // FMUL I=A,B,0
4004     // FADD R,C,I
4005     // ==> FMADD R,A,B,C
4006     // --- Create(FMADD);
4007     if (Pattern == MachineCombinerPattern::FMULADDS_OP2) {
4008       Opc = AArch64::FMADDSrrr;
4009       RC = &AArch64::FPR32RegClass;
4010     } else {
4011       Opc = AArch64::FMADDDrrr;
4012       RC = &AArch64::FPR64RegClass;
4013     }
4014     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
4015     break;
4016 
4017   case MachineCombinerPattern::FMLAv1i32_indexed_OP1:
4018     Opc = AArch64::FMLAv1i32_indexed;
4019     RC = &AArch64::FPR32RegClass;
4020     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4021                            FMAInstKind::Indexed);
4022     break;
4023   case MachineCombinerPattern::FMLAv1i32_indexed_OP2:
4024     Opc = AArch64::FMLAv1i32_indexed;
4025     RC = &AArch64::FPR32RegClass;
4026     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4027                            FMAInstKind::Indexed);
4028     break;
4029 
4030   case MachineCombinerPattern::FMLAv1i64_indexed_OP1:
4031     Opc = AArch64::FMLAv1i64_indexed;
4032     RC = &AArch64::FPR64RegClass;
4033     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4034                            FMAInstKind::Indexed);
4035     break;
4036   case MachineCombinerPattern::FMLAv1i64_indexed_OP2:
4037     Opc = AArch64::FMLAv1i64_indexed;
4038     RC = &AArch64::FPR64RegClass;
4039     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4040                            FMAInstKind::Indexed);
4041     break;
4042 
4043   case MachineCombinerPattern::FMLAv2i32_indexed_OP1:
4044   case MachineCombinerPattern::FMLAv2f32_OP1:
4045     RC = &AArch64::FPR64RegClass;
4046     if (Pattern == MachineCombinerPattern::FMLAv2i32_indexed_OP1) {
4047       Opc = AArch64::FMLAv2i32_indexed;
4048       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4049                              FMAInstKind::Indexed);
4050     } else {
4051       Opc = AArch64::FMLAv2f32;
4052       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4053                              FMAInstKind::Accumulator);
4054     }
4055     break;
4056   case MachineCombinerPattern::FMLAv2i32_indexed_OP2:
4057   case MachineCombinerPattern::FMLAv2f32_OP2:
4058     RC = &AArch64::FPR64RegClass;
4059     if (Pattern == MachineCombinerPattern::FMLAv2i32_indexed_OP2) {
4060       Opc = AArch64::FMLAv2i32_indexed;
4061       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4062                              FMAInstKind::Indexed);
4063     } else {
4064       Opc = AArch64::FMLAv2f32;
4065       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4066                              FMAInstKind::Accumulator);
4067     }
4068     break;
4069 
4070   case MachineCombinerPattern::FMLAv2i64_indexed_OP1:
4071   case MachineCombinerPattern::FMLAv2f64_OP1:
4072     RC = &AArch64::FPR128RegClass;
4073     if (Pattern == MachineCombinerPattern::FMLAv2i64_indexed_OP1) {
4074       Opc = AArch64::FMLAv2i64_indexed;
4075       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4076                              FMAInstKind::Indexed);
4077     } else {
4078       Opc = AArch64::FMLAv2f64;
4079       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4080                              FMAInstKind::Accumulator);
4081     }
4082     break;
4083   case MachineCombinerPattern::FMLAv2i64_indexed_OP2:
4084   case MachineCombinerPattern::FMLAv2f64_OP2:
4085     RC = &AArch64::FPR128RegClass;
4086     if (Pattern == MachineCombinerPattern::FMLAv2i64_indexed_OP2) {
4087       Opc = AArch64::FMLAv2i64_indexed;
4088       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4089                              FMAInstKind::Indexed);
4090     } else {
4091       Opc = AArch64::FMLAv2f64;
4092       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4093                              FMAInstKind::Accumulator);
4094     }
4095     break;
4096 
4097   case MachineCombinerPattern::FMLAv4i32_indexed_OP1:
4098   case MachineCombinerPattern::FMLAv4f32_OP1:
4099     RC = &AArch64::FPR128RegClass;
4100     if (Pattern == MachineCombinerPattern::FMLAv4i32_indexed_OP1) {
4101       Opc = AArch64::FMLAv4i32_indexed;
4102       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4103                              FMAInstKind::Indexed);
4104     } else {
4105       Opc = AArch64::FMLAv4f32;
4106       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC,
4107                              FMAInstKind::Accumulator);
4108     }
4109     break;
4110 
4111   case MachineCombinerPattern::FMLAv4i32_indexed_OP2:
4112   case MachineCombinerPattern::FMLAv4f32_OP2:
4113     RC = &AArch64::FPR128RegClass;
4114     if (Pattern == MachineCombinerPattern::FMLAv4i32_indexed_OP2) {
4115       Opc = AArch64::FMLAv4i32_indexed;
4116       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4117                              FMAInstKind::Indexed);
4118     } else {
4119       Opc = AArch64::FMLAv4f32;
4120       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4121                              FMAInstKind::Accumulator);
4122     }
4123     break;
4124 
4125   case MachineCombinerPattern::FMULSUBS_OP1:
4126   case MachineCombinerPattern::FMULSUBD_OP1: {
4127     // FMUL I=A,B,0
4128     // FSUB R,I,C
4129     // ==> FNMSUB R,A,B,C // = -C + A*B
4130     // --- Create(FNMSUB);
4131     if (Pattern == MachineCombinerPattern::FMULSUBS_OP1) {
4132       Opc = AArch64::FNMSUBSrrr;
4133       RC = &AArch64::FPR32RegClass;
4134     } else {
4135       Opc = AArch64::FNMSUBDrrr;
4136       RC = &AArch64::FPR64RegClass;
4137     }
4138     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
4139     break;
4140   }
4141 
4142   case MachineCombinerPattern::FNMULSUBS_OP1:
4143   case MachineCombinerPattern::FNMULSUBD_OP1: {
4144     // FNMUL I=A,B,0
4145     // FSUB R,I,C
4146     // ==> FNMADD R,A,B,C // = -A*B - C
4147     // --- Create(FNMADD);
4148     if (Pattern == MachineCombinerPattern::FNMULSUBS_OP1) {
4149       Opc = AArch64::FNMADDSrrr;
4150       RC = &AArch64::FPR32RegClass;
4151     } else {
4152       Opc = AArch64::FNMADDDrrr;
4153       RC = &AArch64::FPR64RegClass;
4154     }
4155     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 1, Opc, RC);
4156     break;
4157   }
4158 
4159   case MachineCombinerPattern::FMULSUBS_OP2:
4160   case MachineCombinerPattern::FMULSUBD_OP2: {
4161     // FMUL I=A,B,0
4162     // FSUB R,C,I
4163     // ==> FMSUB R,A,B,C (computes C - A*B)
4164     // --- Create(FMSUB);
4165     if (Pattern == MachineCombinerPattern::FMULSUBS_OP2) {
4166       Opc = AArch64::FMSUBSrrr;
4167       RC = &AArch64::FPR32RegClass;
4168     } else {
4169       Opc = AArch64::FMSUBDrrr;
4170       RC = &AArch64::FPR64RegClass;
4171     }
4172     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC);
4173     break;
4174   }
4175 
4176   case MachineCombinerPattern::FMLSv1i32_indexed_OP2:
4177     Opc = AArch64::FMLSv1i32_indexed;
4178     RC = &AArch64::FPR32RegClass;
4179     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4180                            FMAInstKind::Indexed);
4181     break;
4182 
4183   case MachineCombinerPattern::FMLSv1i64_indexed_OP2:
4184     Opc = AArch64::FMLSv1i64_indexed;
4185     RC = &AArch64::FPR64RegClass;
4186     MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4187                            FMAInstKind::Indexed);
4188     break;
4189 
4190   case MachineCombinerPattern::FMLSv2f32_OP2:
4191   case MachineCombinerPattern::FMLSv2i32_indexed_OP2:
4192     RC = &AArch64::FPR64RegClass;
4193     if (Pattern == MachineCombinerPattern::FMLSv2i32_indexed_OP2) {
4194       Opc = AArch64::FMLSv2i32_indexed;
4195       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4196                              FMAInstKind::Indexed);
4197     } else {
4198       Opc = AArch64::FMLSv2f32;
4199       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4200                              FMAInstKind::Accumulator);
4201     }
4202     break;
4203 
4204   case MachineCombinerPattern::FMLSv2f64_OP2:
4205   case MachineCombinerPattern::FMLSv2i64_indexed_OP2:
4206     RC = &AArch64::FPR128RegClass;
4207     if (Pattern == MachineCombinerPattern::FMLSv2i64_indexed_OP2) {
4208       Opc = AArch64::FMLSv2i64_indexed;
4209       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4210                              FMAInstKind::Indexed);
4211     } else {
4212       Opc = AArch64::FMLSv2f64;
4213       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4214                              FMAInstKind::Accumulator);
4215     }
4216     break;
4217 
4218   case MachineCombinerPattern::FMLSv4f32_OP2:
4219   case MachineCombinerPattern::FMLSv4i32_indexed_OP2:
4220     RC = &AArch64::FPR128RegClass;
4221     if (Pattern == MachineCombinerPattern::FMLSv4i32_indexed_OP2) {
4222       Opc = AArch64::FMLSv4i32_indexed;
4223       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4224                              FMAInstKind::Indexed);
4225     } else {
4226       Opc = AArch64::FMLSv4f32;
4227       MUL = genFusedMultiply(MF, MRI, TII, Root, InsInstrs, 2, Opc, RC,
4228                              FMAInstKind::Accumulator);
4229     }
4230     break;
4231   } // end switch (Pattern)
4232   // Record MUL and ADD/SUB for deletion
4233   DelInstrs.push_back(MUL);
4234   DelInstrs.push_back(&Root);
4235 }
4236 
4237 /// \brief Replace csincr-branch sequence by simple conditional branch
4238 ///
4239 /// Examples:
4240 /// 1. \code
4241 ///   csinc  w9, wzr, wzr, <condition code>
4242 ///   tbnz   w9, #0, 0x44
4243 ///    \endcode
4244 /// to
4245 ///    \code
4246 ///   b.<inverted condition code>
4247 ///    \endcode
4248 ///
4249 /// 2. \code
4250 ///   csinc w9, wzr, wzr, <condition code>
4251 ///   tbz   w9, #0, 0x44
4252 ///    \endcode
4253 /// to
4254 ///    \code
4255 ///   b.<condition code>
4256 ///    \endcode
4257 ///
4258 /// Replace compare and branch sequence by TBZ/TBNZ instruction when the
4259 /// compare's constant operand is power of 2.
4260 ///
4261 /// Examples:
4262 ///    \code
4263 ///   and  w8, w8, #0x400
4264 ///   cbnz w8, L1
4265 ///    \endcode
4266 /// to
4267 ///    \code
4268 ///   tbnz w8, #10, L1
4269 ///    \endcode
4270 ///
4271 /// \param  MI Conditional Branch
4272 /// \return True when the simple conditional branch is generated
4273 ///
4274 bool AArch64InstrInfo::optimizeCondBranch(MachineInstr &MI) const {
4275   bool IsNegativeBranch = false;
4276   bool IsTestAndBranch = false;
4277   unsigned TargetBBInMI = 0;
4278   switch (MI.getOpcode()) {
4279   default:
4280     llvm_unreachable("Unknown branch instruction?");
4281   case AArch64::Bcc:
4282     return false;
4283   case AArch64::CBZW:
4284   case AArch64::CBZX:
4285     TargetBBInMI = 1;
4286     break;
4287   case AArch64::CBNZW:
4288   case AArch64::CBNZX:
4289     TargetBBInMI = 1;
4290     IsNegativeBranch = true;
4291     break;
4292   case AArch64::TBZW:
4293   case AArch64::TBZX:
4294     TargetBBInMI = 2;
4295     IsTestAndBranch = true;
4296     break;
4297   case AArch64::TBNZW:
4298   case AArch64::TBNZX:
4299     TargetBBInMI = 2;
4300     IsNegativeBranch = true;
4301     IsTestAndBranch = true;
4302     break;
4303   }
4304   // So we increment a zero register and test for bits other
4305   // than bit 0? Conservatively bail out in case the verifier
4306   // missed this case.
4307   if (IsTestAndBranch && MI.getOperand(1).getImm())
4308     return false;
4309 
4310   // Find Definition.
4311   assert(MI.getParent() && "Incomplete machine instruciton\n");
4312   MachineBasicBlock *MBB = MI.getParent();
4313   MachineFunction *MF = MBB->getParent();
4314   MachineRegisterInfo *MRI = &MF->getRegInfo();
4315   unsigned VReg = MI.getOperand(0).getReg();
4316   if (!TargetRegisterInfo::isVirtualRegister(VReg))
4317     return false;
4318 
4319   MachineInstr *DefMI = MRI->getVRegDef(VReg);
4320 
4321   // Look through COPY instructions to find definition.
4322   while (DefMI->isCopy()) {
4323     unsigned CopyVReg = DefMI->getOperand(1).getReg();
4324     if (!MRI->hasOneNonDBGUse(CopyVReg))
4325       return false;
4326     if (!MRI->hasOneDef(CopyVReg))
4327       return false;
4328     DefMI = MRI->getVRegDef(CopyVReg);
4329   }
4330 
4331   switch (DefMI->getOpcode()) {
4332   default:
4333     return false;
4334   // Fold AND into a TBZ/TBNZ if constant operand is power of 2.
4335   case AArch64::ANDWri:
4336   case AArch64::ANDXri: {
4337     if (IsTestAndBranch)
4338       return false;
4339     if (DefMI->getParent() != MBB)
4340       return false;
4341     if (!MRI->hasOneNonDBGUse(VReg))
4342       return false;
4343 
4344     bool Is32Bit = (DefMI->getOpcode() == AArch64::ANDWri);
4345     uint64_t Mask = AArch64_AM::decodeLogicalImmediate(
4346         DefMI->getOperand(2).getImm(), Is32Bit ? 32 : 64);
4347     if (!isPowerOf2_64(Mask))
4348       return false;
4349 
4350     MachineOperand &MO = DefMI->getOperand(1);
4351     unsigned NewReg = MO.getReg();
4352     if (!TargetRegisterInfo::isVirtualRegister(NewReg))
4353       return false;
4354 
4355     assert(!MRI->def_empty(NewReg) && "Register must be defined.");
4356 
4357     MachineBasicBlock &RefToMBB = *MBB;
4358     MachineBasicBlock *TBB = MI.getOperand(1).getMBB();
4359     DebugLoc DL = MI.getDebugLoc();
4360     unsigned Imm = Log2_64(Mask);
4361     unsigned Opc = (Imm < 32)
4362                        ? (IsNegativeBranch ? AArch64::TBNZW : AArch64::TBZW)
4363                        : (IsNegativeBranch ? AArch64::TBNZX : AArch64::TBZX);
4364     MachineInstr *NewMI = BuildMI(RefToMBB, MI, DL, get(Opc))
4365                               .addReg(NewReg)
4366                               .addImm(Imm)
4367                               .addMBB(TBB);
4368     // Register lives on to the CBZ now.
4369     MO.setIsKill(false);
4370 
4371     // For immediate smaller than 32, we need to use the 32-bit
4372     // variant (W) in all cases. Indeed the 64-bit variant does not
4373     // allow to encode them.
4374     // Therefore, if the input register is 64-bit, we need to take the
4375     // 32-bit sub-part.
4376     if (!Is32Bit && Imm < 32)
4377       NewMI->getOperand(0).setSubReg(AArch64::sub_32);
4378     MI.eraseFromParent();
4379     return true;
4380   }
4381   // Look for CSINC
4382   case AArch64::CSINCWr:
4383   case AArch64::CSINCXr: {
4384     if (!(DefMI->getOperand(1).getReg() == AArch64::WZR &&
4385           DefMI->getOperand(2).getReg() == AArch64::WZR) &&
4386         !(DefMI->getOperand(1).getReg() == AArch64::XZR &&
4387           DefMI->getOperand(2).getReg() == AArch64::XZR))
4388       return false;
4389 
4390     if (DefMI->findRegisterDefOperandIdx(AArch64::NZCV, true) != -1)
4391       return false;
4392 
4393     AArch64CC::CondCode CC = (AArch64CC::CondCode)DefMI->getOperand(3).getImm();
4394     // Convert only when the condition code is not modified between
4395     // the CSINC and the branch. The CC may be used by other
4396     // instructions in between.
4397     if (areCFlagsAccessedBetweenInstrs(DefMI, MI, &getRegisterInfo(), AK_Write))
4398       return false;
4399     MachineBasicBlock &RefToMBB = *MBB;
4400     MachineBasicBlock *TBB = MI.getOperand(TargetBBInMI).getMBB();
4401     DebugLoc DL = MI.getDebugLoc();
4402     if (IsNegativeBranch)
4403       CC = AArch64CC::getInvertedCondCode(CC);
4404     BuildMI(RefToMBB, MI, DL, get(AArch64::Bcc)).addImm(CC).addMBB(TBB);
4405     MI.eraseFromParent();
4406     return true;
4407   }
4408   }
4409 }
4410 
4411 std::pair<unsigned, unsigned>
4412 AArch64InstrInfo::decomposeMachineOperandsTargetFlags(unsigned TF) const {
4413   const unsigned Mask = AArch64II::MO_FRAGMENT;
4414   return std::make_pair(TF & Mask, TF & ~Mask);
4415 }
4416 
4417 ArrayRef<std::pair<unsigned, const char *>>
4418 AArch64InstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
4419   using namespace AArch64II;
4420 
4421   static const std::pair<unsigned, const char *> TargetFlags[] = {
4422       {MO_PAGE, "aarch64-page"},
4423       {MO_PAGEOFF, "aarch64-pageoff"},
4424       {MO_G3, "aarch64-g3"},
4425       {MO_G2, "aarch64-g2"},
4426       {MO_G1, "aarch64-g1"},
4427       {MO_G0, "aarch64-g0"},
4428       {MO_HI12, "aarch64-hi12"}};
4429   return makeArrayRef(TargetFlags);
4430 }
4431 
4432 ArrayRef<std::pair<unsigned, const char *>>
4433 AArch64InstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const {
4434   using namespace AArch64II;
4435 
4436   static const std::pair<unsigned, const char *> TargetFlags[] = {
4437       {MO_GOT, "aarch64-got"},
4438       {MO_NC, "aarch64-nc"},
4439       {MO_TLS, "aarch64-tls"}};
4440   return makeArrayRef(TargetFlags);
4441 }
4442 
4443 ArrayRef<std::pair<MachineMemOperand::Flags, const char *>>
4444 AArch64InstrInfo::getSerializableMachineMemOperandTargetFlags() const {
4445   static const std::pair<MachineMemOperand::Flags, const char *> TargetFlags[] =
4446       {{MOSuppressPair, "aarch64-suppress-pair"},
4447        {MOStridedAccess, "aarch64-strided-access"}};
4448   return makeArrayRef(TargetFlags);
4449 }
4450 
4451 unsigned AArch64InstrInfo::getOutliningBenefit(size_t SequenceSize,
4452                                                size_t Occurrences,
4453                                                bool CanBeTailCall) const {
4454   unsigned NotOutlinedSize = SequenceSize * Occurrences;
4455   unsigned OutlinedSize;
4456 
4457   // Is this candidate something we can outline as a tail call?
4458   if (CanBeTailCall) {
4459     // If yes, then we just outline the sequence and replace each of its
4460     // occurrences with a branch instruction.
4461     OutlinedSize = SequenceSize + Occurrences;
4462   } else {
4463     // If no, then we outline the sequence (SequenceSize), add a return (+1),
4464     // and replace each occurrence with a save/restore to LR and a call
4465     // (3 * Occurrences)
4466     OutlinedSize = (SequenceSize + 1) + (3 * Occurrences);
4467   }
4468 
4469   // Return the number of instructions saved by outlining this sequence.
4470   return NotOutlinedSize > OutlinedSize ? NotOutlinedSize - OutlinedSize : 0;
4471 }
4472 
4473 bool AArch64InstrInfo::isFunctionSafeToOutlineFrom(MachineFunction &MF) const {
4474   return MF.getFunction()->hasFnAttribute(Attribute::NoRedZone);
4475 }
4476 
4477 AArch64GenInstrInfo::MachineOutlinerInstrType
4478 AArch64InstrInfo::getOutliningType(MachineInstr &MI) const {
4479 
4480   MachineFunction *MF = MI.getParent()->getParent();
4481   AArch64FunctionInfo *FuncInfo = MF->getInfo<AArch64FunctionInfo>();
4482 
4483   // Don't outline LOHs.
4484   if (FuncInfo->getLOHRelated().count(&MI))
4485     return MachineOutlinerInstrType::Illegal;
4486 
4487   // Don't allow debug values to impact outlining type.
4488   if (MI.isDebugValue() || MI.isIndirectDebugValue())
4489     return MachineOutlinerInstrType::Invisible;
4490 
4491   // Is this a terminator for a basic block?
4492   if (MI.isTerminator()) {
4493 
4494     // Is this the end of a function?
4495     if (MI.getParent()->succ_empty())
4496         return MachineOutlinerInstrType::Legal;
4497 
4498     // It's not, so don't outline it.
4499     return MachineOutlinerInstrType::Illegal;
4500   }
4501 
4502   // Don't outline positions.
4503   if (MI.isPosition())
4504     return MachineOutlinerInstrType::Illegal;
4505 
4506   // Make sure none of the operands are un-outlinable.
4507   for (const MachineOperand &MOP : MI.operands())
4508     if (MOP.isCPI() || MOP.isJTI() || MOP.isCFIIndex() || MOP.isFI() ||
4509         MOP.isTargetIndex())
4510       return MachineOutlinerInstrType::Illegal;
4511 
4512   // Don't outline anything that uses the link register.
4513   if (MI.modifiesRegister(AArch64::LR, &RI) ||
4514       MI.readsRegister(AArch64::LR, &RI))
4515       return MachineOutlinerInstrType::Illegal;
4516 
4517   // Does this use the stack?
4518   if (MI.modifiesRegister(AArch64::SP, &RI) ||
4519       MI.readsRegister(AArch64::SP, &RI)) {
4520 
4521     // Is it a memory operation?
4522     if (MI.mayLoadOrStore()) {
4523       unsigned Base; // Filled with the base regiser of MI.
4524       int64_t Offset; // Filled with the offset of MI.
4525       unsigned DummyWidth;
4526 
4527       // Does it allow us to offset the base register and is the base SP?
4528       if (!getMemOpBaseRegImmOfsWidth(MI, Base, Offset, DummyWidth, &RI) ||
4529                                       Base != AArch64::SP)
4530         return MachineOutlinerInstrType::Illegal;
4531 
4532       // Find the minimum/maximum offset for this instruction and check if
4533       // fixing it up would be in range.
4534       int64_t MinOffset, MaxOffset;
4535       unsigned DummyScale;
4536       getMemOpInfo(MI.getOpcode(), DummyScale, DummyWidth, MinOffset,
4537                    MaxOffset);
4538 
4539       // TODO: We should really test what happens if an instruction overflows.
4540       // This is tricky to test with IR tests, but when the outliner is moved
4541       // to a MIR test, it really ought to be checked.
4542       if (Offset + 16 < MinOffset || Offset + 16 > MaxOffset)
4543 	return MachineOutlinerInstrType::Illegal;
4544 
4545       // It's in range, so we can outline it.
4546       return MachineOutlinerInstrType::Legal;
4547     }
4548 
4549     // We can't fix it up, so don't outline it.
4550     return MachineOutlinerInstrType::Illegal;
4551   }
4552 
4553   return MachineOutlinerInstrType::Legal;
4554 }
4555 
4556 void AArch64InstrInfo::fixupPostOutline(MachineBasicBlock &MBB) const {
4557   for (MachineInstr &MI : MBB) {
4558     unsigned Base, Width;
4559     int64_t Offset;
4560 
4561     // Is this a load or store with an immediate offset with SP as the base?
4562     if (!MI.mayLoadOrStore() ||
4563         !getMemOpBaseRegImmOfsWidth(MI, Base, Offset, Width, &RI) ||
4564         Base != AArch64::SP)
4565       continue;
4566 
4567     // It is, so we have to fix it up.
4568     unsigned Scale;
4569     int64_t Dummy1, Dummy2;
4570 
4571     MachineOperand &StackOffsetOperand = getMemOpBaseRegImmOfsOffsetOperand(MI);
4572     assert(StackOffsetOperand.isImm() && "Stack offset wasn't immediate!");
4573     getMemOpInfo(MI.getOpcode(), Scale, Width, Dummy1, Dummy2);
4574     assert(Scale != 0 && "Unexpected opcode!");
4575 
4576     // We've pushed the return address to the stack, so add 16 to the offset.
4577     // This is safe, since we already checked if it would overflow when we
4578     // checked if this instruction was legal to outline.
4579     int64_t NewImm = (Offset + 16)/Scale;
4580     StackOffsetOperand.setImm(NewImm);
4581   }
4582 }
4583 
4584 void AArch64InstrInfo::insertOutlinerEpilogue(MachineBasicBlock &MBB,
4585                                               MachineFunction &MF,
4586                                               bool IsTailCall) const {
4587 
4588   // If this is a tail call outlined function, then there's already a return.
4589   if (IsTailCall)
4590     return;
4591 
4592   // It's not a tail call, so we have to insert the return ourselves.
4593   MachineInstr *ret = BuildMI(MF, DebugLoc(), get(AArch64::RET))
4594                           .addReg(AArch64::LR, RegState::Undef);
4595   MBB.insert(MBB.end(), ret);
4596 
4597   // Walk over the basic block and fix up all the stack accesses.
4598   fixupPostOutline(MBB);
4599 }
4600 
4601 void AArch64InstrInfo::insertOutlinerPrologue(MachineBasicBlock &MBB,
4602                                               MachineFunction &MF,
4603                                               bool IsTailCall) const {}
4604 
4605 MachineBasicBlock::iterator AArch64InstrInfo::insertOutlinedCall(
4606     Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It,
4607     MachineFunction &MF, bool IsTailCall) const {
4608 
4609   // Are we tail calling?
4610   if (IsTailCall) {
4611     // If yes, then we can just branch to the label.
4612     It = MBB.insert(It,
4613                     BuildMI(MF, DebugLoc(), get(AArch64::B))
4614                         .addGlobalAddress(M.getNamedValue(MF.getName())));
4615     return It;
4616   }
4617 
4618   // We're not tail calling, so we have to save LR before the call and restore
4619   // it after.
4620   MachineInstr *STRXpre = BuildMI(MF, DebugLoc(), get(AArch64::STRXpre))
4621                               .addReg(AArch64::SP, RegState::Define)
4622                               .addReg(AArch64::LR)
4623                               .addReg(AArch64::SP)
4624                               .addImm(-16);
4625   It = MBB.insert(It, STRXpre);
4626   It++;
4627 
4628   // Insert the call.
4629   It = MBB.insert(It,
4630                   BuildMI(MF, DebugLoc(), get(AArch64::BL))
4631                       .addGlobalAddress(M.getNamedValue(MF.getName())));
4632 
4633   It++;
4634 
4635   // Restore the link register.
4636   MachineInstr *LDRXpost = BuildMI(MF, DebugLoc(), get(AArch64::LDRXpost))
4637                                .addReg(AArch64::SP, RegState::Define)
4638                                .addReg(AArch64::LR)
4639                                .addReg(AArch64::SP)
4640                                .addImm(16);
4641   It = MBB.insert(It, LDRXpost);
4642 
4643   return It;
4644 }
4645 
4646