1 //===- HexagonInstrInfo.cpp - Hexagon 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 Hexagon implementation of the TargetInstrInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "HexagonInstrInfo.h"
15 #include "Hexagon.h"
16 #include "HexagonFrameLowering.h"
17 #include "HexagonHazardRecognizer.h"
18 #include "HexagonRegisterInfo.h"
19 #include "HexagonSubtarget.h"
20 #include "llvm/ADT/ArrayRef.h"
21 #include "llvm/ADT/SmallPtrSet.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/CodeGen/DFAPacketizer.h"
25 #include "llvm/CodeGen/LivePhysRegs.h"
26 #include "llvm/CodeGen/MachineBasicBlock.h"
27 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
28 #include "llvm/CodeGen/MachineFrameInfo.h"
29 #include "llvm/CodeGen/MachineFunction.h"
30 #include "llvm/CodeGen/MachineInstr.h"
31 #include "llvm/CodeGen/MachineInstrBuilder.h"
32 #include "llvm/CodeGen/MachineInstrBundle.h"
33 #include "llvm/CodeGen/MachineLoopInfo.h"
34 #include "llvm/CodeGen/MachineMemOperand.h"
35 #include "llvm/CodeGen/MachineOperand.h"
36 #include "llvm/CodeGen/MachineRegisterInfo.h"
37 #include "llvm/CodeGen/MachineValueType.h"
38 #include "llvm/CodeGen/ScheduleDAG.h"
39 #include "llvm/IR/DebugLoc.h"
40 #include "llvm/MC/MCAsmInfo.h"
41 #include "llvm/MC/MCInstrDesc.h"
42 #include "llvm/MC/MCInstrItineraries.h"
43 #include "llvm/MC/MCRegisterInfo.h"
44 #include "llvm/Support/BranchProbability.h"
45 #include "llvm/Support/CommandLine.h"
46 #include "llvm/Support/Debug.h"
47 #include "llvm/Support/ErrorHandling.h"
48 #include "llvm/Support/MathExtras.h"
49 #include "llvm/Support/raw_ostream.h"
50 #include "llvm/Target/TargetInstrInfo.h"
51 #include "llvm/Target/TargetMachine.h"
52 #include "llvm/Target/TargetOpcodes.h"
53 #include "llvm/Target/TargetRegisterInfo.h"
54 #include "llvm/Target/TargetSubtargetInfo.h"
55 #include <cassert>
56 #include <cctype>
57 #include <cstdint>
58 #include <cstring>
59 #include <iterator>
60 #include <string>
61 #include <utility>
62 
63 using namespace llvm;
64 
65 #define DEBUG_TYPE "hexagon-instrinfo"
66 
67 #define GET_INSTRINFO_CTOR_DTOR
68 #define GET_INSTRMAP_INFO
69 #include "HexagonDepTimingClasses.h"
70 #include "HexagonGenDFAPacketizer.inc"
71 #include "HexagonGenInstrInfo.inc"
72 
73 cl::opt<bool> ScheduleInlineAsm("hexagon-sched-inline-asm", cl::Hidden,
74   cl::init(false), cl::desc("Do not consider inline-asm a scheduling/"
75                             "packetization boundary."));
76 
77 static cl::opt<bool> EnableBranchPrediction("hexagon-enable-branch-prediction",
78   cl::Hidden, cl::init(true), cl::desc("Enable branch prediction"));
79 
80 static cl::opt<bool> DisableNVSchedule("disable-hexagon-nv-schedule",
81   cl::Hidden, cl::ZeroOrMore, cl::init(false),
82   cl::desc("Disable schedule adjustment for new value stores."));
83 
84 static cl::opt<bool> EnableTimingClassLatency(
85   "enable-timing-class-latency", cl::Hidden, cl::init(false),
86   cl::desc("Enable timing class latency"));
87 
88 static cl::opt<bool> EnableALUForwarding(
89   "enable-alu-forwarding", cl::Hidden, cl::init(true),
90   cl::desc("Enable vec alu forwarding"));
91 
92 static cl::opt<bool> EnableACCForwarding(
93   "enable-acc-forwarding", cl::Hidden, cl::init(true),
94   cl::desc("Enable vec acc forwarding"));
95 
96 static cl::opt<bool> BranchRelaxAsmLarge("branch-relax-asm-large",
97   cl::init(true), cl::Hidden, cl::ZeroOrMore, cl::desc("branch relax asm"));
98 
99 static cl::opt<bool> UseDFAHazardRec("dfa-hazard-rec",
100   cl::init(true), cl::Hidden, cl::ZeroOrMore,
101   cl::desc("Use the DFA based hazard recognizer."));
102 
103 /// Constants for Hexagon instructions.
104 const int Hexagon_MEMW_OFFSET_MAX = 4095;
105 const int Hexagon_MEMW_OFFSET_MIN = -4096;
106 const int Hexagon_MEMD_OFFSET_MAX = 8191;
107 const int Hexagon_MEMD_OFFSET_MIN = -8192;
108 const int Hexagon_MEMH_OFFSET_MAX = 2047;
109 const int Hexagon_MEMH_OFFSET_MIN = -2048;
110 const int Hexagon_MEMB_OFFSET_MAX = 1023;
111 const int Hexagon_MEMB_OFFSET_MIN = -1024;
112 const int Hexagon_ADDI_OFFSET_MAX = 32767;
113 const int Hexagon_ADDI_OFFSET_MIN = -32768;
114 
115 // Pin the vtable to this file.
116 void HexagonInstrInfo::anchor() {}
117 
118 HexagonInstrInfo::HexagonInstrInfo(HexagonSubtarget &ST)
119   : HexagonGenInstrInfo(Hexagon::ADJCALLSTACKDOWN, Hexagon::ADJCALLSTACKUP),
120     Subtarget(ST) {}
121 
122 static bool isIntRegForSubInst(unsigned Reg) {
123   return (Reg >= Hexagon::R0 && Reg <= Hexagon::R7) ||
124          (Reg >= Hexagon::R16 && Reg <= Hexagon::R23);
125 }
126 
127 static bool isDblRegForSubInst(unsigned Reg, const HexagonRegisterInfo &HRI) {
128   return isIntRegForSubInst(HRI.getSubReg(Reg, Hexagon::isub_lo)) &&
129          isIntRegForSubInst(HRI.getSubReg(Reg, Hexagon::isub_hi));
130 }
131 
132 /// Calculate number of instructions excluding the debug instructions.
133 static unsigned nonDbgMICount(MachineBasicBlock::const_instr_iterator MIB,
134                               MachineBasicBlock::const_instr_iterator MIE) {
135   unsigned Count = 0;
136   for (; MIB != MIE; ++MIB) {
137     if (!MIB->isDebugValue())
138       ++Count;
139   }
140   return Count;
141 }
142 
143 /// Find the hardware loop instruction used to set-up the specified loop.
144 /// On Hexagon, we have two instructions used to set-up the hardware loop
145 /// (LOOP0, LOOP1) with corresponding endloop (ENDLOOP0, ENDLOOP1) instructions
146 /// to indicate the end of a loop.
147 static MachineInstr *findLoopInstr(MachineBasicBlock *BB, unsigned EndLoopOp,
148       MachineBasicBlock *TargetBB,
149       SmallPtrSet<MachineBasicBlock *, 8> &Visited) {
150   unsigned LOOPi;
151   unsigned LOOPr;
152   if (EndLoopOp == Hexagon::ENDLOOP0) {
153     LOOPi = Hexagon::J2_loop0i;
154     LOOPr = Hexagon::J2_loop0r;
155   } else { // EndLoopOp == Hexagon::EndLOOP1
156     LOOPi = Hexagon::J2_loop1i;
157     LOOPr = Hexagon::J2_loop1r;
158   }
159 
160   // The loop set-up instruction will be in a predecessor block
161   for (MachineBasicBlock *PB : BB->predecessors()) {
162     // If this has been visited, already skip it.
163     if (!Visited.insert(PB).second)
164       continue;
165     if (PB == BB)
166       continue;
167     for (auto I = PB->instr_rbegin(), E = PB->instr_rend(); I != E; ++I) {
168       unsigned Opc = I->getOpcode();
169       if (Opc == LOOPi || Opc == LOOPr)
170         return &*I;
171       // We've reached a different loop, which means the loop01 has been
172       // removed.
173       if (Opc == EndLoopOp && I->getOperand(0).getMBB() != TargetBB)
174         return nullptr;
175     }
176     // Check the predecessors for the LOOP instruction.
177     if (MachineInstr *Loop = findLoopInstr(PB, EndLoopOp, TargetBB, Visited))
178       return Loop;
179   }
180   return nullptr;
181 }
182 
183 /// Gather register def/uses from MI.
184 /// This treats possible (predicated) defs as actually happening ones
185 /// (conservatively).
186 static inline void parseOperands(const MachineInstr &MI,
187       SmallVector<unsigned, 4> &Defs, SmallVector<unsigned, 8> &Uses) {
188   Defs.clear();
189   Uses.clear();
190 
191   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
192     const MachineOperand &MO = MI.getOperand(i);
193 
194     if (!MO.isReg())
195       continue;
196 
197     unsigned Reg = MO.getReg();
198     if (!Reg)
199       continue;
200 
201     if (MO.isUse())
202       Uses.push_back(MO.getReg());
203 
204     if (MO.isDef())
205       Defs.push_back(MO.getReg());
206   }
207 }
208 
209 // Position dependent, so check twice for swap.
210 static bool isDuplexPairMatch(unsigned Ga, unsigned Gb) {
211   switch (Ga) {
212   case HexagonII::HSIG_None:
213   default:
214     return false;
215   case HexagonII::HSIG_L1:
216     return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_A);
217   case HexagonII::HSIG_L2:
218     return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_L2 ||
219             Gb == HexagonII::HSIG_A);
220   case HexagonII::HSIG_S1:
221     return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_L2 ||
222             Gb == HexagonII::HSIG_S1 || Gb == HexagonII::HSIG_A);
223   case HexagonII::HSIG_S2:
224     return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_L2 ||
225             Gb == HexagonII::HSIG_S1 || Gb == HexagonII::HSIG_S2 ||
226             Gb == HexagonII::HSIG_A);
227   case HexagonII::HSIG_A:
228     return (Gb == HexagonII::HSIG_A);
229   case HexagonII::HSIG_Compound:
230     return (Gb == HexagonII::HSIG_Compound);
231   }
232   return false;
233 }
234 
235 /// isLoadFromStackSlot - If the specified machine instruction is a direct
236 /// load from a stack slot, return the virtual or physical register number of
237 /// the destination along with the FrameIndex of the loaded stack slot.  If
238 /// not, return 0.  This predicate must return 0 if the instruction has
239 /// any side effects other than loading from the stack slot.
240 unsigned HexagonInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
241                                                int &FrameIndex) const {
242   switch (MI.getOpcode()) {
243   default:
244     break;
245   case Hexagon::L2_loadri_io:
246   case Hexagon::L2_loadrd_io:
247   case Hexagon::V6_vL32b_ai:
248   case Hexagon::V6_vL32b_nt_ai:
249   case Hexagon::V6_vL32Ub_ai:
250   case Hexagon::LDriw_pred:
251   case Hexagon::LDriw_mod:
252   case Hexagon::PS_vloadrq_ai:
253   case Hexagon::PS_vloadrw_ai:
254   case Hexagon::PS_vloadrw_nt_ai: {
255     const MachineOperand OpFI = MI.getOperand(1);
256     if (!OpFI.isFI())
257       return 0;
258     const MachineOperand OpOff = MI.getOperand(2);
259     if (!OpOff.isImm() || OpOff.getImm() != 0)
260       return 0;
261     FrameIndex = OpFI.getIndex();
262     return MI.getOperand(0).getReg();
263   }
264 
265   case Hexagon::L2_ploadrit_io:
266   case Hexagon::L2_ploadrif_io:
267   case Hexagon::L2_ploadrdt_io:
268   case Hexagon::L2_ploadrdf_io: {
269     const MachineOperand OpFI = MI.getOperand(2);
270     if (!OpFI.isFI())
271       return 0;
272     const MachineOperand OpOff = MI.getOperand(3);
273     if (!OpOff.isImm() || OpOff.getImm() != 0)
274       return 0;
275     FrameIndex = OpFI.getIndex();
276     return MI.getOperand(0).getReg();
277   }
278   }
279 
280   return 0;
281 }
282 
283 /// isStoreToStackSlot - If the specified machine instruction is a direct
284 /// store to a stack slot, return the virtual or physical register number of
285 /// the source reg along with the FrameIndex of the loaded stack slot.  If
286 /// not, return 0.  This predicate must return 0 if the instruction has
287 /// any side effects other than storing to the stack slot.
288 unsigned HexagonInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
289                                               int &FrameIndex) const {
290   switch (MI.getOpcode()) {
291   default:
292     break;
293   case Hexagon::S2_storerb_io:
294   case Hexagon::S2_storerh_io:
295   case Hexagon::S2_storeri_io:
296   case Hexagon::S2_storerd_io:
297   case Hexagon::V6_vS32b_ai:
298   case Hexagon::V6_vS32Ub_ai:
299   case Hexagon::STriw_pred:
300   case Hexagon::STriw_mod:
301   case Hexagon::PS_vstorerq_ai:
302   case Hexagon::PS_vstorerw_ai: {
303     const MachineOperand &OpFI = MI.getOperand(0);
304     if (!OpFI.isFI())
305       return 0;
306     const MachineOperand &OpOff = MI.getOperand(1);
307     if (!OpOff.isImm() || OpOff.getImm() != 0)
308       return 0;
309     FrameIndex = OpFI.getIndex();
310     return MI.getOperand(2).getReg();
311   }
312 
313   case Hexagon::S2_pstorerbt_io:
314   case Hexagon::S2_pstorerbf_io:
315   case Hexagon::S2_pstorerht_io:
316   case Hexagon::S2_pstorerhf_io:
317   case Hexagon::S2_pstorerit_io:
318   case Hexagon::S2_pstorerif_io:
319   case Hexagon::S2_pstorerdt_io:
320   case Hexagon::S2_pstorerdf_io: {
321     const MachineOperand &OpFI = MI.getOperand(1);
322     if (!OpFI.isFI())
323       return 0;
324     const MachineOperand &OpOff = MI.getOperand(2);
325     if (!OpOff.isImm() || OpOff.getImm() != 0)
326       return 0;
327     FrameIndex = OpFI.getIndex();
328     return MI.getOperand(3).getReg();
329   }
330   }
331 
332   return 0;
333 }
334 
335 /// This function can analyze one/two way branching only and should (mostly) be
336 /// called by target independent side.
337 /// First entry is always the opcode of the branching instruction, except when
338 /// the Cond vector is supposed to be empty, e.g., when AnalyzeBranch fails, a
339 /// BB with only unconditional jump. Subsequent entries depend upon the opcode,
340 /// e.g. Jump_c p will have
341 /// Cond[0] = Jump_c
342 /// Cond[1] = p
343 /// HW-loop ENDLOOP:
344 /// Cond[0] = ENDLOOP
345 /// Cond[1] = MBB
346 /// New value jump:
347 /// Cond[0] = Hexagon::CMPEQri_f_Jumpnv_t_V4 -- specific opcode
348 /// Cond[1] = R
349 /// Cond[2] = Imm
350 bool HexagonInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
351                                      MachineBasicBlock *&TBB,
352                                      MachineBasicBlock *&FBB,
353                                      SmallVectorImpl<MachineOperand> &Cond,
354                                      bool AllowModify) const {
355   TBB = nullptr;
356   FBB = nullptr;
357   Cond.clear();
358 
359   // If the block has no terminators, it just falls into the block after it.
360   MachineBasicBlock::instr_iterator I = MBB.instr_end();
361   if (I == MBB.instr_begin())
362     return false;
363 
364   // A basic block may looks like this:
365   //
366   //  [   insn
367   //     EH_LABEL
368   //      insn
369   //      insn
370   //      insn
371   //     EH_LABEL
372   //      insn     ]
373   //
374   // It has two succs but does not have a terminator
375   // Don't know how to handle it.
376   do {
377     --I;
378     if (I->isEHLabel())
379       // Don't analyze EH branches.
380       return true;
381   } while (I != MBB.instr_begin());
382 
383   I = MBB.instr_end();
384   --I;
385 
386   while (I->isDebugValue()) {
387     if (I == MBB.instr_begin())
388       return false;
389     --I;
390   }
391 
392   bool JumpToBlock = I->getOpcode() == Hexagon::J2_jump &&
393                      I->getOperand(0).isMBB();
394   // Delete the J2_jump if it's equivalent to a fall-through.
395   if (AllowModify && JumpToBlock &&
396       MBB.isLayoutSuccessor(I->getOperand(0).getMBB())) {
397     DEBUG(dbgs() << "\nErasing the jump to successor block\n";);
398     I->eraseFromParent();
399     I = MBB.instr_end();
400     if (I == MBB.instr_begin())
401       return false;
402     --I;
403   }
404   if (!isUnpredicatedTerminator(*I))
405     return false;
406 
407   // Get the last instruction in the block.
408   MachineInstr *LastInst = &*I;
409   MachineInstr *SecondLastInst = nullptr;
410   // Find one more terminator if present.
411   while (true) {
412     if (&*I != LastInst && !I->isBundle() && isUnpredicatedTerminator(*I)) {
413       if (!SecondLastInst)
414         SecondLastInst = &*I;
415       else
416         // This is a third branch.
417         return true;
418     }
419     if (I == MBB.instr_begin())
420       break;
421     --I;
422   }
423 
424   int LastOpcode = LastInst->getOpcode();
425   int SecLastOpcode = SecondLastInst ? SecondLastInst->getOpcode() : 0;
426   // If the branch target is not a basic block, it could be a tail call.
427   // (It is, if the target is a function.)
428   if (LastOpcode == Hexagon::J2_jump && !LastInst->getOperand(0).isMBB())
429     return true;
430   if (SecLastOpcode == Hexagon::J2_jump &&
431       !SecondLastInst->getOperand(0).isMBB())
432     return true;
433 
434   bool LastOpcodeHasJMP_c = PredOpcodeHasJMP_c(LastOpcode);
435   bool LastOpcodeHasNVJump = isNewValueJump(*LastInst);
436 
437   if (LastOpcodeHasJMP_c && !LastInst->getOperand(1).isMBB())
438     return true;
439 
440   // If there is only one terminator instruction, process it.
441   if (LastInst && !SecondLastInst) {
442     if (LastOpcode == Hexagon::J2_jump) {
443       TBB = LastInst->getOperand(0).getMBB();
444       return false;
445     }
446     if (isEndLoopN(LastOpcode)) {
447       TBB = LastInst->getOperand(0).getMBB();
448       Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
449       Cond.push_back(LastInst->getOperand(0));
450       return false;
451     }
452     if (LastOpcodeHasJMP_c) {
453       TBB = LastInst->getOperand(1).getMBB();
454       Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
455       Cond.push_back(LastInst->getOperand(0));
456       return false;
457     }
458     // Only supporting rr/ri versions of new-value jumps.
459     if (LastOpcodeHasNVJump && (LastInst->getNumExplicitOperands() == 3)) {
460       TBB = LastInst->getOperand(2).getMBB();
461       Cond.push_back(MachineOperand::CreateImm(LastInst->getOpcode()));
462       Cond.push_back(LastInst->getOperand(0));
463       Cond.push_back(LastInst->getOperand(1));
464       return false;
465     }
466     DEBUG(dbgs() << "\nCant analyze BB#" << MBB.getNumber()
467                  << " with one jump\n";);
468     // Otherwise, don't know what this is.
469     return true;
470   }
471 
472   bool SecLastOpcodeHasJMP_c = PredOpcodeHasJMP_c(SecLastOpcode);
473   bool SecLastOpcodeHasNVJump = isNewValueJump(*SecondLastInst);
474   if (SecLastOpcodeHasJMP_c && (LastOpcode == Hexagon::J2_jump)) {
475     if (!SecondLastInst->getOperand(1).isMBB())
476       return true;
477     TBB =  SecondLastInst->getOperand(1).getMBB();
478     Cond.push_back(MachineOperand::CreateImm(SecondLastInst->getOpcode()));
479     Cond.push_back(SecondLastInst->getOperand(0));
480     FBB = LastInst->getOperand(0).getMBB();
481     return false;
482   }
483 
484   // Only supporting rr/ri versions of new-value jumps.
485   if (SecLastOpcodeHasNVJump &&
486       (SecondLastInst->getNumExplicitOperands() == 3) &&
487       (LastOpcode == Hexagon::J2_jump)) {
488     TBB = SecondLastInst->getOperand(2).getMBB();
489     Cond.push_back(MachineOperand::CreateImm(SecondLastInst->getOpcode()));
490     Cond.push_back(SecondLastInst->getOperand(0));
491     Cond.push_back(SecondLastInst->getOperand(1));
492     FBB = LastInst->getOperand(0).getMBB();
493     return false;
494   }
495 
496   // If the block ends with two Hexagon:JMPs, handle it.  The second one is not
497   // executed, so remove it.
498   if (SecLastOpcode == Hexagon::J2_jump && LastOpcode == Hexagon::J2_jump) {
499     TBB = SecondLastInst->getOperand(0).getMBB();
500     I = LastInst->getIterator();
501     if (AllowModify)
502       I->eraseFromParent();
503     return false;
504   }
505 
506   // If the block ends with an ENDLOOP, and J2_jump, handle it.
507   if (isEndLoopN(SecLastOpcode) && LastOpcode == Hexagon::J2_jump) {
508     TBB = SecondLastInst->getOperand(0).getMBB();
509     Cond.push_back(MachineOperand::CreateImm(SecondLastInst->getOpcode()));
510     Cond.push_back(SecondLastInst->getOperand(0));
511     FBB = LastInst->getOperand(0).getMBB();
512     return false;
513   }
514   DEBUG(dbgs() << "\nCant analyze BB#" << MBB.getNumber()
515                << " with two jumps";);
516   // Otherwise, can't handle this.
517   return true;
518 }
519 
520 unsigned HexagonInstrInfo::removeBranch(MachineBasicBlock &MBB,
521                                         int *BytesRemoved) const {
522   assert(!BytesRemoved && "code size not handled");
523 
524   DEBUG(dbgs() << "\nRemoving branches out of BB#" << MBB.getNumber());
525   MachineBasicBlock::iterator I = MBB.end();
526   unsigned Count = 0;
527   while (I != MBB.begin()) {
528     --I;
529     if (I->isDebugValue())
530       continue;
531     // Only removing branches from end of MBB.
532     if (!I->isBranch())
533       return Count;
534     if (Count && (I->getOpcode() == Hexagon::J2_jump))
535       llvm_unreachable("Malformed basic block: unconditional branch not last");
536     MBB.erase(&MBB.back());
537     I = MBB.end();
538     ++Count;
539   }
540   return Count;
541 }
542 
543 unsigned HexagonInstrInfo::insertBranch(MachineBasicBlock &MBB,
544                                         MachineBasicBlock *TBB,
545                                         MachineBasicBlock *FBB,
546                                         ArrayRef<MachineOperand> Cond,
547                                         const DebugLoc &DL,
548                                         int *BytesAdded) const {
549   unsigned BOpc   = Hexagon::J2_jump;
550   unsigned BccOpc = Hexagon::J2_jumpt;
551   assert(validateBranchCond(Cond) && "Invalid branching condition");
552   assert(TBB && "insertBranch must not be told to insert a fallthrough");
553   assert(!BytesAdded && "code size not handled");
554 
555   // Check if reverseBranchCondition has asked to reverse this branch
556   // If we want to reverse the branch an odd number of times, we want
557   // J2_jumpf.
558   if (!Cond.empty() && Cond[0].isImm())
559     BccOpc = Cond[0].getImm();
560 
561   if (!FBB) {
562     if (Cond.empty()) {
563       // Due to a bug in TailMerging/CFG Optimization, we need to add a
564       // special case handling of a predicated jump followed by an
565       // unconditional jump. If not, Tail Merging and CFG Optimization go
566       // into an infinite loop.
567       MachineBasicBlock *NewTBB, *NewFBB;
568       SmallVector<MachineOperand, 4> Cond;
569       auto Term = MBB.getFirstTerminator();
570       if (Term != MBB.end() && isPredicated(*Term) &&
571           !analyzeBranch(MBB, NewTBB, NewFBB, Cond, false) &&
572           MachineFunction::iterator(NewTBB) == ++MBB.getIterator()) {
573         reverseBranchCondition(Cond);
574         removeBranch(MBB);
575         return insertBranch(MBB, TBB, nullptr, Cond, DL);
576       }
577       BuildMI(&MBB, DL, get(BOpc)).addMBB(TBB);
578     } else if (isEndLoopN(Cond[0].getImm())) {
579       int EndLoopOp = Cond[0].getImm();
580       assert(Cond[1].isMBB());
581       // Since we're adding an ENDLOOP, there better be a LOOP instruction.
582       // Check for it, and change the BB target if needed.
583       SmallPtrSet<MachineBasicBlock *, 8> VisitedBBs;
584       MachineInstr *Loop = findLoopInstr(TBB, EndLoopOp, Cond[1].getMBB(),
585                                          VisitedBBs);
586       assert(Loop != nullptr && "Inserting an ENDLOOP without a LOOP");
587       Loop->getOperand(0).setMBB(TBB);
588       // Add the ENDLOOP after the finding the LOOP0.
589       BuildMI(&MBB, DL, get(EndLoopOp)).addMBB(TBB);
590     } else if (isNewValueJump(Cond[0].getImm())) {
591       assert((Cond.size() == 3) && "Only supporting rr/ri version of nvjump");
592       // New value jump
593       // (ins IntRegs:$src1, IntRegs:$src2, brtarget:$offset)
594       // (ins IntRegs:$src1, u5Imm:$src2, brtarget:$offset)
595       unsigned Flags1 = getUndefRegState(Cond[1].isUndef());
596       DEBUG(dbgs() << "\nInserting NVJump for BB#" << MBB.getNumber(););
597       if (Cond[2].isReg()) {
598         unsigned Flags2 = getUndefRegState(Cond[2].isUndef());
599         BuildMI(&MBB, DL, get(BccOpc)).addReg(Cond[1].getReg(), Flags1).
600           addReg(Cond[2].getReg(), Flags2).addMBB(TBB);
601       } else if(Cond[2].isImm()) {
602         BuildMI(&MBB, DL, get(BccOpc)).addReg(Cond[1].getReg(), Flags1).
603           addImm(Cond[2].getImm()).addMBB(TBB);
604       } else
605         llvm_unreachable("Invalid condition for branching");
606     } else {
607       assert((Cond.size() == 2) && "Malformed cond vector");
608       const MachineOperand &RO = Cond[1];
609       unsigned Flags = getUndefRegState(RO.isUndef());
610       BuildMI(&MBB, DL, get(BccOpc)).addReg(RO.getReg(), Flags).addMBB(TBB);
611     }
612     return 1;
613   }
614   assert((!Cond.empty()) &&
615          "Cond. cannot be empty when multiple branchings are required");
616   assert((!isNewValueJump(Cond[0].getImm())) &&
617          "NV-jump cannot be inserted with another branch");
618   // Special case for hardware loops.  The condition is a basic block.
619   if (isEndLoopN(Cond[0].getImm())) {
620     int EndLoopOp = Cond[0].getImm();
621     assert(Cond[1].isMBB());
622     // Since we're adding an ENDLOOP, there better be a LOOP instruction.
623     // Check for it, and change the BB target if needed.
624     SmallPtrSet<MachineBasicBlock *, 8> VisitedBBs;
625     MachineInstr *Loop = findLoopInstr(TBB, EndLoopOp, Cond[1].getMBB(),
626                                        VisitedBBs);
627     assert(Loop != nullptr && "Inserting an ENDLOOP without a LOOP");
628     Loop->getOperand(0).setMBB(TBB);
629     // Add the ENDLOOP after the finding the LOOP0.
630     BuildMI(&MBB, DL, get(EndLoopOp)).addMBB(TBB);
631   } else {
632     const MachineOperand &RO = Cond[1];
633     unsigned Flags = getUndefRegState(RO.isUndef());
634     BuildMI(&MBB, DL, get(BccOpc)).addReg(RO.getReg(), Flags).addMBB(TBB);
635   }
636   BuildMI(&MBB, DL, get(BOpc)).addMBB(FBB);
637 
638   return 2;
639 }
640 
641 /// Analyze the loop code to find the loop induction variable and compare used
642 /// to compute the number of iterations. Currently, we analyze loop that are
643 /// controlled using hardware loops.  In this case, the induction variable
644 /// instruction is null.  For all other cases, this function returns true, which
645 /// means we're unable to analyze it.
646 bool HexagonInstrInfo::analyzeLoop(MachineLoop &L,
647                                    MachineInstr *&IndVarInst,
648                                    MachineInstr *&CmpInst) const {
649 
650   MachineBasicBlock *LoopEnd = L.getBottomBlock();
651   MachineBasicBlock::iterator I = LoopEnd->getFirstTerminator();
652   // We really "analyze" only hardware loops right now.
653   if (I != LoopEnd->end() && isEndLoopN(I->getOpcode())) {
654     IndVarInst = nullptr;
655     CmpInst = &*I;
656     return false;
657   }
658   return true;
659 }
660 
661 /// Generate code to reduce the loop iteration by one and check if the loop is
662 /// finished. Return the value/register of the new loop count. this function
663 /// assumes the nth iteration is peeled first.
664 unsigned HexagonInstrInfo::reduceLoopCount(MachineBasicBlock &MBB,
665       MachineInstr *IndVar, MachineInstr &Cmp,
666       SmallVectorImpl<MachineOperand> &Cond,
667       SmallVectorImpl<MachineInstr *> &PrevInsts,
668       unsigned Iter, unsigned MaxIter) const {
669   // We expect a hardware loop currently. This means that IndVar is set
670   // to null, and the compare is the ENDLOOP instruction.
671   assert((!IndVar) && isEndLoopN(Cmp.getOpcode())
672                    && "Expecting a hardware loop");
673   MachineFunction *MF = MBB.getParent();
674   DebugLoc DL = Cmp.getDebugLoc();
675   SmallPtrSet<MachineBasicBlock *, 8> VisitedBBs;
676   MachineInstr *Loop = findLoopInstr(&MBB, Cmp.getOpcode(),
677                                      Cmp.getOperand(0).getMBB(), VisitedBBs);
678   if (!Loop)
679     return 0;
680   // If the loop trip count is a compile-time value, then just change the
681   // value.
682   if (Loop->getOpcode() == Hexagon::J2_loop0i ||
683       Loop->getOpcode() == Hexagon::J2_loop1i) {
684     int64_t Offset = Loop->getOperand(1).getImm();
685     if (Offset <= 1)
686       Loop->eraseFromParent();
687     else
688       Loop->getOperand(1).setImm(Offset - 1);
689     return Offset - 1;
690   }
691   // The loop trip count is a run-time value. We generate code to subtract
692   // one from the trip count, and update the loop instruction.
693   assert(Loop->getOpcode() == Hexagon::J2_loop0r && "Unexpected instruction");
694   unsigned LoopCount = Loop->getOperand(1).getReg();
695   // Check if we're done with the loop.
696   unsigned LoopEnd = createVR(MF, MVT::i1);
697   MachineInstr *NewCmp = BuildMI(&MBB, DL, get(Hexagon::C2_cmpgtui), LoopEnd).
698     addReg(LoopCount).addImm(1);
699   unsigned NewLoopCount = createVR(MF, MVT::i32);
700   MachineInstr *NewAdd = BuildMI(&MBB, DL, get(Hexagon::A2_addi), NewLoopCount).
701     addReg(LoopCount).addImm(-1);
702   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
703   // Update the previously generated instructions with the new loop counter.
704   for (SmallVectorImpl<MachineInstr *>::iterator I = PrevInsts.begin(),
705          E = PrevInsts.end(); I != E; ++I)
706     (*I)->substituteRegister(LoopCount, NewLoopCount, 0, HRI);
707   PrevInsts.clear();
708   PrevInsts.push_back(NewCmp);
709   PrevInsts.push_back(NewAdd);
710   // Insert the new loop instruction if this is the last time the loop is
711   // decremented.
712   if (Iter == MaxIter)
713     BuildMI(&MBB, DL, get(Hexagon::J2_loop0r)).
714       addMBB(Loop->getOperand(0).getMBB()).addReg(NewLoopCount);
715   // Delete the old loop instruction.
716   if (Iter == 0)
717     Loop->eraseFromParent();
718   Cond.push_back(MachineOperand::CreateImm(Hexagon::J2_jumpf));
719   Cond.push_back(NewCmp->getOperand(0));
720   return NewLoopCount;
721 }
722 
723 bool HexagonInstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB,
724       unsigned NumCycles, unsigned ExtraPredCycles,
725       BranchProbability Probability) const {
726   return nonDbgBBSize(&MBB) <= 3;
727 }
728 
729 bool HexagonInstrInfo::isProfitableToIfCvt(MachineBasicBlock &TMBB,
730       unsigned NumTCycles, unsigned ExtraTCycles, MachineBasicBlock &FMBB,
731       unsigned NumFCycles, unsigned ExtraFCycles, BranchProbability Probability)
732       const {
733   return nonDbgBBSize(&TMBB) <= 3 && nonDbgBBSize(&FMBB) <= 3;
734 }
735 
736 bool HexagonInstrInfo::isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
737       unsigned NumInstrs, BranchProbability Probability) const {
738   return NumInstrs <= 4;
739 }
740 
741 void HexagonInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
742                                    MachineBasicBlock::iterator I,
743                                    const DebugLoc &DL, unsigned DestReg,
744                                    unsigned SrcReg, bool KillSrc) const {
745   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
746   unsigned KillFlag = getKillRegState(KillSrc);
747 
748   if (Hexagon::IntRegsRegClass.contains(SrcReg, DestReg)) {
749     BuildMI(MBB, I, DL, get(Hexagon::A2_tfr), DestReg)
750       .addReg(SrcReg, KillFlag);
751     return;
752   }
753   if (Hexagon::DoubleRegsRegClass.contains(SrcReg, DestReg)) {
754     BuildMI(MBB, I, DL, get(Hexagon::A2_tfrp), DestReg)
755       .addReg(SrcReg, KillFlag);
756     return;
757   }
758   if (Hexagon::PredRegsRegClass.contains(SrcReg, DestReg)) {
759     // Map Pd = Ps to Pd = or(Ps, Ps).
760     BuildMI(MBB, I, DL, get(Hexagon::C2_or), DestReg)
761       .addReg(SrcReg).addReg(SrcReg, KillFlag);
762     return;
763   }
764   if (Hexagon::CtrRegsRegClass.contains(DestReg) &&
765       Hexagon::IntRegsRegClass.contains(SrcReg)) {
766     BuildMI(MBB, I, DL, get(Hexagon::A2_tfrrcr), DestReg)
767       .addReg(SrcReg, KillFlag);
768     return;
769   }
770   if (Hexagon::IntRegsRegClass.contains(DestReg) &&
771       Hexagon::CtrRegsRegClass.contains(SrcReg)) {
772     BuildMI(MBB, I, DL, get(Hexagon::A2_tfrcrr), DestReg)
773       .addReg(SrcReg, KillFlag);
774     return;
775   }
776   if (Hexagon::ModRegsRegClass.contains(DestReg) &&
777       Hexagon::IntRegsRegClass.contains(SrcReg)) {
778     BuildMI(MBB, I, DL, get(Hexagon::A2_tfrrcr), DestReg)
779       .addReg(SrcReg, KillFlag);
780     return;
781   }
782   if (Hexagon::PredRegsRegClass.contains(SrcReg) &&
783       Hexagon::IntRegsRegClass.contains(DestReg)) {
784     BuildMI(MBB, I, DL, get(Hexagon::C2_tfrpr), DestReg)
785       .addReg(SrcReg, KillFlag);
786     return;
787   }
788   if (Hexagon::IntRegsRegClass.contains(SrcReg) &&
789       Hexagon::PredRegsRegClass.contains(DestReg)) {
790     BuildMI(MBB, I, DL, get(Hexagon::C2_tfrrp), DestReg)
791       .addReg(SrcReg, KillFlag);
792     return;
793   }
794   if (Hexagon::PredRegsRegClass.contains(SrcReg) &&
795       Hexagon::IntRegsRegClass.contains(DestReg)) {
796     BuildMI(MBB, I, DL, get(Hexagon::C2_tfrpr), DestReg)
797       .addReg(SrcReg, KillFlag);
798     return;
799   }
800   if (Hexagon::HvxVRRegClass.contains(SrcReg, DestReg)) {
801     BuildMI(MBB, I, DL, get(Hexagon::V6_vassign), DestReg).
802       addReg(SrcReg, KillFlag);
803     return;
804   }
805   if (Hexagon::HvxWRRegClass.contains(SrcReg, DestReg)) {
806     unsigned LoSrc = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
807     unsigned HiSrc = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
808     BuildMI(MBB, I, DL, get(Hexagon::V6_vcombine), DestReg)
809       .addReg(HiSrc, KillFlag)
810       .addReg(LoSrc, KillFlag);
811     return;
812   }
813   if (Hexagon::HvxQRRegClass.contains(SrcReg, DestReg)) {
814     BuildMI(MBB, I, DL, get(Hexagon::V6_pred_and), DestReg)
815       .addReg(SrcReg)
816       .addReg(SrcReg, KillFlag);
817     return;
818   }
819   if (Hexagon::HvxQRRegClass.contains(SrcReg) &&
820       Hexagon::HvxVRRegClass.contains(DestReg)) {
821     llvm_unreachable("Unimplemented pred to vec");
822     return;
823   }
824   if (Hexagon::HvxQRRegClass.contains(DestReg) &&
825       Hexagon::HvxVRRegClass.contains(SrcReg)) {
826     llvm_unreachable("Unimplemented vec to pred");
827     return;
828   }
829 
830 #ifndef NDEBUG
831   // Show the invalid registers to ease debugging.
832   dbgs() << "Invalid registers for copy in BB#" << MBB.getNumber()
833          << ": " << PrintReg(DestReg, &HRI)
834          << " = " << PrintReg(SrcReg, &HRI) << '\n';
835 #endif
836   llvm_unreachable("Unimplemented");
837 }
838 
839 void HexagonInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
840       MachineBasicBlock::iterator I, unsigned SrcReg, bool isKill, int FI,
841       const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const {
842   DebugLoc DL = MBB.findDebugLoc(I);
843   MachineFunction &MF = *MBB.getParent();
844   MachineFrameInfo &MFI = MF.getFrameInfo();
845   unsigned SlotAlign = MFI.getObjectAlignment(FI);
846   unsigned RegAlign = TRI->getSpillAlignment(*RC);
847   unsigned KillFlag = getKillRegState(isKill);
848   bool HasAlloca = MFI.hasVarSizedObjects();
849   const HexagonFrameLowering &HFI = *Subtarget.getFrameLowering();
850 
851   MachineMemOperand *MMO = MF.getMachineMemOperand(
852       MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOStore,
853       MFI.getObjectSize(FI), SlotAlign);
854 
855   if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
856     BuildMI(MBB, I, DL, get(Hexagon::S2_storeri_io))
857       .addFrameIndex(FI).addImm(0)
858       .addReg(SrcReg, KillFlag).addMemOperand(MMO);
859   } else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
860     BuildMI(MBB, I, DL, get(Hexagon::S2_storerd_io))
861       .addFrameIndex(FI).addImm(0)
862       .addReg(SrcReg, KillFlag).addMemOperand(MMO);
863   } else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
864     BuildMI(MBB, I, DL, get(Hexagon::STriw_pred))
865       .addFrameIndex(FI).addImm(0)
866       .addReg(SrcReg, KillFlag).addMemOperand(MMO);
867   } else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
868     BuildMI(MBB, I, DL, get(Hexagon::STriw_mod))
869       .addFrameIndex(FI).addImm(0)
870       .addReg(SrcReg, KillFlag).addMemOperand(MMO);
871   } else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
872     BuildMI(MBB, I, DL, get(Hexagon::PS_vstorerq_ai))
873       .addFrameIndex(FI).addImm(0)
874       .addReg(SrcReg, KillFlag).addMemOperand(MMO);
875   } else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
876     // If there are variable-sized objects, spills will not be aligned.
877     if (HasAlloca)
878       SlotAlign = HFI.getStackAlignment();
879     unsigned Opc = SlotAlign < RegAlign ? Hexagon::V6_vS32Ub_ai
880                                         : Hexagon::V6_vS32b_ai;
881     MachineMemOperand *MMOA = MF.getMachineMemOperand(
882         MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOStore,
883         MFI.getObjectSize(FI), SlotAlign);
884     BuildMI(MBB, I, DL, get(Opc))
885       .addFrameIndex(FI).addImm(0)
886       .addReg(SrcReg, KillFlag).addMemOperand(MMOA);
887   } else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
888     // If there are variable-sized objects, spills will not be aligned.
889     if (HasAlloca)
890       SlotAlign = HFI.getStackAlignment();
891     unsigned Opc = SlotAlign < RegAlign ? Hexagon::PS_vstorerwu_ai
892                                         : Hexagon::PS_vstorerw_ai;
893     MachineMemOperand *MMOA = MF.getMachineMemOperand(
894         MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOStore,
895         MFI.getObjectSize(FI), SlotAlign);
896     BuildMI(MBB, I, DL, get(Opc))
897       .addFrameIndex(FI).addImm(0)
898       .addReg(SrcReg, KillFlag).addMemOperand(MMOA);
899   } else {
900     llvm_unreachable("Unimplemented");
901   }
902 }
903 
904 void HexagonInstrInfo::loadRegFromStackSlot(
905     MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned DestReg,
906     int FI, const TargetRegisterClass *RC,
907     const TargetRegisterInfo *TRI) const {
908   DebugLoc DL = MBB.findDebugLoc(I);
909   MachineFunction &MF = *MBB.getParent();
910   MachineFrameInfo &MFI = MF.getFrameInfo();
911   unsigned SlotAlign = MFI.getObjectAlignment(FI);
912   unsigned RegAlign = TRI->getSpillAlignment(*RC);
913   bool HasAlloca = MFI.hasVarSizedObjects();
914   const HexagonFrameLowering &HFI = *Subtarget.getFrameLowering();
915 
916   MachineMemOperand *MMO = MF.getMachineMemOperand(
917       MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOLoad,
918       MFI.getObjectSize(FI), SlotAlign);
919 
920   if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
921     BuildMI(MBB, I, DL, get(Hexagon::L2_loadri_io), DestReg)
922       .addFrameIndex(FI).addImm(0).addMemOperand(MMO);
923   } else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
924     BuildMI(MBB, I, DL, get(Hexagon::L2_loadrd_io), DestReg)
925       .addFrameIndex(FI).addImm(0).addMemOperand(MMO);
926   } else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
927     BuildMI(MBB, I, DL, get(Hexagon::LDriw_pred), DestReg)
928       .addFrameIndex(FI).addImm(0).addMemOperand(MMO);
929   } else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
930     BuildMI(MBB, I, DL, get(Hexagon::LDriw_mod), DestReg)
931       .addFrameIndex(FI).addImm(0).addMemOperand(MMO);
932   } else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
933     BuildMI(MBB, I, DL, get(Hexagon::PS_vloadrq_ai), DestReg)
934       .addFrameIndex(FI).addImm(0).addMemOperand(MMO);
935   } else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
936     // If there are variable-sized objects, spills will not be aligned.
937     if (HasAlloca)
938       SlotAlign = HFI.getStackAlignment();
939     unsigned Opc = SlotAlign < RegAlign ? Hexagon::V6_vL32Ub_ai
940                                         : Hexagon::V6_vL32b_ai;
941     MachineMemOperand *MMOA = MF.getMachineMemOperand(
942         MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOLoad,
943         MFI.getObjectSize(FI), SlotAlign);
944     BuildMI(MBB, I, DL, get(Opc), DestReg)
945       .addFrameIndex(FI).addImm(0).addMemOperand(MMOA);
946   } else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
947     // If there are variable-sized objects, spills will not be aligned.
948     if (HasAlloca)
949       SlotAlign = HFI.getStackAlignment();
950     unsigned Opc = SlotAlign < RegAlign ? Hexagon::PS_vloadrwu_ai
951                                         : Hexagon::PS_vloadrw_ai;
952     MachineMemOperand *MMOA = MF.getMachineMemOperand(
953         MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOLoad,
954         MFI.getObjectSize(FI), SlotAlign);
955     BuildMI(MBB, I, DL, get(Opc), DestReg)
956       .addFrameIndex(FI).addImm(0).addMemOperand(MMOA);
957   } else {
958     llvm_unreachable("Can't store this register to stack slot");
959   }
960 }
961 
962 static void getLiveRegsAt(LivePhysRegs &Regs, const MachineInstr &MI) {
963   const MachineBasicBlock &B = *MI.getParent();
964   Regs.addLiveOuts(B);
965   auto E = ++MachineBasicBlock::const_iterator(MI.getIterator()).getReverse();
966   for (auto I = B.rbegin(); I != E; ++I)
967     Regs.stepBackward(*I);
968 }
969 
970 /// expandPostRAPseudo - This function is called for all pseudo instructions
971 /// that remain after register allocation. Many pseudo instructions are
972 /// created to help register allocation. This is the place to convert them
973 /// into real instructions. The target can edit MI in place, or it can insert
974 /// new instructions and erase MI. The function should return true if
975 /// anything was changed.
976 bool HexagonInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
977   MachineBasicBlock &MBB = *MI.getParent();
978   MachineFunction &MF = *MBB.getParent();
979   MachineRegisterInfo &MRI = MF.getRegInfo();
980   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
981   DebugLoc DL = MI.getDebugLoc();
982   unsigned Opc = MI.getOpcode();
983 
984   switch (Opc) {
985     case TargetOpcode::COPY: {
986       MachineOperand &MD = MI.getOperand(0);
987       MachineOperand &MS = MI.getOperand(1);
988       MachineBasicBlock::iterator MBBI = MI.getIterator();
989       if (MD.getReg() != MS.getReg() && !MS.isUndef()) {
990         copyPhysReg(MBB, MI, DL, MD.getReg(), MS.getReg(), MS.isKill());
991         std::prev(MBBI)->copyImplicitOps(*MBB.getParent(), MI);
992       }
993       MBB.erase(MBBI);
994       return true;
995     }
996     case Hexagon::PS_aligna:
997       BuildMI(MBB, MI, DL, get(Hexagon::A2_andir), MI.getOperand(0).getReg())
998           .addReg(HRI.getFrameRegister())
999           .addImm(-MI.getOperand(1).getImm());
1000       MBB.erase(MI);
1001       return true;
1002     case Hexagon::V6_vassignp: {
1003       unsigned SrcReg = MI.getOperand(1).getReg();
1004       unsigned DstReg = MI.getOperand(0).getReg();
1005       unsigned Kill = getKillRegState(MI.getOperand(1).isKill());
1006       BuildMI(MBB, MI, DL, get(Hexagon::V6_vcombine), DstReg)
1007         .addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_hi), Kill)
1008         .addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_lo), Kill);
1009       MBB.erase(MI);
1010       return true;
1011     }
1012     case Hexagon::V6_lo: {
1013       unsigned SrcReg = MI.getOperand(1).getReg();
1014       unsigned DstReg = MI.getOperand(0).getReg();
1015       unsigned SrcSubLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1016       copyPhysReg(MBB, MI, DL, DstReg, SrcSubLo, MI.getOperand(1).isKill());
1017       MBB.erase(MI);
1018       MRI.clearKillFlags(SrcSubLo);
1019       return true;
1020     }
1021     case Hexagon::V6_hi: {
1022       unsigned SrcReg = MI.getOperand(1).getReg();
1023       unsigned DstReg = MI.getOperand(0).getReg();
1024       unsigned SrcSubHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1025       copyPhysReg(MBB, MI, DL, DstReg, SrcSubHi, MI.getOperand(1).isKill());
1026       MBB.erase(MI);
1027       MRI.clearKillFlags(SrcSubHi);
1028       return true;
1029     }
1030     case Hexagon::PS_vstorerw_ai:
1031     case Hexagon::PS_vstorerwu_ai: {
1032       bool Aligned = Opc == Hexagon::PS_vstorerw_ai;
1033       unsigned SrcReg = MI.getOperand(2).getReg();
1034       unsigned SrcSubHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1035       unsigned SrcSubLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1036       unsigned NewOpc = Aligned ? Hexagon::V6_vS32b_ai : Hexagon::V6_vS32Ub_ai;
1037       unsigned Offset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1038 
1039       MachineInstr *MI1New =
1040           BuildMI(MBB, MI, DL, get(NewOpc))
1041               .add(MI.getOperand(0))
1042               .addImm(MI.getOperand(1).getImm())
1043               .addReg(SrcSubLo)
1044               .setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
1045       MI1New->getOperand(0).setIsKill(false);
1046       BuildMI(MBB, MI, DL, get(NewOpc))
1047           .add(MI.getOperand(0))
1048           // The Vectors are indexed in multiples of vector size.
1049           .addImm(MI.getOperand(1).getImm() + Offset)
1050           .addReg(SrcSubHi)
1051           .setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
1052       MBB.erase(MI);
1053       return true;
1054     }
1055     case Hexagon::PS_vloadrw_ai:
1056     case Hexagon::PS_vloadrwu_ai: {
1057       bool Aligned = Opc == Hexagon::PS_vloadrw_ai;
1058       unsigned DstReg = MI.getOperand(0).getReg();
1059       unsigned NewOpc = Aligned ? Hexagon::V6_vL32b_ai : Hexagon::V6_vL32Ub_ai;
1060       unsigned Offset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1061 
1062       MachineInstr *MI1New = BuildMI(MBB, MI, DL, get(NewOpc),
1063                                      HRI.getSubReg(DstReg, Hexagon::vsub_lo))
1064               .add(MI.getOperand(1))
1065               .addImm(MI.getOperand(2).getImm())
1066               .setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
1067       MI1New->getOperand(1).setIsKill(false);
1068       BuildMI(MBB, MI, DL, get(NewOpc), HRI.getSubReg(DstReg, Hexagon::vsub_hi))
1069           .add(MI.getOperand(1))
1070           // The Vectors are indexed in multiples of vector size.
1071           .addImm(MI.getOperand(2).getImm() + Offset)
1072           .setMemRefs(MI.memoperands_begin(), MI.memoperands_end());
1073       MBB.erase(MI);
1074       return true;
1075     }
1076     case Hexagon::PS_true: {
1077       unsigned Reg = MI.getOperand(0).getReg();
1078       BuildMI(MBB, MI, DL, get(Hexagon::C2_orn), Reg)
1079         .addReg(Reg, RegState::Undef)
1080         .addReg(Reg, RegState::Undef);
1081       MBB.erase(MI);
1082       return true;
1083     }
1084     case Hexagon::PS_false: {
1085       unsigned Reg = MI.getOperand(0).getReg();
1086       BuildMI(MBB, MI, DL, get(Hexagon::C2_andn), Reg)
1087         .addReg(Reg, RegState::Undef)
1088         .addReg(Reg, RegState::Undef);
1089       MBB.erase(MI);
1090       return true;
1091     }
1092     case Hexagon::PS_vmulw: {
1093       // Expand a 64-bit vector multiply into 2 32-bit scalar multiplies.
1094       unsigned DstReg = MI.getOperand(0).getReg();
1095       unsigned Src1Reg = MI.getOperand(1).getReg();
1096       unsigned Src2Reg = MI.getOperand(2).getReg();
1097       unsigned Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1098       unsigned Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1099       unsigned Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1100       unsigned Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1101       BuildMI(MBB, MI, MI.getDebugLoc(), get(Hexagon::M2_mpyi),
1102               HRI.getSubReg(DstReg, Hexagon::isub_hi))
1103           .addReg(Src1SubHi)
1104           .addReg(Src2SubHi);
1105       BuildMI(MBB, MI, MI.getDebugLoc(), get(Hexagon::M2_mpyi),
1106               HRI.getSubReg(DstReg, Hexagon::isub_lo))
1107           .addReg(Src1SubLo)
1108           .addReg(Src2SubLo);
1109       MBB.erase(MI);
1110       MRI.clearKillFlags(Src1SubHi);
1111       MRI.clearKillFlags(Src1SubLo);
1112       MRI.clearKillFlags(Src2SubHi);
1113       MRI.clearKillFlags(Src2SubLo);
1114       return true;
1115     }
1116     case Hexagon::PS_vmulw_acc: {
1117       // Expand 64-bit vector multiply with addition into 2 scalar multiplies.
1118       unsigned DstReg = MI.getOperand(0).getReg();
1119       unsigned Src1Reg = MI.getOperand(1).getReg();
1120       unsigned Src2Reg = MI.getOperand(2).getReg();
1121       unsigned Src3Reg = MI.getOperand(3).getReg();
1122       unsigned Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1123       unsigned Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1124       unsigned Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1125       unsigned Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1126       unsigned Src3SubHi = HRI.getSubReg(Src3Reg, Hexagon::isub_hi);
1127       unsigned Src3SubLo = HRI.getSubReg(Src3Reg, Hexagon::isub_lo);
1128       BuildMI(MBB, MI, MI.getDebugLoc(), get(Hexagon::M2_maci),
1129               HRI.getSubReg(DstReg, Hexagon::isub_hi))
1130           .addReg(Src1SubHi)
1131           .addReg(Src2SubHi)
1132           .addReg(Src3SubHi);
1133       BuildMI(MBB, MI, MI.getDebugLoc(), get(Hexagon::M2_maci),
1134               HRI.getSubReg(DstReg, Hexagon::isub_lo))
1135           .addReg(Src1SubLo)
1136           .addReg(Src2SubLo)
1137           .addReg(Src3SubLo);
1138       MBB.erase(MI);
1139       MRI.clearKillFlags(Src1SubHi);
1140       MRI.clearKillFlags(Src1SubLo);
1141       MRI.clearKillFlags(Src2SubHi);
1142       MRI.clearKillFlags(Src2SubLo);
1143       MRI.clearKillFlags(Src3SubHi);
1144       MRI.clearKillFlags(Src3SubLo);
1145       return true;
1146     }
1147     case Hexagon::PS_pselect: {
1148       const MachineOperand &Op0 = MI.getOperand(0);
1149       const MachineOperand &Op1 = MI.getOperand(1);
1150       const MachineOperand &Op2 = MI.getOperand(2);
1151       const MachineOperand &Op3 = MI.getOperand(3);
1152       unsigned Rd = Op0.getReg();
1153       unsigned Pu = Op1.getReg();
1154       unsigned Rs = Op2.getReg();
1155       unsigned Rt = Op3.getReg();
1156       DebugLoc DL = MI.getDebugLoc();
1157       unsigned K1 = getKillRegState(Op1.isKill());
1158       unsigned K2 = getKillRegState(Op2.isKill());
1159       unsigned K3 = getKillRegState(Op3.isKill());
1160       if (Rd != Rs)
1161         BuildMI(MBB, MI, DL, get(Hexagon::A2_tfrpt), Rd)
1162           .addReg(Pu, (Rd == Rt) ? K1 : 0)
1163           .addReg(Rs, K2);
1164       if (Rd != Rt)
1165         BuildMI(MBB, MI, DL, get(Hexagon::A2_tfrpf), Rd)
1166           .addReg(Pu, K1)
1167           .addReg(Rt, K3);
1168       MBB.erase(MI);
1169       return true;
1170     }
1171     case Hexagon::PS_vselect: {
1172       const MachineOperand &Op0 = MI.getOperand(0);
1173       const MachineOperand &Op1 = MI.getOperand(1);
1174       const MachineOperand &Op2 = MI.getOperand(2);
1175       const MachineOperand &Op3 = MI.getOperand(3);
1176       LivePhysRegs LiveAtMI(HRI);
1177       getLiveRegsAt(LiveAtMI, MI);
1178       bool IsDestLive = !LiveAtMI.available(MRI, Op0.getReg());
1179       unsigned PReg = Op1.getReg();
1180       assert(Op1.getSubReg() == 0);
1181       unsigned PState = getRegState(Op1);
1182 
1183       if (Op0.getReg() != Op2.getReg()) {
1184         unsigned S = Op0.getReg() != Op3.getReg() ? PState & ~RegState::Kill
1185                                                   : PState;
1186         auto T = BuildMI(MBB, MI, DL, get(Hexagon::V6_vcmov))
1187                      .add(Op0)
1188                      .addReg(PReg, S)
1189                      .add(Op2);
1190         if (IsDestLive)
1191           T.addReg(Op0.getReg(), RegState::Implicit);
1192         IsDestLive = true;
1193       }
1194       if (Op0.getReg() != Op3.getReg()) {
1195         auto T = BuildMI(MBB, MI, DL, get(Hexagon::V6_vncmov))
1196                      .add(Op0)
1197                      .addReg(PReg, PState)
1198                      .add(Op3);
1199         if (IsDestLive)
1200           T.addReg(Op0.getReg(), RegState::Implicit);
1201       }
1202       MBB.erase(MI);
1203       return true;
1204     }
1205     case Hexagon::PS_wselect: {
1206       MachineOperand &Op0 = MI.getOperand(0);
1207       MachineOperand &Op1 = MI.getOperand(1);
1208       MachineOperand &Op2 = MI.getOperand(2);
1209       MachineOperand &Op3 = MI.getOperand(3);
1210       LivePhysRegs LiveAtMI(HRI);
1211       getLiveRegsAt(LiveAtMI, MI);
1212       bool IsDestLive = !LiveAtMI.available(MRI, Op0.getReg());
1213       unsigned PReg = Op1.getReg();
1214       assert(Op1.getSubReg() == 0);
1215       unsigned PState = getRegState(Op1);
1216 
1217       if (Op0.getReg() != Op2.getReg()) {
1218         unsigned S = Op0.getReg() != Op3.getReg() ? PState & ~RegState::Kill
1219                                                   : PState;
1220         unsigned SrcLo = HRI.getSubReg(Op2.getReg(), Hexagon::vsub_lo);
1221         unsigned SrcHi = HRI.getSubReg(Op2.getReg(), Hexagon::vsub_hi);
1222         auto T = BuildMI(MBB, MI, DL, get(Hexagon::V6_vccombine))
1223                      .add(Op0)
1224                      .addReg(PReg, S)
1225                      .add(Op1)
1226                      .addReg(SrcHi)
1227                      .addReg(SrcLo);
1228         if (IsDestLive)
1229           T.addReg(Op0.getReg(), RegState::Implicit);
1230         IsDestLive = true;
1231       }
1232       if (Op0.getReg() != Op3.getReg()) {
1233         unsigned SrcLo = HRI.getSubReg(Op3.getReg(), Hexagon::vsub_lo);
1234         unsigned SrcHi = HRI.getSubReg(Op3.getReg(), Hexagon::vsub_hi);
1235         auto T = BuildMI(MBB, MI, DL, get(Hexagon::V6_vnccombine))
1236                      .add(Op0)
1237                      .addReg(PReg, PState)
1238                      .addReg(SrcHi)
1239                      .addReg(SrcLo);
1240         if (IsDestLive)
1241           T.addReg(Op0.getReg(), RegState::Implicit);
1242       }
1243       MBB.erase(MI);
1244       return true;
1245     }
1246     case Hexagon::PS_tailcall_i:
1247       MI.setDesc(get(Hexagon::J2_jump));
1248       return true;
1249     case Hexagon::PS_tailcall_r:
1250     case Hexagon::PS_jmpret:
1251       MI.setDesc(get(Hexagon::J2_jumpr));
1252       return true;
1253     case Hexagon::PS_jmprett:
1254       MI.setDesc(get(Hexagon::J2_jumprt));
1255       return true;
1256     case Hexagon::PS_jmpretf:
1257       MI.setDesc(get(Hexagon::J2_jumprf));
1258       return true;
1259     case Hexagon::PS_jmprettnewpt:
1260       MI.setDesc(get(Hexagon::J2_jumprtnewpt));
1261       return true;
1262     case Hexagon::PS_jmpretfnewpt:
1263       MI.setDesc(get(Hexagon::J2_jumprfnewpt));
1264       return true;
1265     case Hexagon::PS_jmprettnew:
1266       MI.setDesc(get(Hexagon::J2_jumprtnew));
1267       return true;
1268     case Hexagon::PS_jmpretfnew:
1269       MI.setDesc(get(Hexagon::J2_jumprfnew));
1270       return true;
1271   }
1272 
1273   return false;
1274 }
1275 
1276 // We indicate that we want to reverse the branch by
1277 // inserting the reversed branching opcode.
1278 bool HexagonInstrInfo::reverseBranchCondition(
1279       SmallVectorImpl<MachineOperand> &Cond) const {
1280   if (Cond.empty())
1281     return true;
1282   assert(Cond[0].isImm() && "First entry in the cond vector not imm-val");
1283   unsigned opcode = Cond[0].getImm();
1284   //unsigned temp;
1285   assert(get(opcode).isBranch() && "Should be a branching condition.");
1286   if (isEndLoopN(opcode))
1287     return true;
1288   unsigned NewOpcode = getInvertedPredicatedOpcode(opcode);
1289   Cond[0].setImm(NewOpcode);
1290   return false;
1291 }
1292 
1293 void HexagonInstrInfo::insertNoop(MachineBasicBlock &MBB,
1294       MachineBasicBlock::iterator MI) const {
1295   DebugLoc DL;
1296   BuildMI(MBB, MI, DL, get(Hexagon::A2_nop));
1297 }
1298 
1299 bool HexagonInstrInfo::isPostIncrement(const MachineInstr &MI) const {
1300   return getAddrMode(MI) == HexagonII::PostInc;
1301 }
1302 
1303 // Returns true if an instruction is predicated irrespective of the predicate
1304 // sense. For example, all of the following will return true.
1305 // if (p0) R1 = add(R2, R3)
1306 // if (!p0) R1 = add(R2, R3)
1307 // if (p0.new) R1 = add(R2, R3)
1308 // if (!p0.new) R1 = add(R2, R3)
1309 // Note: New-value stores are not included here as in the current
1310 // implementation, we don't need to check their predicate sense.
1311 bool HexagonInstrInfo::isPredicated(const MachineInstr &MI) const {
1312   const uint64_t F = MI.getDesc().TSFlags;
1313   return (F >> HexagonII::PredicatedPos) & HexagonII::PredicatedMask;
1314 }
1315 
1316 bool HexagonInstrInfo::PredicateInstruction(
1317     MachineInstr &MI, ArrayRef<MachineOperand> Cond) const {
1318   if (Cond.empty() || isNewValueJump(Cond[0].getImm()) ||
1319       isEndLoopN(Cond[0].getImm())) {
1320     DEBUG(dbgs() << "\nCannot predicate:"; MI.dump(););
1321     return false;
1322   }
1323   int Opc = MI.getOpcode();
1324   assert (isPredicable(MI) && "Expected predicable instruction");
1325   bool invertJump = predOpcodeHasNot(Cond);
1326 
1327   // We have to predicate MI "in place", i.e. after this function returns,
1328   // MI will need to be transformed into a predicated form. To avoid com-
1329   // plicated manipulations with the operands (handling tied operands,
1330   // etc.), build a new temporary instruction, then overwrite MI with it.
1331 
1332   MachineBasicBlock &B = *MI.getParent();
1333   DebugLoc DL = MI.getDebugLoc();
1334   unsigned PredOpc = getCondOpcode(Opc, invertJump);
1335   MachineInstrBuilder T = BuildMI(B, MI, DL, get(PredOpc));
1336   unsigned NOp = 0, NumOps = MI.getNumOperands();
1337   while (NOp < NumOps) {
1338     MachineOperand &Op = MI.getOperand(NOp);
1339     if (!Op.isReg() || !Op.isDef() || Op.isImplicit())
1340       break;
1341     T.add(Op);
1342     NOp++;
1343   }
1344 
1345   unsigned PredReg, PredRegPos, PredRegFlags;
1346   bool GotPredReg = getPredReg(Cond, PredReg, PredRegPos, PredRegFlags);
1347   (void)GotPredReg;
1348   assert(GotPredReg);
1349   T.addReg(PredReg, PredRegFlags);
1350   while (NOp < NumOps)
1351     T.add(MI.getOperand(NOp++));
1352 
1353   MI.setDesc(get(PredOpc));
1354   while (unsigned n = MI.getNumOperands())
1355     MI.RemoveOperand(n-1);
1356   for (unsigned i = 0, n = T->getNumOperands(); i < n; ++i)
1357     MI.addOperand(T->getOperand(i));
1358 
1359   MachineBasicBlock::instr_iterator TI = T->getIterator();
1360   B.erase(TI);
1361 
1362   MachineRegisterInfo &MRI = B.getParent()->getRegInfo();
1363   MRI.clearKillFlags(PredReg);
1364   return true;
1365 }
1366 
1367 bool HexagonInstrInfo::SubsumesPredicate(ArrayRef<MachineOperand> Pred1,
1368       ArrayRef<MachineOperand> Pred2) const {
1369   // TODO: Fix this
1370   return false;
1371 }
1372 
1373 bool HexagonInstrInfo::DefinesPredicate(MachineInstr &MI,
1374       std::vector<MachineOperand> &Pred) const {
1375   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
1376 
1377   for (unsigned oper = 0; oper < MI.getNumOperands(); ++oper) {
1378     MachineOperand MO = MI.getOperand(oper);
1379     if (MO.isReg()) {
1380       if (!MO.isDef())
1381         continue;
1382       const TargetRegisterClass* RC = HRI.getMinimalPhysRegClass(MO.getReg());
1383       if (RC == &Hexagon::PredRegsRegClass) {
1384         Pred.push_back(MO);
1385         return true;
1386       }
1387       continue;
1388     } else if (MO.isRegMask()) {
1389       for (unsigned PR : Hexagon::PredRegsRegClass) {
1390         if (!MI.modifiesRegister(PR, &HRI))
1391           continue;
1392         Pred.push_back(MO);
1393         return true;
1394       }
1395     }
1396   }
1397   return false;
1398 }
1399 
1400 bool HexagonInstrInfo::isPredicable(const MachineInstr &MI) const {
1401   if (!MI.getDesc().isPredicable())
1402     return false;
1403 
1404   if (MI.isCall() || isTailCall(MI)) {
1405     if (!Subtarget.usePredicatedCalls())
1406       return false;
1407   }
1408   return true;
1409 }
1410 
1411 bool HexagonInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
1412                                             const MachineBasicBlock *MBB,
1413                                             const MachineFunction &MF) const {
1414   // Debug info is never a scheduling boundary. It's necessary to be explicit
1415   // due to the special treatment of IT instructions below, otherwise a
1416   // dbg_value followed by an IT will result in the IT instruction being
1417   // considered a scheduling hazard, which is wrong. It should be the actual
1418   // instruction preceding the dbg_value instruction(s), just like it is
1419   // when debug info is not present.
1420   if (MI.isDebugValue())
1421     return false;
1422 
1423   // Throwing call is a boundary.
1424   if (MI.isCall()) {
1425     // Don't mess around with no return calls.
1426     if (doesNotReturn(MI))
1427       return true;
1428     // If any of the block's successors is a landing pad, this could be a
1429     // throwing call.
1430     for (auto I : MBB->successors())
1431       if (I->isEHPad())
1432         return true;
1433   }
1434 
1435   // Terminators and labels can't be scheduled around.
1436   if (MI.getDesc().isTerminator() || MI.isPosition())
1437     return true;
1438 
1439   if (MI.isInlineAsm() && !ScheduleInlineAsm)
1440     return true;
1441 
1442   return false;
1443 }
1444 
1445 /// Measure the specified inline asm to determine an approximation of its
1446 /// length.
1447 /// Comments (which run till the next SeparatorString or newline) do not
1448 /// count as an instruction.
1449 /// Any other non-whitespace text is considered an instruction, with
1450 /// multiple instructions separated by SeparatorString or newlines.
1451 /// Variable-length instructions are not handled here; this function
1452 /// may be overloaded in the target code to do that.
1453 /// Hexagon counts the number of ##'s and adjust for that many
1454 /// constant exenders.
1455 unsigned HexagonInstrInfo::getInlineAsmLength(const char *Str,
1456       const MCAsmInfo &MAI) const {
1457   StringRef AStr(Str);
1458   // Count the number of instructions in the asm.
1459   bool atInsnStart = true;
1460   unsigned Length = 0;
1461   for (; *Str; ++Str) {
1462     if (*Str == '\n' || strncmp(Str, MAI.getSeparatorString(),
1463                                 strlen(MAI.getSeparatorString())) == 0)
1464       atInsnStart = true;
1465     if (atInsnStart && !std::isspace(static_cast<unsigned char>(*Str))) {
1466       Length += MAI.getMaxInstLength();
1467       atInsnStart = false;
1468     }
1469     if (atInsnStart && strncmp(Str, MAI.getCommentString().data(),
1470                                MAI.getCommentString().size()) == 0)
1471       atInsnStart = false;
1472   }
1473 
1474   // Add to size number of constant extenders seen * 4.
1475   StringRef Occ("##");
1476   Length += AStr.count(Occ)*4;
1477   return Length;
1478 }
1479 
1480 ScheduleHazardRecognizer*
1481 HexagonInstrInfo::CreateTargetPostRAHazardRecognizer(
1482       const InstrItineraryData *II, const ScheduleDAG *DAG) const {
1483   if (UseDFAHazardRec)
1484     return new HexagonHazardRecognizer(II, this, Subtarget);
1485   return TargetInstrInfo::CreateTargetPostRAHazardRecognizer(II, DAG);
1486 }
1487 
1488 /// \brief For a comparison instruction, return the source registers in
1489 /// \p SrcReg and \p SrcReg2 if having two register operands, and the value it
1490 /// compares against in CmpValue. Return true if the comparison instruction
1491 /// can be analyzed.
1492 bool HexagonInstrInfo::analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
1493                                       unsigned &SrcReg2, int &Mask,
1494                                       int &Value) const {
1495   unsigned Opc = MI.getOpcode();
1496 
1497   // Set mask and the first source register.
1498   switch (Opc) {
1499     case Hexagon::C2_cmpeq:
1500     case Hexagon::C2_cmpeqp:
1501     case Hexagon::C2_cmpgt:
1502     case Hexagon::C2_cmpgtp:
1503     case Hexagon::C2_cmpgtu:
1504     case Hexagon::C2_cmpgtup:
1505     case Hexagon::C4_cmpneq:
1506     case Hexagon::C4_cmplte:
1507     case Hexagon::C4_cmplteu:
1508     case Hexagon::C2_cmpeqi:
1509     case Hexagon::C2_cmpgti:
1510     case Hexagon::C2_cmpgtui:
1511     case Hexagon::C4_cmpneqi:
1512     case Hexagon::C4_cmplteui:
1513     case Hexagon::C4_cmpltei:
1514       SrcReg = MI.getOperand(1).getReg();
1515       Mask = ~0;
1516       break;
1517     case Hexagon::A4_cmpbeq:
1518     case Hexagon::A4_cmpbgt:
1519     case Hexagon::A4_cmpbgtu:
1520     case Hexagon::A4_cmpbeqi:
1521     case Hexagon::A4_cmpbgti:
1522     case Hexagon::A4_cmpbgtui:
1523       SrcReg = MI.getOperand(1).getReg();
1524       Mask = 0xFF;
1525       break;
1526     case Hexagon::A4_cmpheq:
1527     case Hexagon::A4_cmphgt:
1528     case Hexagon::A4_cmphgtu:
1529     case Hexagon::A4_cmpheqi:
1530     case Hexagon::A4_cmphgti:
1531     case Hexagon::A4_cmphgtui:
1532       SrcReg = MI.getOperand(1).getReg();
1533       Mask = 0xFFFF;
1534       break;
1535   }
1536 
1537   // Set the value/second source register.
1538   switch (Opc) {
1539     case Hexagon::C2_cmpeq:
1540     case Hexagon::C2_cmpeqp:
1541     case Hexagon::C2_cmpgt:
1542     case Hexagon::C2_cmpgtp:
1543     case Hexagon::C2_cmpgtu:
1544     case Hexagon::C2_cmpgtup:
1545     case Hexagon::A4_cmpbeq:
1546     case Hexagon::A4_cmpbgt:
1547     case Hexagon::A4_cmpbgtu:
1548     case Hexagon::A4_cmpheq:
1549     case Hexagon::A4_cmphgt:
1550     case Hexagon::A4_cmphgtu:
1551     case Hexagon::C4_cmpneq:
1552     case Hexagon::C4_cmplte:
1553     case Hexagon::C4_cmplteu:
1554       SrcReg2 = MI.getOperand(2).getReg();
1555       return true;
1556 
1557     case Hexagon::C2_cmpeqi:
1558     case Hexagon::C2_cmpgtui:
1559     case Hexagon::C2_cmpgti:
1560     case Hexagon::C4_cmpneqi:
1561     case Hexagon::C4_cmplteui:
1562     case Hexagon::C4_cmpltei:
1563     case Hexagon::A4_cmpbeqi:
1564     case Hexagon::A4_cmpbgti:
1565     case Hexagon::A4_cmpbgtui:
1566     case Hexagon::A4_cmpheqi:
1567     case Hexagon::A4_cmphgti:
1568     case Hexagon::A4_cmphgtui:
1569       SrcReg2 = 0;
1570       Value = MI.getOperand(2).getImm();
1571       return true;
1572   }
1573 
1574   return false;
1575 }
1576 
1577 unsigned HexagonInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
1578                                            const MachineInstr &MI,
1579                                            unsigned *PredCost) const {
1580   return getInstrTimingClassLatency(ItinData, MI);
1581 }
1582 
1583 DFAPacketizer *HexagonInstrInfo::CreateTargetScheduleState(
1584     const TargetSubtargetInfo &STI) const {
1585   const InstrItineraryData *II = STI.getInstrItineraryData();
1586   return static_cast<const HexagonSubtarget&>(STI).createDFAPacketizer(II);
1587 }
1588 
1589 // Inspired by this pair:
1590 //  %R13<def> = L2_loadri_io %R29, 136; mem:LD4[FixedStack0]
1591 //  S2_storeri_io %R29, 132, %R1<kill>; flags:  mem:ST4[FixedStack1]
1592 // Currently AA considers the addresses in these instructions to be aliasing.
1593 bool HexagonInstrInfo::areMemAccessesTriviallyDisjoint(
1594     MachineInstr &MIa, MachineInstr &MIb, AliasAnalysis *AA) const {
1595   if (MIa.hasUnmodeledSideEffects() || MIb.hasUnmodeledSideEffects() ||
1596       MIa.hasOrderedMemoryRef() || MIb.hasOrderedMemoryRef())
1597     return false;
1598 
1599   // Instructions that are pure loads, not loads and stores like memops are not
1600   // dependent.
1601   if (MIa.mayLoad() && !isMemOp(MIa) && MIb.mayLoad() && !isMemOp(MIb))
1602     return true;
1603 
1604   // Get the base register in MIa.
1605   unsigned BasePosA, OffsetPosA;
1606   if (!getBaseAndOffsetPosition(MIa, BasePosA, OffsetPosA))
1607     return false;
1608   const MachineOperand &BaseA = MIa.getOperand(BasePosA);
1609   unsigned BaseRegA = BaseA.getReg();
1610   unsigned BaseSubA = BaseA.getSubReg();
1611 
1612   // Get the base register in MIb.
1613   unsigned BasePosB, OffsetPosB;
1614   if (!getBaseAndOffsetPosition(MIb, BasePosB, OffsetPosB))
1615     return false;
1616   const MachineOperand &BaseB = MIb.getOperand(BasePosB);
1617   unsigned BaseRegB = BaseB.getReg();
1618   unsigned BaseSubB = BaseB.getSubReg();
1619 
1620   if (BaseRegA != BaseRegB || BaseSubA != BaseSubB)
1621     return false;
1622 
1623   // Get the access sizes.
1624   unsigned SizeA = getMemAccessSize(MIa);
1625   unsigned SizeB = getMemAccessSize(MIb);
1626 
1627   // Get the offsets. Handle immediates only for now.
1628   const MachineOperand &OffA = MIa.getOperand(OffsetPosA);
1629   const MachineOperand &OffB = MIb.getOperand(OffsetPosB);
1630   if (!MIa.getOperand(OffsetPosA).isImm() ||
1631       !MIb.getOperand(OffsetPosB).isImm())
1632     return false;
1633   int OffsetA = isPostIncrement(MIa) ? 0 : OffA.getImm();
1634   int OffsetB = isPostIncrement(MIb) ? 0 : OffB.getImm();
1635 
1636   // This is a mem access with the same base register and known offsets from it.
1637   // Reason about it.
1638   if (OffsetA > OffsetB) {
1639     uint64_t OffDiff = (uint64_t)((int64_t)OffsetA - (int64_t)OffsetB);
1640     return SizeB <= OffDiff;
1641   }
1642   if (OffsetA < OffsetB) {
1643     uint64_t OffDiff = (uint64_t)((int64_t)OffsetB - (int64_t)OffsetA);
1644     return SizeA <= OffDiff;
1645   }
1646 
1647   return false;
1648 }
1649 
1650 /// If the instruction is an increment of a constant value, return the amount.
1651 bool HexagonInstrInfo::getIncrementValue(const MachineInstr &MI,
1652       int &Value) const {
1653   if (isPostIncrement(MI)) {
1654     unsigned BasePos = 0, OffsetPos = 0;
1655     if (!getBaseAndOffsetPosition(MI, BasePos, OffsetPos))
1656       return false;
1657     const MachineOperand &OffsetOp = MI.getOperand(OffsetPos);
1658     if (OffsetOp.isImm()) {
1659       Value = OffsetOp.getImm();
1660       return true;
1661     }
1662   } else if (MI.getOpcode() == Hexagon::A2_addi) {
1663     const MachineOperand &AddOp = MI.getOperand(2);
1664     if (AddOp.isImm()) {
1665       Value = AddOp.getImm();
1666       return true;
1667     }
1668   }
1669 
1670   return false;
1671 }
1672 
1673 std::pair<unsigned, unsigned>
1674 HexagonInstrInfo::decomposeMachineOperandsTargetFlags(unsigned TF) const {
1675   return std::make_pair(TF & ~HexagonII::MO_Bitmasks,
1676                         TF & HexagonII::MO_Bitmasks);
1677 }
1678 
1679 ArrayRef<std::pair<unsigned, const char*>>
1680 HexagonInstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
1681   using namespace HexagonII;
1682 
1683   static const std::pair<unsigned, const char*> Flags[] = {
1684     {MO_PCREL,  "hexagon-pcrel"},
1685     {MO_GOT,    "hexagon-got"},
1686     {MO_LO16,   "hexagon-lo16"},
1687     {MO_HI16,   "hexagon-hi16"},
1688     {MO_GPREL,  "hexagon-gprel"},
1689     {MO_GDGOT,  "hexagon-gdgot"},
1690     {MO_GDPLT,  "hexagon-gdplt"},
1691     {MO_IE,     "hexagon-ie"},
1692     {MO_IEGOT,  "hexagon-iegot"},
1693     {MO_TPREL,  "hexagon-tprel"}
1694   };
1695   return makeArrayRef(Flags);
1696 }
1697 
1698 ArrayRef<std::pair<unsigned, const char*>>
1699 HexagonInstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const {
1700   using namespace HexagonII;
1701 
1702   static const std::pair<unsigned, const char*> Flags[] = {
1703     {HMOTF_ConstExtended, "hexagon-ext"}
1704   };
1705   return makeArrayRef(Flags);
1706 }
1707 
1708 unsigned HexagonInstrInfo::createVR(MachineFunction *MF, MVT VT) const {
1709   MachineRegisterInfo &MRI = MF->getRegInfo();
1710   const TargetRegisterClass *TRC;
1711   if (VT == MVT::i1) {
1712     TRC = &Hexagon::PredRegsRegClass;
1713   } else if (VT == MVT::i32 || VT == MVT::f32) {
1714     TRC = &Hexagon::IntRegsRegClass;
1715   } else if (VT == MVT::i64 || VT == MVT::f64) {
1716     TRC = &Hexagon::DoubleRegsRegClass;
1717   } else {
1718     llvm_unreachable("Cannot handle this register class");
1719   }
1720 
1721   unsigned NewReg = MRI.createVirtualRegister(TRC);
1722   return NewReg;
1723 }
1724 
1725 bool HexagonInstrInfo::isAbsoluteSet(const MachineInstr &MI) const {
1726   return (getAddrMode(MI) == HexagonII::AbsoluteSet);
1727 }
1728 
1729 bool HexagonInstrInfo::isAccumulator(const MachineInstr &MI) const {
1730   const uint64_t F = MI.getDesc().TSFlags;
1731   return((F >> HexagonII::AccumulatorPos) & HexagonII::AccumulatorMask);
1732 }
1733 
1734 bool HexagonInstrInfo::isComplex(const MachineInstr &MI) const {
1735   return !isTC1(MI) && !isTC2Early(MI) && !MI.getDesc().mayLoad() &&
1736          !MI.getDesc().mayStore() &&
1737          MI.getDesc().getOpcode() != Hexagon::S2_allocframe &&
1738          MI.getDesc().getOpcode() != Hexagon::L2_deallocframe &&
1739          !isMemOp(MI) && !MI.isBranch() && !MI.isReturn() && !MI.isCall();
1740 }
1741 
1742 // Return true if the instruction is a compund branch instruction.
1743 bool HexagonInstrInfo::isCompoundBranchInstr(const MachineInstr &MI) const {
1744   return getType(MI) == HexagonII::TypeCJ && MI.isBranch();
1745 }
1746 
1747 // TODO: In order to have isExtendable for fpimm/f32Ext, we need to handle
1748 // isFPImm and later getFPImm as well.
1749 bool HexagonInstrInfo::isConstExtended(const MachineInstr &MI) const {
1750   const uint64_t F = MI.getDesc().TSFlags;
1751   unsigned isExtended = (F >> HexagonII::ExtendedPos) & HexagonII::ExtendedMask;
1752   if (isExtended) // Instruction must be extended.
1753     return true;
1754 
1755   unsigned isExtendable =
1756     (F >> HexagonII::ExtendablePos) & HexagonII::ExtendableMask;
1757   if (!isExtendable)
1758     return false;
1759 
1760   if (MI.isCall())
1761     return false;
1762 
1763   short ExtOpNum = getCExtOpNum(MI);
1764   const MachineOperand &MO = MI.getOperand(ExtOpNum);
1765   // Use MO operand flags to determine if MO
1766   // has the HMOTF_ConstExtended flag set.
1767   if (MO.getTargetFlags() & HexagonII::HMOTF_ConstExtended)
1768     return true;
1769   // If this is a Machine BB address we are talking about, and it is
1770   // not marked as extended, say so.
1771   if (MO.isMBB())
1772     return false;
1773 
1774   // We could be using an instruction with an extendable immediate and shoehorn
1775   // a global address into it. If it is a global address it will be constant
1776   // extended. We do this for COMBINE.
1777   if (MO.isGlobal() || MO.isSymbol() || MO.isBlockAddress() ||
1778       MO.isJTI() || MO.isCPI() || MO.isFPImm())
1779     return true;
1780 
1781   // If the extendable operand is not 'Immediate' type, the instruction should
1782   // have 'isExtended' flag set.
1783   assert(MO.isImm() && "Extendable operand must be Immediate type");
1784 
1785   int MinValue = getMinValue(MI);
1786   int MaxValue = getMaxValue(MI);
1787   int ImmValue = MO.getImm();
1788 
1789   return (ImmValue < MinValue || ImmValue > MaxValue);
1790 }
1791 
1792 bool HexagonInstrInfo::isDeallocRet(const MachineInstr &MI) const {
1793   switch (MI.getOpcode()) {
1794   case Hexagon::L4_return:
1795   case Hexagon::L4_return_t:
1796   case Hexagon::L4_return_f:
1797   case Hexagon::L4_return_tnew_pnt:
1798   case Hexagon::L4_return_fnew_pnt:
1799   case Hexagon::L4_return_tnew_pt:
1800   case Hexagon::L4_return_fnew_pt:
1801     return true;
1802   }
1803   return false;
1804 }
1805 
1806 // Return true when ConsMI uses a register defined by ProdMI.
1807 bool HexagonInstrInfo::isDependent(const MachineInstr &ProdMI,
1808       const MachineInstr &ConsMI) const {
1809   if (!ProdMI.getDesc().getNumDefs())
1810     return false;
1811   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
1812 
1813   SmallVector<unsigned, 4> DefsA;
1814   SmallVector<unsigned, 4> DefsB;
1815   SmallVector<unsigned, 8> UsesA;
1816   SmallVector<unsigned, 8> UsesB;
1817 
1818   parseOperands(ProdMI, DefsA, UsesA);
1819   parseOperands(ConsMI, DefsB, UsesB);
1820 
1821   for (auto &RegA : DefsA)
1822     for (auto &RegB : UsesB) {
1823       // True data dependency.
1824       if (RegA == RegB)
1825         return true;
1826 
1827       if (TargetRegisterInfo::isPhysicalRegister(RegA))
1828         for (MCSubRegIterator SubRegs(RegA, &HRI); SubRegs.isValid(); ++SubRegs)
1829           if (RegB == *SubRegs)
1830             return true;
1831 
1832       if (TargetRegisterInfo::isPhysicalRegister(RegB))
1833         for (MCSubRegIterator SubRegs(RegB, &HRI); SubRegs.isValid(); ++SubRegs)
1834           if (RegA == *SubRegs)
1835             return true;
1836     }
1837 
1838   return false;
1839 }
1840 
1841 // Returns true if the instruction is alread a .cur.
1842 bool HexagonInstrInfo::isDotCurInst(const MachineInstr &MI) const {
1843   switch (MI.getOpcode()) {
1844   case Hexagon::V6_vL32b_cur_pi:
1845   case Hexagon::V6_vL32b_cur_ai:
1846     return true;
1847   }
1848   return false;
1849 }
1850 
1851 // Returns true, if any one of the operands is a dot new
1852 // insn, whether it is predicated dot new or register dot new.
1853 bool HexagonInstrInfo::isDotNewInst(const MachineInstr &MI) const {
1854   if (isNewValueInst(MI) || (isPredicated(MI) && isPredicatedNew(MI)))
1855     return true;
1856 
1857   return false;
1858 }
1859 
1860 /// Symmetrical. See if these two instructions are fit for duplex pair.
1861 bool HexagonInstrInfo::isDuplexPair(const MachineInstr &MIa,
1862       const MachineInstr &MIb) const {
1863   HexagonII::SubInstructionGroup MIaG = getDuplexCandidateGroup(MIa);
1864   HexagonII::SubInstructionGroup MIbG = getDuplexCandidateGroup(MIb);
1865   return (isDuplexPairMatch(MIaG, MIbG) || isDuplexPairMatch(MIbG, MIaG));
1866 }
1867 
1868 bool HexagonInstrInfo::isEarlySourceInstr(const MachineInstr &MI) const {
1869   if (MI.mayLoad() || MI.mayStore() || MI.isCompare())
1870     return true;
1871 
1872   // Multiply
1873   unsigned SchedClass = MI.getDesc().getSchedClass();
1874   return is_TC4x(SchedClass) || is_TC3x(SchedClass);
1875 }
1876 
1877 bool HexagonInstrInfo::isEndLoopN(unsigned Opcode) const {
1878   return (Opcode == Hexagon::ENDLOOP0 ||
1879           Opcode == Hexagon::ENDLOOP1);
1880 }
1881 
1882 bool HexagonInstrInfo::isExpr(unsigned OpType) const {
1883   switch(OpType) {
1884   case MachineOperand::MO_MachineBasicBlock:
1885   case MachineOperand::MO_GlobalAddress:
1886   case MachineOperand::MO_ExternalSymbol:
1887   case MachineOperand::MO_JumpTableIndex:
1888   case MachineOperand::MO_ConstantPoolIndex:
1889   case MachineOperand::MO_BlockAddress:
1890     return true;
1891   default:
1892     return false;
1893   }
1894 }
1895 
1896 bool HexagonInstrInfo::isExtendable(const MachineInstr &MI) const {
1897   const MCInstrDesc &MID = MI.getDesc();
1898   const uint64_t F = MID.TSFlags;
1899   if ((F >> HexagonII::ExtendablePos) & HexagonII::ExtendableMask)
1900     return true;
1901 
1902   // TODO: This is largely obsolete now. Will need to be removed
1903   // in consecutive patches.
1904   switch (MI.getOpcode()) {
1905     // PS_fi and PS_fia remain special cases.
1906     case Hexagon::PS_fi:
1907     case Hexagon::PS_fia:
1908       return true;
1909     default:
1910       return false;
1911   }
1912   return  false;
1913 }
1914 
1915 // This returns true in two cases:
1916 // - The OP code itself indicates that this is an extended instruction.
1917 // - One of MOs has been marked with HMOTF_ConstExtended flag.
1918 bool HexagonInstrInfo::isExtended(const MachineInstr &MI) const {
1919   // First check if this is permanently extended op code.
1920   const uint64_t F = MI.getDesc().TSFlags;
1921   if ((F >> HexagonII::ExtendedPos) & HexagonII::ExtendedMask)
1922     return true;
1923   // Use MO operand flags to determine if one of MI's operands
1924   // has HMOTF_ConstExtended flag set.
1925   for (const MachineOperand &MO : MI.operands())
1926     if (MO.getTargetFlags() & HexagonII::HMOTF_ConstExtended)
1927       return true;
1928   return  false;
1929 }
1930 
1931 bool HexagonInstrInfo::isFloat(const MachineInstr &MI) const {
1932   unsigned Opcode = MI.getOpcode();
1933   const uint64_t F = get(Opcode).TSFlags;
1934   return (F >> HexagonII::FPPos) & HexagonII::FPMask;
1935 }
1936 
1937 // No V60 HVX VMEM with A_INDIRECT.
1938 bool HexagonInstrInfo::isHVXMemWithAIndirect(const MachineInstr &I,
1939       const MachineInstr &J) const {
1940   if (!isHVXVec(I))
1941     return false;
1942   if (!I.mayLoad() && !I.mayStore())
1943     return false;
1944   return J.isIndirectBranch() || isIndirectCall(J) || isIndirectL4Return(J);
1945 }
1946 
1947 bool HexagonInstrInfo::isIndirectCall(const MachineInstr &MI) const {
1948   switch (MI.getOpcode()) {
1949   case Hexagon::J2_callr:
1950   case Hexagon::J2_callrf:
1951   case Hexagon::J2_callrt:
1952   case Hexagon::PS_call_nr:
1953     return true;
1954   }
1955   return false;
1956 }
1957 
1958 bool HexagonInstrInfo::isIndirectL4Return(const MachineInstr &MI) const {
1959   switch (MI.getOpcode()) {
1960   case Hexagon::L4_return:
1961   case Hexagon::L4_return_t:
1962   case Hexagon::L4_return_f:
1963   case Hexagon::L4_return_fnew_pnt:
1964   case Hexagon::L4_return_fnew_pt:
1965   case Hexagon::L4_return_tnew_pnt:
1966   case Hexagon::L4_return_tnew_pt:
1967     return true;
1968   }
1969   return false;
1970 }
1971 
1972 bool HexagonInstrInfo::isJumpR(const MachineInstr &MI) const {
1973   switch (MI.getOpcode()) {
1974   case Hexagon::J2_jumpr:
1975   case Hexagon::J2_jumprt:
1976   case Hexagon::J2_jumprf:
1977   case Hexagon::J2_jumprtnewpt:
1978   case Hexagon::J2_jumprfnewpt:
1979   case Hexagon::J2_jumprtnew:
1980   case Hexagon::J2_jumprfnew:
1981     return true;
1982   }
1983   return false;
1984 }
1985 
1986 // Return true if a given MI can accommodate given offset.
1987 // Use abs estimate as oppose to the exact number.
1988 // TODO: This will need to be changed to use MC level
1989 // definition of instruction extendable field size.
1990 bool HexagonInstrInfo::isJumpWithinBranchRange(const MachineInstr &MI,
1991       unsigned offset) const {
1992   // This selection of jump instructions matches to that what
1993   // analyzeBranch can parse, plus NVJ.
1994   if (isNewValueJump(MI)) // r9:2
1995     return isInt<11>(offset);
1996 
1997   switch (MI.getOpcode()) {
1998   // Still missing Jump to address condition on register value.
1999   default:
2000     return false;
2001   case Hexagon::J2_jump: // bits<24> dst; // r22:2
2002   case Hexagon::J2_call:
2003   case Hexagon::PS_call_nr:
2004     return isInt<24>(offset);
2005   case Hexagon::J2_jumpt: //bits<17> dst; // r15:2
2006   case Hexagon::J2_jumpf:
2007   case Hexagon::J2_jumptnew:
2008   case Hexagon::J2_jumptnewpt:
2009   case Hexagon::J2_jumpfnew:
2010   case Hexagon::J2_jumpfnewpt:
2011   case Hexagon::J2_callt:
2012   case Hexagon::J2_callf:
2013     return isInt<17>(offset);
2014   case Hexagon::J2_loop0i:
2015   case Hexagon::J2_loop0iext:
2016   case Hexagon::J2_loop0r:
2017   case Hexagon::J2_loop0rext:
2018   case Hexagon::J2_loop1i:
2019   case Hexagon::J2_loop1iext:
2020   case Hexagon::J2_loop1r:
2021   case Hexagon::J2_loop1rext:
2022     return isInt<9>(offset);
2023   // TODO: Add all the compound branches here. Can we do this in Relation model?
2024   case Hexagon::J4_cmpeqi_tp0_jump_nt:
2025   case Hexagon::J4_cmpeqi_tp1_jump_nt:
2026     return isInt<11>(offset);
2027   }
2028 }
2029 
2030 bool HexagonInstrInfo::isLateInstrFeedsEarlyInstr(const MachineInstr &LRMI,
2031       const MachineInstr &ESMI) const {
2032   bool isLate = isLateResultInstr(LRMI);
2033   bool isEarly = isEarlySourceInstr(ESMI);
2034 
2035   DEBUG(dbgs() << "V60" <<  (isLate ? "-LR  " : " --  "));
2036   DEBUG(LRMI.dump());
2037   DEBUG(dbgs() << "V60" <<  (isEarly ? "-ES  " : " --  "));
2038   DEBUG(ESMI.dump());
2039 
2040   if (isLate && isEarly) {
2041     DEBUG(dbgs() << "++Is Late Result feeding Early Source\n");
2042     return true;
2043   }
2044 
2045   return false;
2046 }
2047 
2048 bool HexagonInstrInfo::isLateResultInstr(const MachineInstr &MI) const {
2049   switch (MI.getOpcode()) {
2050   case TargetOpcode::EXTRACT_SUBREG:
2051   case TargetOpcode::INSERT_SUBREG:
2052   case TargetOpcode::SUBREG_TO_REG:
2053   case TargetOpcode::REG_SEQUENCE:
2054   case TargetOpcode::IMPLICIT_DEF:
2055   case TargetOpcode::COPY:
2056   case TargetOpcode::INLINEASM:
2057   case TargetOpcode::PHI:
2058     return false;
2059   default:
2060     break;
2061   }
2062 
2063   unsigned SchedClass = MI.getDesc().getSchedClass();
2064   return !is_TC1(SchedClass);
2065 }
2066 
2067 bool HexagonInstrInfo::isLateSourceInstr(const MachineInstr &MI) const {
2068   // Instructions with iclass A_CVI_VX and attribute A_CVI_LATE uses a multiply
2069   // resource, but all operands can be received late like an ALU instruction.
2070   return getType(MI) == HexagonII::TypeCVI_VX_LATE;
2071 }
2072 
2073 bool HexagonInstrInfo::isLoopN(const MachineInstr &MI) const {
2074   unsigned Opcode = MI.getOpcode();
2075   return Opcode == Hexagon::J2_loop0i    ||
2076          Opcode == Hexagon::J2_loop0r    ||
2077          Opcode == Hexagon::J2_loop0iext ||
2078          Opcode == Hexagon::J2_loop0rext ||
2079          Opcode == Hexagon::J2_loop1i    ||
2080          Opcode == Hexagon::J2_loop1r    ||
2081          Opcode == Hexagon::J2_loop1iext ||
2082          Opcode == Hexagon::J2_loop1rext;
2083 }
2084 
2085 bool HexagonInstrInfo::isMemOp(const MachineInstr &MI) const {
2086   switch (MI.getOpcode()) {
2087     default: return false;
2088     case Hexagon::L4_iadd_memopw_io:
2089     case Hexagon::L4_isub_memopw_io:
2090     case Hexagon::L4_add_memopw_io:
2091     case Hexagon::L4_sub_memopw_io:
2092     case Hexagon::L4_and_memopw_io:
2093     case Hexagon::L4_or_memopw_io:
2094     case Hexagon::L4_iadd_memoph_io:
2095     case Hexagon::L4_isub_memoph_io:
2096     case Hexagon::L4_add_memoph_io:
2097     case Hexagon::L4_sub_memoph_io:
2098     case Hexagon::L4_and_memoph_io:
2099     case Hexagon::L4_or_memoph_io:
2100     case Hexagon::L4_iadd_memopb_io:
2101     case Hexagon::L4_isub_memopb_io:
2102     case Hexagon::L4_add_memopb_io:
2103     case Hexagon::L4_sub_memopb_io:
2104     case Hexagon::L4_and_memopb_io:
2105     case Hexagon::L4_or_memopb_io:
2106     case Hexagon::L4_ior_memopb_io:
2107     case Hexagon::L4_ior_memoph_io:
2108     case Hexagon::L4_ior_memopw_io:
2109     case Hexagon::L4_iand_memopb_io:
2110     case Hexagon::L4_iand_memoph_io:
2111     case Hexagon::L4_iand_memopw_io:
2112     return true;
2113   }
2114   return false;
2115 }
2116 
2117 bool HexagonInstrInfo::isNewValue(const MachineInstr &MI) const {
2118   const uint64_t F = MI.getDesc().TSFlags;
2119   return (F >> HexagonII::NewValuePos) & HexagonII::NewValueMask;
2120 }
2121 
2122 bool HexagonInstrInfo::isNewValue(unsigned Opcode) const {
2123   const uint64_t F = get(Opcode).TSFlags;
2124   return (F >> HexagonII::NewValuePos) & HexagonII::NewValueMask;
2125 }
2126 
2127 bool HexagonInstrInfo::isNewValueInst(const MachineInstr &MI) const {
2128   return isNewValueJump(MI) || isNewValueStore(MI);
2129 }
2130 
2131 bool HexagonInstrInfo::isNewValueJump(const MachineInstr &MI) const {
2132   return isNewValue(MI) && MI.isBranch();
2133 }
2134 
2135 bool HexagonInstrInfo::isNewValueJump(unsigned Opcode) const {
2136   return isNewValue(Opcode) && get(Opcode).isBranch() && isPredicated(Opcode);
2137 }
2138 
2139 bool HexagonInstrInfo::isNewValueStore(const MachineInstr &MI) const {
2140   const uint64_t F = MI.getDesc().TSFlags;
2141   return (F >> HexagonII::NVStorePos) & HexagonII::NVStoreMask;
2142 }
2143 
2144 bool HexagonInstrInfo::isNewValueStore(unsigned Opcode) const {
2145   const uint64_t F = get(Opcode).TSFlags;
2146   return (F >> HexagonII::NVStorePos) & HexagonII::NVStoreMask;
2147 }
2148 
2149 // Returns true if a particular operand is extendable for an instruction.
2150 bool HexagonInstrInfo::isOperandExtended(const MachineInstr &MI,
2151     unsigned OperandNum) const {
2152   const uint64_t F = MI.getDesc().TSFlags;
2153   return ((F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask)
2154           == OperandNum;
2155 }
2156 
2157 bool HexagonInstrInfo::isPredicatedNew(const MachineInstr &MI) const {
2158   const uint64_t F = MI.getDesc().TSFlags;
2159   assert(isPredicated(MI));
2160   return (F >> HexagonII::PredicatedNewPos) & HexagonII::PredicatedNewMask;
2161 }
2162 
2163 bool HexagonInstrInfo::isPredicatedNew(unsigned Opcode) const {
2164   const uint64_t F = get(Opcode).TSFlags;
2165   assert(isPredicated(Opcode));
2166   return (F >> HexagonII::PredicatedNewPos) & HexagonII::PredicatedNewMask;
2167 }
2168 
2169 bool HexagonInstrInfo::isPredicatedTrue(const MachineInstr &MI) const {
2170   const uint64_t F = MI.getDesc().TSFlags;
2171   return !((F >> HexagonII::PredicatedFalsePos) &
2172            HexagonII::PredicatedFalseMask);
2173 }
2174 
2175 bool HexagonInstrInfo::isPredicatedTrue(unsigned Opcode) const {
2176   const uint64_t F = get(Opcode).TSFlags;
2177   // Make sure that the instruction is predicated.
2178   assert((F>> HexagonII::PredicatedPos) & HexagonII::PredicatedMask);
2179   return !((F >> HexagonII::PredicatedFalsePos) &
2180            HexagonII::PredicatedFalseMask);
2181 }
2182 
2183 bool HexagonInstrInfo::isPredicated(unsigned Opcode) const {
2184   const uint64_t F = get(Opcode).TSFlags;
2185   return (F >> HexagonII::PredicatedPos) & HexagonII::PredicatedMask;
2186 }
2187 
2188 bool HexagonInstrInfo::isPredicateLate(unsigned Opcode) const {
2189   const uint64_t F = get(Opcode).TSFlags;
2190   return ~(F >> HexagonII::PredicateLatePos) & HexagonII::PredicateLateMask;
2191 }
2192 
2193 bool HexagonInstrInfo::isPredictedTaken(unsigned Opcode) const {
2194   const uint64_t F = get(Opcode).TSFlags;
2195   assert(get(Opcode).isBranch() &&
2196          (isPredicatedNew(Opcode) || isNewValue(Opcode)));
2197   return (F >> HexagonII::TakenPos) & HexagonII::TakenMask;
2198 }
2199 
2200 bool HexagonInstrInfo::isSaveCalleeSavedRegsCall(const MachineInstr &MI) const {
2201   return MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4 ||
2202          MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT ||
2203          MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_PIC ||
2204          MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT_PIC;
2205 }
2206 
2207 bool HexagonInstrInfo::isSignExtendingLoad(const MachineInstr &MI) const {
2208   switch (MI.getOpcode()) {
2209   // Byte
2210   case Hexagon::L2_loadrb_io:
2211   case Hexagon::L4_loadrb_ur:
2212   case Hexagon::L4_loadrb_ap:
2213   case Hexagon::L2_loadrb_pr:
2214   case Hexagon::L2_loadrb_pbr:
2215   case Hexagon::L2_loadrb_pi:
2216   case Hexagon::L2_loadrb_pci:
2217   case Hexagon::L2_loadrb_pcr:
2218   case Hexagon::L2_loadbsw2_io:
2219   case Hexagon::L4_loadbsw2_ur:
2220   case Hexagon::L4_loadbsw2_ap:
2221   case Hexagon::L2_loadbsw2_pr:
2222   case Hexagon::L2_loadbsw2_pbr:
2223   case Hexagon::L2_loadbsw2_pi:
2224   case Hexagon::L2_loadbsw2_pci:
2225   case Hexagon::L2_loadbsw2_pcr:
2226   case Hexagon::L2_loadbsw4_io:
2227   case Hexagon::L4_loadbsw4_ur:
2228   case Hexagon::L4_loadbsw4_ap:
2229   case Hexagon::L2_loadbsw4_pr:
2230   case Hexagon::L2_loadbsw4_pbr:
2231   case Hexagon::L2_loadbsw4_pi:
2232   case Hexagon::L2_loadbsw4_pci:
2233   case Hexagon::L2_loadbsw4_pcr:
2234   case Hexagon::L4_loadrb_rr:
2235   case Hexagon::L2_ploadrbt_io:
2236   case Hexagon::L2_ploadrbt_pi:
2237   case Hexagon::L2_ploadrbf_io:
2238   case Hexagon::L2_ploadrbf_pi:
2239   case Hexagon::L2_ploadrbtnew_io:
2240   case Hexagon::L2_ploadrbfnew_io:
2241   case Hexagon::L4_ploadrbt_rr:
2242   case Hexagon::L4_ploadrbf_rr:
2243   case Hexagon::L4_ploadrbtnew_rr:
2244   case Hexagon::L4_ploadrbfnew_rr:
2245   case Hexagon::L2_ploadrbtnew_pi:
2246   case Hexagon::L2_ploadrbfnew_pi:
2247   case Hexagon::L4_ploadrbt_abs:
2248   case Hexagon::L4_ploadrbf_abs:
2249   case Hexagon::L4_ploadrbtnew_abs:
2250   case Hexagon::L4_ploadrbfnew_abs:
2251   case Hexagon::L2_loadrbgp:
2252   // Half
2253   case Hexagon::L2_loadrh_io:
2254   case Hexagon::L4_loadrh_ur:
2255   case Hexagon::L4_loadrh_ap:
2256   case Hexagon::L2_loadrh_pr:
2257   case Hexagon::L2_loadrh_pbr:
2258   case Hexagon::L2_loadrh_pi:
2259   case Hexagon::L2_loadrh_pci:
2260   case Hexagon::L2_loadrh_pcr:
2261   case Hexagon::L4_loadrh_rr:
2262   case Hexagon::L2_ploadrht_io:
2263   case Hexagon::L2_ploadrht_pi:
2264   case Hexagon::L2_ploadrhf_io:
2265   case Hexagon::L2_ploadrhf_pi:
2266   case Hexagon::L2_ploadrhtnew_io:
2267   case Hexagon::L2_ploadrhfnew_io:
2268   case Hexagon::L4_ploadrht_rr:
2269   case Hexagon::L4_ploadrhf_rr:
2270   case Hexagon::L4_ploadrhtnew_rr:
2271   case Hexagon::L4_ploadrhfnew_rr:
2272   case Hexagon::L2_ploadrhtnew_pi:
2273   case Hexagon::L2_ploadrhfnew_pi:
2274   case Hexagon::L4_ploadrht_abs:
2275   case Hexagon::L4_ploadrhf_abs:
2276   case Hexagon::L4_ploadrhtnew_abs:
2277   case Hexagon::L4_ploadrhfnew_abs:
2278   case Hexagon::L2_loadrhgp:
2279     return true;
2280   default:
2281     return false;
2282   }
2283 }
2284 
2285 bool HexagonInstrInfo::isSolo(const MachineInstr &MI) const {
2286   const uint64_t F = MI.getDesc().TSFlags;
2287   return (F >> HexagonII::SoloPos) & HexagonII::SoloMask;
2288 }
2289 
2290 bool HexagonInstrInfo::isSpillPredRegOp(const MachineInstr &MI) const {
2291   switch (MI.getOpcode()) {
2292   case Hexagon::STriw_pred:
2293   case Hexagon::LDriw_pred:
2294     return true;
2295   default:
2296     return false;
2297   }
2298 }
2299 
2300 bool HexagonInstrInfo::isTailCall(const MachineInstr &MI) const {
2301   if (!MI.isBranch())
2302     return false;
2303 
2304   for (auto &Op : MI.operands())
2305     if (Op.isGlobal() || Op.isSymbol())
2306       return true;
2307   return false;
2308 }
2309 
2310 // Returns true when SU has a timing class TC1.
2311 bool HexagonInstrInfo::isTC1(const MachineInstr &MI) const {
2312   unsigned SchedClass = MI.getDesc().getSchedClass();
2313   return is_TC1(SchedClass);
2314 }
2315 
2316 bool HexagonInstrInfo::isTC2(const MachineInstr &MI) const {
2317   unsigned SchedClass = MI.getDesc().getSchedClass();
2318   return is_TC2(SchedClass);
2319 }
2320 
2321 bool HexagonInstrInfo::isTC2Early(const MachineInstr &MI) const {
2322   unsigned SchedClass = MI.getDesc().getSchedClass();
2323   return is_TC2early(SchedClass);
2324 }
2325 
2326 bool HexagonInstrInfo::isTC4x(const MachineInstr &MI) const {
2327   unsigned SchedClass = MI.getDesc().getSchedClass();
2328   return is_TC4x(SchedClass);
2329 }
2330 
2331 // Schedule this ASAP.
2332 bool HexagonInstrInfo::isToBeScheduledASAP(const MachineInstr &MI1,
2333       const MachineInstr &MI2) const {
2334   if (mayBeCurLoad(MI1)) {
2335     // if (result of SU is used in Next) return true;
2336     unsigned DstReg = MI1.getOperand(0).getReg();
2337     int N = MI2.getNumOperands();
2338     for (int I = 0; I < N; I++)
2339       if (MI2.getOperand(I).isReg() && DstReg == MI2.getOperand(I).getReg())
2340         return true;
2341   }
2342   if (mayBeNewStore(MI2))
2343     if (MI2.getOpcode() == Hexagon::V6_vS32b_pi)
2344       if (MI1.getOperand(0).isReg() && MI2.getOperand(3).isReg() &&
2345           MI1.getOperand(0).getReg() == MI2.getOperand(3).getReg())
2346         return true;
2347   return false;
2348 }
2349 
2350 bool HexagonInstrInfo::isHVXVec(const MachineInstr &MI) const {
2351   const uint64_t V = getType(MI);
2352   return HexagonII::TypeCVI_FIRST <= V && V <= HexagonII::TypeCVI_LAST;
2353 }
2354 
2355 // Check if the Offset is a valid auto-inc imm by Load/Store Type.
2356 bool HexagonInstrInfo::isValidAutoIncImm(const EVT VT, int Offset) const {
2357   int Size = VT.getSizeInBits() / 8;
2358   if (Offset % Size != 0)
2359     return false;
2360   int Count = Offset / Size;
2361 
2362   switch (VT.getSimpleVT().SimpleTy) {
2363     // For scalars the auto-inc is s4
2364     case MVT::i8:
2365     case MVT::i16:
2366     case MVT::i32:
2367     case MVT::i64:
2368       return isInt<4>(Count);
2369     // For HVX vectors the auto-inc is s3
2370     case MVT::v64i8:
2371     case MVT::v32i16:
2372     case MVT::v16i32:
2373     case MVT::v8i64:
2374     case MVT::v128i8:
2375     case MVT::v64i16:
2376     case MVT::v32i32:
2377     case MVT::v16i64:
2378       return isInt<3>(Count);
2379     default:
2380       break;
2381   }
2382 
2383   llvm_unreachable("Not an valid type!");
2384 }
2385 
2386 bool HexagonInstrInfo::isValidOffset(unsigned Opcode, int Offset,
2387       const TargetRegisterInfo *TRI, bool Extend) const {
2388   // This function is to check whether the "Offset" is in the correct range of
2389   // the given "Opcode". If "Offset" is not in the correct range, "A2_addi" is
2390   // inserted to calculate the final address. Due to this reason, the function
2391   // assumes that the "Offset" has correct alignment.
2392   // We used to assert if the offset was not properly aligned, however,
2393   // there are cases where a misaligned pointer recast can cause this
2394   // problem, and we need to allow for it. The front end warns of such
2395   // misaligns with respect to load size.
2396   switch (Opcode) {
2397   case Hexagon::PS_vstorerq_ai:
2398   case Hexagon::PS_vstorerw_ai:
2399   case Hexagon::PS_vstorerw_nt_ai:
2400   case Hexagon::PS_vloadrq_ai:
2401   case Hexagon::PS_vloadrw_ai:
2402   case Hexagon::PS_vloadrw_nt_ai:
2403   case Hexagon::V6_vL32b_ai:
2404   case Hexagon::V6_vS32b_ai:
2405   case Hexagon::V6_vL32b_nt_ai:
2406   case Hexagon::V6_vS32b_nt_ai:
2407   case Hexagon::V6_vL32Ub_ai:
2408   case Hexagon::V6_vS32Ub_ai: {
2409     unsigned VectorSize = TRI->getSpillSize(Hexagon::HvxVRRegClass);
2410     assert(isPowerOf2_32(VectorSize));
2411     if (Offset & (VectorSize-1))
2412       return false;
2413     return isInt<4>(Offset >> Log2_32(VectorSize));
2414   }
2415 
2416   case Hexagon::J2_loop0i:
2417   case Hexagon::J2_loop1i:
2418     return isUInt<10>(Offset);
2419 
2420   case Hexagon::S4_storeirb_io:
2421   case Hexagon::S4_storeirbt_io:
2422   case Hexagon::S4_storeirbf_io:
2423     return isUInt<6>(Offset);
2424 
2425   case Hexagon::S4_storeirh_io:
2426   case Hexagon::S4_storeirht_io:
2427   case Hexagon::S4_storeirhf_io:
2428     return isShiftedUInt<6,1>(Offset);
2429 
2430   case Hexagon::S4_storeiri_io:
2431   case Hexagon::S4_storeirit_io:
2432   case Hexagon::S4_storeirif_io:
2433     return isShiftedUInt<6,2>(Offset);
2434   }
2435 
2436   if (Extend)
2437     return true;
2438 
2439   switch (Opcode) {
2440   case Hexagon::L2_loadri_io:
2441   case Hexagon::S2_storeri_io:
2442     return (Offset >= Hexagon_MEMW_OFFSET_MIN) &&
2443       (Offset <= Hexagon_MEMW_OFFSET_MAX);
2444 
2445   case Hexagon::L2_loadrd_io:
2446   case Hexagon::S2_storerd_io:
2447     return (Offset >= Hexagon_MEMD_OFFSET_MIN) &&
2448       (Offset <= Hexagon_MEMD_OFFSET_MAX);
2449 
2450   case Hexagon::L2_loadrh_io:
2451   case Hexagon::L2_loadruh_io:
2452   case Hexagon::S2_storerh_io:
2453   case Hexagon::S2_storerf_io:
2454     return (Offset >= Hexagon_MEMH_OFFSET_MIN) &&
2455       (Offset <= Hexagon_MEMH_OFFSET_MAX);
2456 
2457   case Hexagon::L2_loadrb_io:
2458   case Hexagon::L2_loadrub_io:
2459   case Hexagon::S2_storerb_io:
2460     return (Offset >= Hexagon_MEMB_OFFSET_MIN) &&
2461       (Offset <= Hexagon_MEMB_OFFSET_MAX);
2462 
2463   case Hexagon::A2_addi:
2464     return (Offset >= Hexagon_ADDI_OFFSET_MIN) &&
2465       (Offset <= Hexagon_ADDI_OFFSET_MAX);
2466 
2467   case Hexagon::L4_iadd_memopw_io:
2468   case Hexagon::L4_isub_memopw_io:
2469   case Hexagon::L4_add_memopw_io:
2470   case Hexagon::L4_sub_memopw_io:
2471   case Hexagon::L4_and_memopw_io:
2472   case Hexagon::L4_or_memopw_io:
2473     return (0 <= Offset && Offset <= 255);
2474 
2475   case Hexagon::L4_iadd_memoph_io:
2476   case Hexagon::L4_isub_memoph_io:
2477   case Hexagon::L4_add_memoph_io:
2478   case Hexagon::L4_sub_memoph_io:
2479   case Hexagon::L4_and_memoph_io:
2480   case Hexagon::L4_or_memoph_io:
2481     return (0 <= Offset && Offset <= 127);
2482 
2483   case Hexagon::L4_iadd_memopb_io:
2484   case Hexagon::L4_isub_memopb_io:
2485   case Hexagon::L4_add_memopb_io:
2486   case Hexagon::L4_sub_memopb_io:
2487   case Hexagon::L4_and_memopb_io:
2488   case Hexagon::L4_or_memopb_io:
2489     return (0 <= Offset && Offset <= 63);
2490 
2491   // LDriw_xxx and STriw_xxx are pseudo operations, so it has to take offset of
2492   // any size. Later pass knows how to handle it.
2493   case Hexagon::STriw_pred:
2494   case Hexagon::LDriw_pred:
2495   case Hexagon::STriw_mod:
2496   case Hexagon::LDriw_mod:
2497     return true;
2498 
2499   case Hexagon::PS_fi:
2500   case Hexagon::PS_fia:
2501   case Hexagon::INLINEASM:
2502     return true;
2503 
2504   case Hexagon::L2_ploadrbt_io:
2505   case Hexagon::L2_ploadrbf_io:
2506   case Hexagon::L2_ploadrubt_io:
2507   case Hexagon::L2_ploadrubf_io:
2508   case Hexagon::S2_pstorerbt_io:
2509   case Hexagon::S2_pstorerbf_io:
2510     return isUInt<6>(Offset);
2511 
2512   case Hexagon::L2_ploadrht_io:
2513   case Hexagon::L2_ploadrhf_io:
2514   case Hexagon::L2_ploadruht_io:
2515   case Hexagon::L2_ploadruhf_io:
2516   case Hexagon::S2_pstorerht_io:
2517   case Hexagon::S2_pstorerhf_io:
2518     return isShiftedUInt<6,1>(Offset);
2519 
2520   case Hexagon::L2_ploadrit_io:
2521   case Hexagon::L2_ploadrif_io:
2522   case Hexagon::S2_pstorerit_io:
2523   case Hexagon::S2_pstorerif_io:
2524     return isShiftedUInt<6,2>(Offset);
2525 
2526   case Hexagon::L2_ploadrdt_io:
2527   case Hexagon::L2_ploadrdf_io:
2528   case Hexagon::S2_pstorerdt_io:
2529   case Hexagon::S2_pstorerdf_io:
2530     return isShiftedUInt<6,3>(Offset);
2531   } // switch
2532 
2533   llvm_unreachable("No offset range is defined for this opcode. "
2534                    "Please define it in the above switch statement!");
2535 }
2536 
2537 bool HexagonInstrInfo::isVecAcc(const MachineInstr &MI) const {
2538   return isHVXVec(MI) && isAccumulator(MI);
2539 }
2540 
2541 bool HexagonInstrInfo::isVecALU(const MachineInstr &MI) const {
2542   const uint64_t F = get(MI.getOpcode()).TSFlags;
2543   const uint64_t V = ((F >> HexagonII::TypePos) & HexagonII::TypeMask);
2544   return
2545     V == HexagonII::TypeCVI_VA         ||
2546     V == HexagonII::TypeCVI_VA_DV;
2547 }
2548 
2549 bool HexagonInstrInfo::isVecUsableNextPacket(const MachineInstr &ProdMI,
2550       const MachineInstr &ConsMI) const {
2551   if (EnableACCForwarding && isVecAcc(ProdMI) && isVecAcc(ConsMI))
2552     return true;
2553 
2554   if (EnableALUForwarding && (isVecALU(ConsMI) || isLateSourceInstr(ConsMI)))
2555     return true;
2556 
2557   if (mayBeNewStore(ConsMI))
2558     return true;
2559 
2560   return false;
2561 }
2562 
2563 bool HexagonInstrInfo::isZeroExtendingLoad(const MachineInstr &MI) const {
2564   switch (MI.getOpcode()) {
2565   // Byte
2566   case Hexagon::L2_loadrub_io:
2567   case Hexagon::L4_loadrub_ur:
2568   case Hexagon::L4_loadrub_ap:
2569   case Hexagon::L2_loadrub_pr:
2570   case Hexagon::L2_loadrub_pbr:
2571   case Hexagon::L2_loadrub_pi:
2572   case Hexagon::L2_loadrub_pci:
2573   case Hexagon::L2_loadrub_pcr:
2574   case Hexagon::L2_loadbzw2_io:
2575   case Hexagon::L4_loadbzw2_ur:
2576   case Hexagon::L4_loadbzw2_ap:
2577   case Hexagon::L2_loadbzw2_pr:
2578   case Hexagon::L2_loadbzw2_pbr:
2579   case Hexagon::L2_loadbzw2_pi:
2580   case Hexagon::L2_loadbzw2_pci:
2581   case Hexagon::L2_loadbzw2_pcr:
2582   case Hexagon::L2_loadbzw4_io:
2583   case Hexagon::L4_loadbzw4_ur:
2584   case Hexagon::L4_loadbzw4_ap:
2585   case Hexagon::L2_loadbzw4_pr:
2586   case Hexagon::L2_loadbzw4_pbr:
2587   case Hexagon::L2_loadbzw4_pi:
2588   case Hexagon::L2_loadbzw4_pci:
2589   case Hexagon::L2_loadbzw4_pcr:
2590   case Hexagon::L4_loadrub_rr:
2591   case Hexagon::L2_ploadrubt_io:
2592   case Hexagon::L2_ploadrubt_pi:
2593   case Hexagon::L2_ploadrubf_io:
2594   case Hexagon::L2_ploadrubf_pi:
2595   case Hexagon::L2_ploadrubtnew_io:
2596   case Hexagon::L2_ploadrubfnew_io:
2597   case Hexagon::L4_ploadrubt_rr:
2598   case Hexagon::L4_ploadrubf_rr:
2599   case Hexagon::L4_ploadrubtnew_rr:
2600   case Hexagon::L4_ploadrubfnew_rr:
2601   case Hexagon::L2_ploadrubtnew_pi:
2602   case Hexagon::L2_ploadrubfnew_pi:
2603   case Hexagon::L4_ploadrubt_abs:
2604   case Hexagon::L4_ploadrubf_abs:
2605   case Hexagon::L4_ploadrubtnew_abs:
2606   case Hexagon::L4_ploadrubfnew_abs:
2607   case Hexagon::L2_loadrubgp:
2608   // Half
2609   case Hexagon::L2_loadruh_io:
2610   case Hexagon::L4_loadruh_ur:
2611   case Hexagon::L4_loadruh_ap:
2612   case Hexagon::L2_loadruh_pr:
2613   case Hexagon::L2_loadruh_pbr:
2614   case Hexagon::L2_loadruh_pi:
2615   case Hexagon::L2_loadruh_pci:
2616   case Hexagon::L2_loadruh_pcr:
2617   case Hexagon::L4_loadruh_rr:
2618   case Hexagon::L2_ploadruht_io:
2619   case Hexagon::L2_ploadruht_pi:
2620   case Hexagon::L2_ploadruhf_io:
2621   case Hexagon::L2_ploadruhf_pi:
2622   case Hexagon::L2_ploadruhtnew_io:
2623   case Hexagon::L2_ploadruhfnew_io:
2624   case Hexagon::L4_ploadruht_rr:
2625   case Hexagon::L4_ploadruhf_rr:
2626   case Hexagon::L4_ploadruhtnew_rr:
2627   case Hexagon::L4_ploadruhfnew_rr:
2628   case Hexagon::L2_ploadruhtnew_pi:
2629   case Hexagon::L2_ploadruhfnew_pi:
2630   case Hexagon::L4_ploadruht_abs:
2631   case Hexagon::L4_ploadruhf_abs:
2632   case Hexagon::L4_ploadruhtnew_abs:
2633   case Hexagon::L4_ploadruhfnew_abs:
2634   case Hexagon::L2_loadruhgp:
2635     return true;
2636   default:
2637     return false;
2638   }
2639 }
2640 
2641 // Add latency to instruction.
2642 bool HexagonInstrInfo::addLatencyToSchedule(const MachineInstr &MI1,
2643       const MachineInstr &MI2) const {
2644   if (isHVXVec(MI1) && isHVXVec(MI2))
2645     if (!isVecUsableNextPacket(MI1, MI2))
2646       return true;
2647   return false;
2648 }
2649 
2650 /// \brief Get the base register and byte offset of a load/store instr.
2651 bool HexagonInstrInfo::getMemOpBaseRegImmOfs(MachineInstr &LdSt,
2652       unsigned &BaseReg, int64_t &Offset, const TargetRegisterInfo *TRI)
2653       const {
2654   unsigned AccessSize = 0;
2655   int OffsetVal = 0;
2656   BaseReg = getBaseAndOffset(LdSt, OffsetVal, AccessSize);
2657   Offset = OffsetVal;
2658   return BaseReg != 0;
2659 }
2660 
2661 /// \brief Can these instructions execute at the same time in a bundle.
2662 bool HexagonInstrInfo::canExecuteInBundle(const MachineInstr &First,
2663       const MachineInstr &Second) const {
2664   if (Second.mayStore() && First.getOpcode() == Hexagon::S2_allocframe) {
2665     const MachineOperand &Op = Second.getOperand(0);
2666     if (Op.isReg() && Op.isUse() && Op.getReg() == Hexagon::R29)
2667       return true;
2668   }
2669   if (DisableNVSchedule)
2670     return false;
2671   if (mayBeNewStore(Second)) {
2672     // Make sure the definition of the first instruction is the value being
2673     // stored.
2674     const MachineOperand &Stored =
2675       Second.getOperand(Second.getNumOperands() - 1);
2676     if (!Stored.isReg())
2677       return false;
2678     for (unsigned i = 0, e = First.getNumOperands(); i < e; ++i) {
2679       const MachineOperand &Op = First.getOperand(i);
2680       if (Op.isReg() && Op.isDef() && Op.getReg() == Stored.getReg())
2681         return true;
2682     }
2683   }
2684   return false;
2685 }
2686 
2687 bool HexagonInstrInfo::doesNotReturn(const MachineInstr &CallMI) const {
2688   unsigned Opc = CallMI.getOpcode();
2689   return Opc == Hexagon::PS_call_nr || Opc == Hexagon::PS_callr_nr;
2690 }
2691 
2692 bool HexagonInstrInfo::hasEHLabel(const MachineBasicBlock *B) const {
2693   for (auto &I : *B)
2694     if (I.isEHLabel())
2695       return true;
2696   return false;
2697 }
2698 
2699 // Returns true if an instruction can be converted into a non-extended
2700 // equivalent instruction.
2701 bool HexagonInstrInfo::hasNonExtEquivalent(const MachineInstr &MI) const {
2702   short NonExtOpcode;
2703   // Check if the instruction has a register form that uses register in place
2704   // of the extended operand, if so return that as the non-extended form.
2705   if (Hexagon::getRegForm(MI.getOpcode()) >= 0)
2706     return true;
2707 
2708   if (MI.getDesc().mayLoad() || MI.getDesc().mayStore()) {
2709     // Check addressing mode and retrieve non-ext equivalent instruction.
2710 
2711     switch (getAddrMode(MI)) {
2712     case HexagonII::Absolute:
2713       // Load/store with absolute addressing mode can be converted into
2714       // base+offset mode.
2715       NonExtOpcode = Hexagon::changeAddrMode_abs_io(MI.getOpcode());
2716       break;
2717     case HexagonII::BaseImmOffset:
2718       // Load/store with base+offset addressing mode can be converted into
2719       // base+register offset addressing mode. However left shift operand should
2720       // be set to 0.
2721       NonExtOpcode = Hexagon::changeAddrMode_io_rr(MI.getOpcode());
2722       break;
2723     case HexagonII::BaseLongOffset:
2724       NonExtOpcode = Hexagon::changeAddrMode_ur_rr(MI.getOpcode());
2725       break;
2726     default:
2727       return false;
2728     }
2729     if (NonExtOpcode < 0)
2730       return false;
2731     return true;
2732   }
2733   return false;
2734 }
2735 
2736 bool HexagonInstrInfo::hasPseudoInstrPair(const MachineInstr &MI) const {
2737   return Hexagon::getRealHWInstr(MI.getOpcode(),
2738                                  Hexagon::InstrType_Pseudo) >= 0;
2739 }
2740 
2741 bool HexagonInstrInfo::hasUncondBranch(const MachineBasicBlock *B)
2742       const {
2743   MachineBasicBlock::const_iterator I = B->getFirstTerminator(), E = B->end();
2744   while (I != E) {
2745     if (I->isBarrier())
2746       return true;
2747     ++I;
2748   }
2749   return false;
2750 }
2751 
2752 // Returns true, if a LD insn can be promoted to a cur load.
2753 bool HexagonInstrInfo::mayBeCurLoad(const MachineInstr &MI) const {
2754   const uint64_t F = MI.getDesc().TSFlags;
2755   return ((F >> HexagonII::mayCVLoadPos) & HexagonII::mayCVLoadMask) &&
2756          Subtarget.hasV60TOps();
2757 }
2758 
2759 // Returns true, if a ST insn can be promoted to a new-value store.
2760 bool HexagonInstrInfo::mayBeNewStore(const MachineInstr &MI) const {
2761   const uint64_t F = MI.getDesc().TSFlags;
2762   return (F >> HexagonII::mayNVStorePos) & HexagonII::mayNVStoreMask;
2763 }
2764 
2765 bool HexagonInstrInfo::producesStall(const MachineInstr &ProdMI,
2766       const MachineInstr &ConsMI) const {
2767   // There is no stall when ProdMI is not a V60 vector.
2768   if (!isHVXVec(ProdMI))
2769     return false;
2770 
2771   // There is no stall when ProdMI and ConsMI are not dependent.
2772   if (!isDependent(ProdMI, ConsMI))
2773     return false;
2774 
2775   // When Forward Scheduling is enabled, there is no stall if ProdMI and ConsMI
2776   // are scheduled in consecutive packets.
2777   if (isVecUsableNextPacket(ProdMI, ConsMI))
2778     return false;
2779 
2780   return true;
2781 }
2782 
2783 bool HexagonInstrInfo::producesStall(const MachineInstr &MI,
2784       MachineBasicBlock::const_instr_iterator BII) const {
2785   // There is no stall when I is not a V60 vector.
2786   if (!isHVXVec(MI))
2787     return false;
2788 
2789   MachineBasicBlock::const_instr_iterator MII = BII;
2790   MachineBasicBlock::const_instr_iterator MIE = MII->getParent()->instr_end();
2791 
2792   if (!(*MII).isBundle()) {
2793     const MachineInstr &J = *MII;
2794     return producesStall(J, MI);
2795   }
2796 
2797   for (++MII; MII != MIE && MII->isInsideBundle(); ++MII) {
2798     const MachineInstr &J = *MII;
2799     if (producesStall(J, MI))
2800       return true;
2801   }
2802   return false;
2803 }
2804 
2805 bool HexagonInstrInfo::predCanBeUsedAsDotNew(const MachineInstr &MI,
2806       unsigned PredReg) const {
2807   for (const MachineOperand &MO : MI.operands()) {
2808     // Predicate register must be explicitly defined.
2809     if (MO.isRegMask() && MO.clobbersPhysReg(PredReg))
2810       return false;
2811     if (MO.isReg() && MO.isDef() && MO.isImplicit() && (MO.getReg() == PredReg))
2812       return false;
2813   }
2814 
2815   // Hexagon Programmer's Reference says that decbin, memw_locked, and
2816   // memd_locked cannot be used as .new as well,
2817   // but we don't seem to have these instructions defined.
2818   return MI.getOpcode() != Hexagon::A4_tlbmatch;
2819 }
2820 
2821 bool HexagonInstrInfo::PredOpcodeHasJMP_c(unsigned Opcode) const {
2822   return Opcode == Hexagon::J2_jumpt      ||
2823          Opcode == Hexagon::J2_jumptpt    ||
2824          Opcode == Hexagon::J2_jumpf      ||
2825          Opcode == Hexagon::J2_jumpfpt    ||
2826          Opcode == Hexagon::J2_jumptnew   ||
2827          Opcode == Hexagon::J2_jumpfnew   ||
2828          Opcode == Hexagon::J2_jumptnewpt ||
2829          Opcode == Hexagon::J2_jumpfnewpt;
2830 }
2831 
2832 bool HexagonInstrInfo::predOpcodeHasNot(ArrayRef<MachineOperand> Cond) const {
2833   if (Cond.empty() || !isPredicated(Cond[0].getImm()))
2834     return false;
2835   return !isPredicatedTrue(Cond[0].getImm());
2836 }
2837 
2838 unsigned HexagonInstrInfo::getAddrMode(const MachineInstr &MI) const {
2839   const uint64_t F = MI.getDesc().TSFlags;
2840   return (F >> HexagonII::AddrModePos) & HexagonII::AddrModeMask;
2841 }
2842 
2843 // Returns the base register in a memory access (load/store). The offset is
2844 // returned in Offset and the access size is returned in AccessSize.
2845 // If the base register has a subregister or the offset field does not contain
2846 // an immediate value, return 0.
2847 unsigned HexagonInstrInfo::getBaseAndOffset(const MachineInstr &MI,
2848       int &Offset, unsigned &AccessSize) const {
2849   // Return if it is not a base+offset type instruction or a MemOp.
2850   if (getAddrMode(MI) != HexagonII::BaseImmOffset &&
2851       getAddrMode(MI) != HexagonII::BaseLongOffset &&
2852       !isMemOp(MI) && !isPostIncrement(MI))
2853     return 0;
2854 
2855   AccessSize = getMemAccessSize(MI);
2856 
2857   unsigned BasePos = 0, OffsetPos = 0;
2858   if (!getBaseAndOffsetPosition(MI, BasePos, OffsetPos))
2859     return 0;
2860 
2861   // Post increment updates its EA after the mem access,
2862   // so we need to treat its offset as zero.
2863   if (isPostIncrement(MI)) {
2864     Offset = 0;
2865   } else {
2866     const MachineOperand &OffsetOp = MI.getOperand(OffsetPos);
2867     if (!OffsetOp.isImm())
2868       return 0;
2869     Offset = OffsetOp.getImm();
2870   }
2871 
2872   const MachineOperand &BaseOp = MI.getOperand(BasePos);
2873   if (BaseOp.getSubReg() != 0)
2874     return 0;
2875   return BaseOp.getReg();
2876 }
2877 
2878 /// Return the position of the base and offset operands for this instruction.
2879 bool HexagonInstrInfo::getBaseAndOffsetPosition(const MachineInstr &MI,
2880       unsigned &BasePos, unsigned &OffsetPos) const {
2881   // Deal with memops first.
2882   if (isMemOp(MI)) {
2883     BasePos = 0;
2884     OffsetPos = 1;
2885   } else if (MI.mayStore()) {
2886     BasePos = 0;
2887     OffsetPos = 1;
2888   } else if (MI.mayLoad()) {
2889     BasePos = 1;
2890     OffsetPos = 2;
2891   } else
2892     return false;
2893 
2894   if (isPredicated(MI)) {
2895     BasePos++;
2896     OffsetPos++;
2897   }
2898   if (isPostIncrement(MI)) {
2899     BasePos++;
2900     OffsetPos++;
2901   }
2902 
2903   if (!MI.getOperand(BasePos).isReg() || !MI.getOperand(OffsetPos).isImm())
2904     return false;
2905 
2906   return true;
2907 }
2908 
2909 // Inserts branching instructions in reverse order of their occurrence.
2910 // e.g. jump_t t1 (i1)
2911 // jump t2        (i2)
2912 // Jumpers = {i2, i1}
2913 SmallVector<MachineInstr*, 2> HexagonInstrInfo::getBranchingInstrs(
2914       MachineBasicBlock& MBB) const {
2915   SmallVector<MachineInstr*, 2> Jumpers;
2916   // If the block has no terminators, it just falls into the block after it.
2917   MachineBasicBlock::instr_iterator I = MBB.instr_end();
2918   if (I == MBB.instr_begin())
2919     return Jumpers;
2920 
2921   // A basic block may looks like this:
2922   //
2923   //  [   insn
2924   //     EH_LABEL
2925   //      insn
2926   //      insn
2927   //      insn
2928   //     EH_LABEL
2929   //      insn     ]
2930   //
2931   // It has two succs but does not have a terminator
2932   // Don't know how to handle it.
2933   do {
2934     --I;
2935     if (I->isEHLabel())
2936       return Jumpers;
2937   } while (I != MBB.instr_begin());
2938 
2939   I = MBB.instr_end();
2940   --I;
2941 
2942   while (I->isDebugValue()) {
2943     if (I == MBB.instr_begin())
2944       return Jumpers;
2945     --I;
2946   }
2947   if (!isUnpredicatedTerminator(*I))
2948     return Jumpers;
2949 
2950   // Get the last instruction in the block.
2951   MachineInstr *LastInst = &*I;
2952   Jumpers.push_back(LastInst);
2953   MachineInstr *SecondLastInst = nullptr;
2954   // Find one more terminator if present.
2955   do {
2956     if (&*I != LastInst && !I->isBundle() && isUnpredicatedTerminator(*I)) {
2957       if (!SecondLastInst) {
2958         SecondLastInst = &*I;
2959         Jumpers.push_back(SecondLastInst);
2960       } else // This is a third branch.
2961         return Jumpers;
2962     }
2963     if (I == MBB.instr_begin())
2964       break;
2965     --I;
2966   } while (true);
2967   return Jumpers;
2968 }
2969 
2970 // Returns Operand Index for the constant extended instruction.
2971 unsigned HexagonInstrInfo::getCExtOpNum(const MachineInstr &MI) const {
2972   const uint64_t F = MI.getDesc().TSFlags;
2973   return (F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask;
2974 }
2975 
2976 // See if instruction could potentially be a duplex candidate.
2977 // If so, return its group. Zero otherwise.
2978 HexagonII::CompoundGroup HexagonInstrInfo::getCompoundCandidateGroup(
2979       const MachineInstr &MI) const {
2980   unsigned DstReg, SrcReg, Src1Reg, Src2Reg;
2981 
2982   switch (MI.getOpcode()) {
2983   default:
2984     return HexagonII::HCG_None;
2985   //
2986   // Compound pairs.
2987   // "p0=cmp.eq(Rs16,Rt16); if (p0.new) jump:nt #r9:2"
2988   // "Rd16=#U6 ; jump #r9:2"
2989   // "Rd16=Rs16 ; jump #r9:2"
2990   //
2991   case Hexagon::C2_cmpeq:
2992   case Hexagon::C2_cmpgt:
2993   case Hexagon::C2_cmpgtu:
2994     DstReg = MI.getOperand(0).getReg();
2995     Src1Reg = MI.getOperand(1).getReg();
2996     Src2Reg = MI.getOperand(2).getReg();
2997     if (Hexagon::PredRegsRegClass.contains(DstReg) &&
2998         (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
2999         isIntRegForSubInst(Src1Reg) && isIntRegForSubInst(Src2Reg))
3000       return HexagonII::HCG_A;
3001     break;
3002   case Hexagon::C2_cmpeqi:
3003   case Hexagon::C2_cmpgti:
3004   case Hexagon::C2_cmpgtui:
3005     // P0 = cmp.eq(Rs,#u2)
3006     DstReg = MI.getOperand(0).getReg();
3007     SrcReg = MI.getOperand(1).getReg();
3008     if (Hexagon::PredRegsRegClass.contains(DstReg) &&
3009         (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3010         isIntRegForSubInst(SrcReg) && MI.getOperand(2).isImm() &&
3011         ((isUInt<5>(MI.getOperand(2).getImm())) ||
3012          (MI.getOperand(2).getImm() == -1)))
3013       return HexagonII::HCG_A;
3014     break;
3015   case Hexagon::A2_tfr:
3016     // Rd = Rs
3017     DstReg = MI.getOperand(0).getReg();
3018     SrcReg = MI.getOperand(1).getReg();
3019     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg))
3020       return HexagonII::HCG_A;
3021     break;
3022   case Hexagon::A2_tfrsi:
3023     // Rd = #u6
3024     // Do not test for #u6 size since the const is getting extended
3025     // regardless and compound could be formed.
3026     DstReg = MI.getOperand(0).getReg();
3027     if (isIntRegForSubInst(DstReg))
3028       return HexagonII::HCG_A;
3029     break;
3030   case Hexagon::S2_tstbit_i:
3031     DstReg = MI.getOperand(0).getReg();
3032     Src1Reg = MI.getOperand(1).getReg();
3033     if (Hexagon::PredRegsRegClass.contains(DstReg) &&
3034         (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3035         MI.getOperand(2).isImm() &&
3036         isIntRegForSubInst(Src1Reg) && (MI.getOperand(2).getImm() == 0))
3037       return HexagonII::HCG_A;
3038     break;
3039   // The fact that .new form is used pretty much guarantees
3040   // that predicate register will match. Nevertheless,
3041   // there could be some false positives without additional
3042   // checking.
3043   case Hexagon::J2_jumptnew:
3044   case Hexagon::J2_jumpfnew:
3045   case Hexagon::J2_jumptnewpt:
3046   case Hexagon::J2_jumpfnewpt:
3047     Src1Reg = MI.getOperand(0).getReg();
3048     if (Hexagon::PredRegsRegClass.contains(Src1Reg) &&
3049         (Hexagon::P0 == Src1Reg || Hexagon::P1 == Src1Reg))
3050       return HexagonII::HCG_B;
3051     break;
3052   // Transfer and jump:
3053   // Rd=#U6 ; jump #r9:2
3054   // Rd=Rs ; jump #r9:2
3055   // Do not test for jump range here.
3056   case Hexagon::J2_jump:
3057   case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
3058   case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
3059     return HexagonII::HCG_C;
3060   }
3061 
3062   return HexagonII::HCG_None;
3063 }
3064 
3065 // Returns -1 when there is no opcode found.
3066 unsigned HexagonInstrInfo::getCompoundOpcode(const MachineInstr &GA,
3067       const MachineInstr &GB) const {
3068   assert(getCompoundCandidateGroup(GA) == HexagonII::HCG_A);
3069   assert(getCompoundCandidateGroup(GB) == HexagonII::HCG_B);
3070   if ((GA.getOpcode() != Hexagon::C2_cmpeqi) ||
3071       (GB.getOpcode() != Hexagon::J2_jumptnew))
3072     return -1;
3073   unsigned DestReg = GA.getOperand(0).getReg();
3074   if (!GB.readsRegister(DestReg))
3075     return -1;
3076   if (DestReg == Hexagon::P0)
3077     return Hexagon::J4_cmpeqi_tp0_jump_nt;
3078   if (DestReg == Hexagon::P1)
3079     return Hexagon::J4_cmpeqi_tp1_jump_nt;
3080   return -1;
3081 }
3082 
3083 int HexagonInstrInfo::getCondOpcode(int Opc, bool invertPredicate) const {
3084   enum Hexagon::PredSense inPredSense;
3085   inPredSense = invertPredicate ? Hexagon::PredSense_false :
3086                                   Hexagon::PredSense_true;
3087   int CondOpcode = Hexagon::getPredOpcode(Opc, inPredSense);
3088   if (CondOpcode >= 0) // Valid Conditional opcode/instruction
3089     return CondOpcode;
3090 
3091   llvm_unreachable("Unexpected predicable instruction");
3092 }
3093 
3094 // Return the cur value instruction for a given store.
3095 int HexagonInstrInfo::getDotCurOp(const MachineInstr &MI) const {
3096   switch (MI.getOpcode()) {
3097   default: llvm_unreachable("Unknown .cur type");
3098   case Hexagon::V6_vL32b_pi:
3099     return Hexagon::V6_vL32b_cur_pi;
3100   case Hexagon::V6_vL32b_ai:
3101     return Hexagon::V6_vL32b_cur_ai;
3102   case Hexagon::V6_vL32b_nt_pi:
3103     return Hexagon::V6_vL32b_nt_cur_pi;
3104   case Hexagon::V6_vL32b_nt_ai:
3105     return Hexagon::V6_vL32b_nt_cur_ai;
3106   }
3107   return 0;
3108 }
3109 
3110 // Return the regular version of the .cur instruction.
3111 int HexagonInstrInfo::getNonDotCurOp(const MachineInstr &MI) const {
3112   switch (MI.getOpcode()) {
3113   default: llvm_unreachable("Unknown .cur type");
3114   case Hexagon::V6_vL32b_cur_pi:
3115     return Hexagon::V6_vL32b_pi;
3116   case Hexagon::V6_vL32b_cur_ai:
3117     return Hexagon::V6_vL32b_ai;
3118   case Hexagon::V6_vL32b_nt_cur_pi:
3119     return Hexagon::V6_vL32b_nt_pi;
3120   case Hexagon::V6_vL32b_nt_cur_ai:
3121     return Hexagon::V6_vL32b_nt_ai;
3122   }
3123   return 0;
3124 }
3125 
3126 // The diagram below shows the steps involved in the conversion of a predicated
3127 // store instruction to its .new predicated new-value form.
3128 //
3129 // Note: It doesn't include conditional new-value stores as they can't be
3130 // converted to .new predicate.
3131 //
3132 //               p.new NV store [ if(p0.new)memw(R0+#0)=R2.new ]
3133 //                ^           ^
3134 //               /             \ (not OK. it will cause new-value store to be
3135 //              /               X conditional on p0.new while R2 producer is
3136 //             /                 \ on p0)
3137 //            /                   \.
3138 //     p.new store                 p.old NV store
3139 // [if(p0.new)memw(R0+#0)=R2]    [if(p0)memw(R0+#0)=R2.new]
3140 //            ^                  ^
3141 //             \                /
3142 //              \              /
3143 //               \            /
3144 //                 p.old store
3145 //             [if (p0)memw(R0+#0)=R2]
3146 //
3147 // The following set of instructions further explains the scenario where
3148 // conditional new-value store becomes invalid when promoted to .new predicate
3149 // form.
3150 //
3151 // { 1) if (p0) r0 = add(r1, r2)
3152 //   2) p0 = cmp.eq(r3, #0) }
3153 //
3154 //   3) if (p0) memb(r1+#0) = r0  --> this instruction can't be grouped with
3155 // the first two instructions because in instr 1, r0 is conditional on old value
3156 // of p0 but its use in instr 3 is conditional on p0 modified by instr 2 which
3157 // is not valid for new-value stores.
3158 // Predicated new value stores (i.e. if (p0) memw(..)=r0.new) are excluded
3159 // from the "Conditional Store" list. Because a predicated new value store
3160 // would NOT be promoted to a double dot new store. See diagram below:
3161 // This function returns yes for those stores that are predicated but not
3162 // yet promoted to predicate dot new instructions.
3163 //
3164 //                          +---------------------+
3165 //                    /-----| if (p0) memw(..)=r0 |---------\~
3166 //                   ||     +---------------------+         ||
3167 //          promote  ||       /\       /\                   ||  promote
3168 //                   ||      /||\     /||\                  ||
3169 //                  \||/    demote     ||                  \||/
3170 //                   \/       ||       ||                   \/
3171 //       +-------------------------+   ||   +-------------------------+
3172 //       | if (p0.new) memw(..)=r0 |   ||   | if (p0) memw(..)=r0.new |
3173 //       +-------------------------+   ||   +-------------------------+
3174 //                        ||           ||         ||
3175 //                        ||         demote      \||/
3176 //                      promote        ||         \/ NOT possible
3177 //                        ||           ||         /\~
3178 //                       \||/          ||        /||\~
3179 //                        \/           ||         ||
3180 //                      +-----------------------------+
3181 //                      | if (p0.new) memw(..)=r0.new |
3182 //                      +-----------------------------+
3183 //                           Double Dot New Store
3184 //
3185 // Returns the most basic instruction for the .new predicated instructions and
3186 // new-value stores.
3187 // For example, all of the following instructions will be converted back to the
3188 // same instruction:
3189 // 1) if (p0.new) memw(R0+#0) = R1.new  --->
3190 // 2) if (p0) memw(R0+#0)= R1.new      -------> if (p0) memw(R0+#0) = R1
3191 // 3) if (p0.new) memw(R0+#0) = R1      --->
3192 //
3193 // To understand the translation of instruction 1 to its original form, consider
3194 // a packet with 3 instructions.
3195 // { p0 = cmp.eq(R0,R1)
3196 //   if (p0.new) R2 = add(R3, R4)
3197 //   R5 = add (R3, R1)
3198 // }
3199 // if (p0) memw(R5+#0) = R2 <--- trying to include it in the previous packet
3200 //
3201 // This instruction can be part of the previous packet only if both p0 and R2
3202 // are promoted to .new values. This promotion happens in steps, first
3203 // predicate register is promoted to .new and in the next iteration R2 is
3204 // promoted. Therefore, in case of dependence check failure (due to R5) during
3205 // next iteration, it should be converted back to its most basic form.
3206 
3207 // Return the new value instruction for a given store.
3208 int HexagonInstrInfo::getDotNewOp(const MachineInstr &MI) const {
3209   int NVOpcode = Hexagon::getNewValueOpcode(MI.getOpcode());
3210   if (NVOpcode >= 0) // Valid new-value store instruction.
3211     return NVOpcode;
3212 
3213   switch (MI.getOpcode()) {
3214   default:
3215     report_fatal_error(std::string("Unknown .new type: ") +
3216       std::to_string(MI.getOpcode()));
3217   case Hexagon::S4_storerb_ur:
3218     return Hexagon::S4_storerbnew_ur;
3219 
3220   case Hexagon::S2_storerb_pci:
3221     return Hexagon::S2_storerb_pci;
3222 
3223   case Hexagon::S2_storeri_pci:
3224     return Hexagon::S2_storeri_pci;
3225 
3226   case Hexagon::S2_storerh_pci:
3227     return Hexagon::S2_storerh_pci;
3228 
3229   case Hexagon::S2_storerd_pci:
3230     return Hexagon::S2_storerd_pci;
3231 
3232   case Hexagon::S2_storerf_pci:
3233     return Hexagon::S2_storerf_pci;
3234 
3235   case Hexagon::V6_vS32b_ai:
3236     return Hexagon::V6_vS32b_new_ai;
3237 
3238   case Hexagon::V6_vS32b_pi:
3239     return Hexagon::V6_vS32b_new_pi;
3240   }
3241   return 0;
3242 }
3243 
3244 // Returns the opcode to use when converting MI, which is a conditional jump,
3245 // into a conditional instruction which uses the .new value of the predicate.
3246 // We also use branch probabilities to add a hint to the jump.
3247 // If MBPI is null, all edges will be treated as equally likely for the
3248 // purposes of establishing a predication hint.
3249 int HexagonInstrInfo::getDotNewPredJumpOp(const MachineInstr &MI,
3250       const MachineBranchProbabilityInfo *MBPI) const {
3251   // We assume that block can have at most two successors.
3252   const MachineBasicBlock *Src = MI.getParent();
3253   const MachineOperand &BrTarget = MI.getOperand(1);
3254   bool Taken = false;
3255   const BranchProbability OneHalf(1, 2);
3256 
3257   auto getEdgeProbability = [MBPI] (const MachineBasicBlock *Src,
3258                                     const MachineBasicBlock *Dst) {
3259     if (MBPI)
3260       return MBPI->getEdgeProbability(Src, Dst);
3261     return BranchProbability(1, Src->succ_size());
3262   };
3263 
3264   if (BrTarget.isMBB()) {
3265     const MachineBasicBlock *Dst = BrTarget.getMBB();
3266     Taken = getEdgeProbability(Src, Dst) >= OneHalf;
3267   } else {
3268     // The branch target is not a basic block (most likely a function).
3269     // Since BPI only gives probabilities for targets that are basic blocks,
3270     // try to identify another target of this branch (potentially a fall-
3271     // -through) and check the probability of that target.
3272     //
3273     // The only handled branch combinations are:
3274     // - one conditional branch,
3275     // - one conditional branch followed by one unconditional branch.
3276     // Otherwise, assume not-taken.
3277     assert(MI.isConditionalBranch());
3278     const MachineBasicBlock &B = *MI.getParent();
3279     bool SawCond = false, Bad = false;
3280     for (const MachineInstr &I : B) {
3281       if (!I.isBranch())
3282         continue;
3283       if (I.isConditionalBranch()) {
3284         SawCond = true;
3285         if (&I != &MI) {
3286           Bad = true;
3287           break;
3288         }
3289       }
3290       if (I.isUnconditionalBranch() && !SawCond) {
3291         Bad = true;
3292         break;
3293       }
3294     }
3295     if (!Bad) {
3296       MachineBasicBlock::const_instr_iterator It(MI);
3297       MachineBasicBlock::const_instr_iterator NextIt = std::next(It);
3298       if (NextIt == B.instr_end()) {
3299         // If this branch is the last, look for the fall-through block.
3300         for (const MachineBasicBlock *SB : B.successors()) {
3301           if (!B.isLayoutSuccessor(SB))
3302             continue;
3303           Taken = getEdgeProbability(Src, SB) < OneHalf;
3304           break;
3305         }
3306       } else {
3307         assert(NextIt->isUnconditionalBranch());
3308         // Find the first MBB operand and assume it's the target.
3309         const MachineBasicBlock *BT = nullptr;
3310         for (const MachineOperand &Op : NextIt->operands()) {
3311           if (!Op.isMBB())
3312             continue;
3313           BT = Op.getMBB();
3314           break;
3315         }
3316         Taken = BT && getEdgeProbability(Src, BT) < OneHalf;
3317       }
3318     } // if (!Bad)
3319   }
3320 
3321   // The Taken flag should be set to something reasonable by this point.
3322 
3323   switch (MI.getOpcode()) {
3324   case Hexagon::J2_jumpt:
3325     return Taken ? Hexagon::J2_jumptnewpt : Hexagon::J2_jumptnew;
3326   case Hexagon::J2_jumpf:
3327     return Taken ? Hexagon::J2_jumpfnewpt : Hexagon::J2_jumpfnew;
3328 
3329   default:
3330     llvm_unreachable("Unexpected jump instruction.");
3331   }
3332 }
3333 
3334 // Return .new predicate version for an instruction.
3335 int HexagonInstrInfo::getDotNewPredOp(const MachineInstr &MI,
3336       const MachineBranchProbabilityInfo *MBPI) const {
3337   switch (MI.getOpcode()) {
3338   // Condtional Jumps
3339   case Hexagon::J2_jumpt:
3340   case Hexagon::J2_jumpf:
3341     return getDotNewPredJumpOp(MI, MBPI);
3342   }
3343 
3344   int NewOpcode = Hexagon::getPredNewOpcode(MI.getOpcode());
3345   if (NewOpcode >= 0)
3346     return NewOpcode;
3347   return 0;
3348 }
3349 
3350 int HexagonInstrInfo::getDotOldOp(const MachineInstr &MI) const {
3351   int NewOp = MI.getOpcode();
3352   if (isPredicated(NewOp) && isPredicatedNew(NewOp)) { // Get predicate old form
3353     NewOp = Hexagon::getPredOldOpcode(NewOp);
3354     // All Hexagon architectures have prediction bits on dot-new branches,
3355     // but only Hexagon V60+ has prediction bits on dot-old ones. Make sure
3356     // to pick the right opcode when converting back to dot-old.
3357     if (!Subtarget.getFeatureBits()[Hexagon::ArchV60]) {
3358       switch (NewOp) {
3359       case Hexagon::J2_jumptpt:
3360         NewOp = Hexagon::J2_jumpt;
3361         break;
3362       case Hexagon::J2_jumpfpt:
3363         NewOp = Hexagon::J2_jumpf;
3364         break;
3365       case Hexagon::J2_jumprtpt:
3366         NewOp = Hexagon::J2_jumprt;
3367         break;
3368       case Hexagon::J2_jumprfpt:
3369         NewOp = Hexagon::J2_jumprf;
3370         break;
3371       }
3372     }
3373     assert(NewOp >= 0 &&
3374            "Couldn't change predicate new instruction to its old form.");
3375   }
3376 
3377   if (isNewValueStore(NewOp)) { // Convert into non-new-value format
3378     NewOp = Hexagon::getNonNVStore(NewOp);
3379     assert(NewOp >= 0 && "Couldn't change new-value store to its old form.");
3380   }
3381 
3382   if (Subtarget.hasV60TOps())
3383     return NewOp;
3384 
3385   // Subtargets prior to V60 didn't support 'taken' forms of predicated jumps.
3386   switch (NewOp) {
3387   case Hexagon::J2_jumpfpt:
3388     return Hexagon::J2_jumpf;
3389   case Hexagon::J2_jumptpt:
3390     return Hexagon::J2_jumpt;
3391   case Hexagon::J2_jumprfpt:
3392     return Hexagon::J2_jumprf;
3393   case Hexagon::J2_jumprtpt:
3394     return Hexagon::J2_jumprt;
3395   }
3396   return NewOp;
3397 }
3398 
3399 // See if instruction could potentially be a duplex candidate.
3400 // If so, return its group. Zero otherwise.
3401 HexagonII::SubInstructionGroup HexagonInstrInfo::getDuplexCandidateGroup(
3402       const MachineInstr &MI) const {
3403   unsigned DstReg, SrcReg, Src1Reg, Src2Reg;
3404   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
3405 
3406   switch (MI.getOpcode()) {
3407   default:
3408     return HexagonII::HSIG_None;
3409   //
3410   // Group L1:
3411   //
3412   // Rd = memw(Rs+#u4:2)
3413   // Rd = memub(Rs+#u4:0)
3414   case Hexagon::L2_loadri_io:
3415     DstReg = MI.getOperand(0).getReg();
3416     SrcReg = MI.getOperand(1).getReg();
3417     // Special case this one from Group L2.
3418     // Rd = memw(r29+#u5:2)
3419     if (isIntRegForSubInst(DstReg)) {
3420       if (Hexagon::IntRegsRegClass.contains(SrcReg) &&
3421           HRI.getStackRegister() == SrcReg &&
3422           MI.getOperand(2).isImm() &&
3423           isShiftedUInt<5,2>(MI.getOperand(2).getImm()))
3424         return HexagonII::HSIG_L2;
3425       // Rd = memw(Rs+#u4:2)
3426       if (isIntRegForSubInst(SrcReg) &&
3427           (MI.getOperand(2).isImm() &&
3428           isShiftedUInt<4,2>(MI.getOperand(2).getImm())))
3429         return HexagonII::HSIG_L1;
3430     }
3431     break;
3432   case Hexagon::L2_loadrub_io:
3433     // Rd = memub(Rs+#u4:0)
3434     DstReg = MI.getOperand(0).getReg();
3435     SrcReg = MI.getOperand(1).getReg();
3436     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg) &&
3437         MI.getOperand(2).isImm() && isUInt<4>(MI.getOperand(2).getImm()))
3438       return HexagonII::HSIG_L1;
3439     break;
3440   //
3441   // Group L2:
3442   //
3443   // Rd = memh/memuh(Rs+#u3:1)
3444   // Rd = memb(Rs+#u3:0)
3445   // Rd = memw(r29+#u5:2) - Handled above.
3446   // Rdd = memd(r29+#u5:3)
3447   // deallocframe
3448   // [if ([!]p0[.new])] dealloc_return
3449   // [if ([!]p0[.new])] jumpr r31
3450   case Hexagon::L2_loadrh_io:
3451   case Hexagon::L2_loadruh_io:
3452     // Rd = memh/memuh(Rs+#u3:1)
3453     DstReg = MI.getOperand(0).getReg();
3454     SrcReg = MI.getOperand(1).getReg();
3455     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg) &&
3456         MI.getOperand(2).isImm() &&
3457         isShiftedUInt<3,1>(MI.getOperand(2).getImm()))
3458       return HexagonII::HSIG_L2;
3459     break;
3460   case Hexagon::L2_loadrb_io:
3461     // Rd = memb(Rs+#u3:0)
3462     DstReg = MI.getOperand(0).getReg();
3463     SrcReg = MI.getOperand(1).getReg();
3464     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg) &&
3465         MI.getOperand(2).isImm() &&
3466         isUInt<3>(MI.getOperand(2).getImm()))
3467       return HexagonII::HSIG_L2;
3468     break;
3469   case Hexagon::L2_loadrd_io:
3470     // Rdd = memd(r29+#u5:3)
3471     DstReg = MI.getOperand(0).getReg();
3472     SrcReg = MI.getOperand(1).getReg();
3473     if (isDblRegForSubInst(DstReg, HRI) &&
3474         Hexagon::IntRegsRegClass.contains(SrcReg) &&
3475         HRI.getStackRegister() == SrcReg &&
3476         MI.getOperand(2).isImm() &&
3477         isShiftedUInt<5,3>(MI.getOperand(2).getImm()))
3478       return HexagonII::HSIG_L2;
3479     break;
3480   // dealloc_return is not documented in Hexagon Manual, but marked
3481   // with A_SUBINSN attribute in iset_v4classic.py.
3482   case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
3483   case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
3484   case Hexagon::L4_return:
3485   case Hexagon::L2_deallocframe:
3486     return HexagonII::HSIG_L2;
3487   case Hexagon::EH_RETURN_JMPR:
3488   case Hexagon::PS_jmpret:
3489     // jumpr r31
3490     // Actual form JMPR %PC<imp-def>, %R31<imp-use>, %R0<imp-use,internal>.
3491     DstReg = MI.getOperand(0).getReg();
3492     if (Hexagon::IntRegsRegClass.contains(DstReg) && (Hexagon::R31 == DstReg))
3493       return HexagonII::HSIG_L2;
3494     break;
3495   case Hexagon::PS_jmprett:
3496   case Hexagon::PS_jmpretf:
3497   case Hexagon::PS_jmprettnewpt:
3498   case Hexagon::PS_jmpretfnewpt:
3499   case Hexagon::PS_jmprettnew:
3500   case Hexagon::PS_jmpretfnew:
3501     DstReg = MI.getOperand(1).getReg();
3502     SrcReg = MI.getOperand(0).getReg();
3503     // [if ([!]p0[.new])] jumpr r31
3504     if ((Hexagon::PredRegsRegClass.contains(SrcReg) &&
3505         (Hexagon::P0 == SrcReg)) &&
3506         (Hexagon::IntRegsRegClass.contains(DstReg) && (Hexagon::R31 == DstReg)))
3507       return HexagonII::HSIG_L2;
3508     break;
3509   case Hexagon::L4_return_t:
3510   case Hexagon::L4_return_f:
3511   case Hexagon::L4_return_tnew_pnt:
3512   case Hexagon::L4_return_fnew_pnt:
3513   case Hexagon::L4_return_tnew_pt:
3514   case Hexagon::L4_return_fnew_pt:
3515     // [if ([!]p0[.new])] dealloc_return
3516     SrcReg = MI.getOperand(0).getReg();
3517     if (Hexagon::PredRegsRegClass.contains(SrcReg) && (Hexagon::P0 == SrcReg))
3518       return HexagonII::HSIG_L2;
3519     break;
3520   //
3521   // Group S1:
3522   //
3523   // memw(Rs+#u4:2) = Rt
3524   // memb(Rs+#u4:0) = Rt
3525   case Hexagon::S2_storeri_io:
3526     // Special case this one from Group S2.
3527     // memw(r29+#u5:2) = Rt
3528     Src1Reg = MI.getOperand(0).getReg();
3529     Src2Reg = MI.getOperand(2).getReg();
3530     if (Hexagon::IntRegsRegClass.contains(Src1Reg) &&
3531         isIntRegForSubInst(Src2Reg) &&
3532         HRI.getStackRegister() == Src1Reg && MI.getOperand(1).isImm() &&
3533         isShiftedUInt<5,2>(MI.getOperand(1).getImm()))
3534       return HexagonII::HSIG_S2;
3535     // memw(Rs+#u4:2) = Rt
3536     if (isIntRegForSubInst(Src1Reg) && isIntRegForSubInst(Src2Reg) &&
3537         MI.getOperand(1).isImm() &&
3538         isShiftedUInt<4,2>(MI.getOperand(1).getImm()))
3539       return HexagonII::HSIG_S1;
3540     break;
3541   case Hexagon::S2_storerb_io:
3542     // memb(Rs+#u4:0) = Rt
3543     Src1Reg = MI.getOperand(0).getReg();
3544     Src2Reg = MI.getOperand(2).getReg();
3545     if (isIntRegForSubInst(Src1Reg) && isIntRegForSubInst(Src2Reg) &&
3546         MI.getOperand(1).isImm() && isUInt<4>(MI.getOperand(1).getImm()))
3547       return HexagonII::HSIG_S1;
3548     break;
3549   //
3550   // Group S2:
3551   //
3552   // memh(Rs+#u3:1) = Rt
3553   // memw(r29+#u5:2) = Rt
3554   // memd(r29+#s6:3) = Rtt
3555   // memw(Rs+#u4:2) = #U1
3556   // memb(Rs+#u4) = #U1
3557   // allocframe(#u5:3)
3558   case Hexagon::S2_storerh_io:
3559     // memh(Rs+#u3:1) = Rt
3560     Src1Reg = MI.getOperand(0).getReg();
3561     Src2Reg = MI.getOperand(2).getReg();
3562     if (isIntRegForSubInst(Src1Reg) && isIntRegForSubInst(Src2Reg) &&
3563         MI.getOperand(1).isImm() &&
3564         isShiftedUInt<3,1>(MI.getOperand(1).getImm()))
3565       return HexagonII::HSIG_S1;
3566     break;
3567   case Hexagon::S2_storerd_io:
3568     // memd(r29+#s6:3) = Rtt
3569     Src1Reg = MI.getOperand(0).getReg();
3570     Src2Reg = MI.getOperand(2).getReg();
3571     if (isDblRegForSubInst(Src2Reg, HRI) &&
3572         Hexagon::IntRegsRegClass.contains(Src1Reg) &&
3573         HRI.getStackRegister() == Src1Reg && MI.getOperand(1).isImm() &&
3574         isShiftedInt<6,3>(MI.getOperand(1).getImm()))
3575       return HexagonII::HSIG_S2;
3576     break;
3577   case Hexagon::S4_storeiri_io:
3578     // memw(Rs+#u4:2) = #U1
3579     Src1Reg = MI.getOperand(0).getReg();
3580     if (isIntRegForSubInst(Src1Reg) && MI.getOperand(1).isImm() &&
3581         isShiftedUInt<4,2>(MI.getOperand(1).getImm()) &&
3582         MI.getOperand(2).isImm() && isUInt<1>(MI.getOperand(2).getImm()))
3583       return HexagonII::HSIG_S2;
3584     break;
3585   case Hexagon::S4_storeirb_io:
3586     // memb(Rs+#u4) = #U1
3587     Src1Reg = MI.getOperand(0).getReg();
3588     if (isIntRegForSubInst(Src1Reg) &&
3589         MI.getOperand(1).isImm() && isUInt<4>(MI.getOperand(1).getImm()) &&
3590         MI.getOperand(2).isImm() && isUInt<1>(MI.getOperand(2).getImm()))
3591       return HexagonII::HSIG_S2;
3592     break;
3593   case Hexagon::S2_allocframe:
3594     if (MI.getOperand(0).isImm() &&
3595         isShiftedUInt<5,3>(MI.getOperand(0).getImm()))
3596       return HexagonII::HSIG_S1;
3597     break;
3598   //
3599   // Group A:
3600   //
3601   // Rx = add(Rx,#s7)
3602   // Rd = Rs
3603   // Rd = #u6
3604   // Rd = #-1
3605   // if ([!]P0[.new]) Rd = #0
3606   // Rd = add(r29,#u6:2)
3607   // Rx = add(Rx,Rs)
3608   // P0 = cmp.eq(Rs,#u2)
3609   // Rdd = combine(#0,Rs)
3610   // Rdd = combine(Rs,#0)
3611   // Rdd = combine(#u2,#U2)
3612   // Rd = add(Rs,#1)
3613   // Rd = add(Rs,#-1)
3614   // Rd = sxth/sxtb/zxtb/zxth(Rs)
3615   // Rd = and(Rs,#1)
3616   case Hexagon::A2_addi:
3617     DstReg = MI.getOperand(0).getReg();
3618     SrcReg = MI.getOperand(1).getReg();
3619     if (isIntRegForSubInst(DstReg)) {
3620       // Rd = add(r29,#u6:2)
3621       if (Hexagon::IntRegsRegClass.contains(SrcReg) &&
3622         HRI.getStackRegister() == SrcReg && MI.getOperand(2).isImm() &&
3623         isShiftedUInt<6,2>(MI.getOperand(2).getImm()))
3624         return HexagonII::HSIG_A;
3625       // Rx = add(Rx,#s7)
3626       if ((DstReg == SrcReg) && MI.getOperand(2).isImm() &&
3627           isInt<7>(MI.getOperand(2).getImm()))
3628         return HexagonII::HSIG_A;
3629       // Rd = add(Rs,#1)
3630       // Rd = add(Rs,#-1)
3631       if (isIntRegForSubInst(SrcReg) && MI.getOperand(2).isImm() &&
3632           ((MI.getOperand(2).getImm() == 1) ||
3633           (MI.getOperand(2).getImm() == -1)))
3634         return HexagonII::HSIG_A;
3635     }
3636     break;
3637   case Hexagon::A2_add:
3638     // Rx = add(Rx,Rs)
3639     DstReg = MI.getOperand(0).getReg();
3640     Src1Reg = MI.getOperand(1).getReg();
3641     Src2Reg = MI.getOperand(2).getReg();
3642     if (isIntRegForSubInst(DstReg) && (DstReg == Src1Reg) &&
3643         isIntRegForSubInst(Src2Reg))
3644       return HexagonII::HSIG_A;
3645     break;
3646   case Hexagon::A2_andir:
3647     // Same as zxtb.
3648     // Rd16=and(Rs16,#255)
3649     // Rd16=and(Rs16,#1)
3650     DstReg = MI.getOperand(0).getReg();
3651     SrcReg = MI.getOperand(1).getReg();
3652     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg) &&
3653         MI.getOperand(2).isImm() &&
3654         ((MI.getOperand(2).getImm() == 1) ||
3655         (MI.getOperand(2).getImm() == 255)))
3656       return HexagonII::HSIG_A;
3657     break;
3658   case Hexagon::A2_tfr:
3659     // Rd = Rs
3660     DstReg = MI.getOperand(0).getReg();
3661     SrcReg = MI.getOperand(1).getReg();
3662     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg))
3663       return HexagonII::HSIG_A;
3664     break;
3665   case Hexagon::A2_tfrsi:
3666     // Rd = #u6
3667     // Do not test for #u6 size since the const is getting extended
3668     // regardless and compound could be formed.
3669     // Rd = #-1
3670     DstReg = MI.getOperand(0).getReg();
3671     if (isIntRegForSubInst(DstReg))
3672       return HexagonII::HSIG_A;
3673     break;
3674   case Hexagon::C2_cmoveit:
3675   case Hexagon::C2_cmovenewit:
3676   case Hexagon::C2_cmoveif:
3677   case Hexagon::C2_cmovenewif:
3678     // if ([!]P0[.new]) Rd = #0
3679     // Actual form:
3680     // %R16<def> = C2_cmovenewit %P0<internal>, 0, %R16<imp-use,undef>;
3681     DstReg = MI.getOperand(0).getReg();
3682     SrcReg = MI.getOperand(1).getReg();
3683     if (isIntRegForSubInst(DstReg) &&
3684         Hexagon::PredRegsRegClass.contains(SrcReg) && Hexagon::P0 == SrcReg &&
3685         MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0)
3686       return HexagonII::HSIG_A;
3687     break;
3688   case Hexagon::C2_cmpeqi:
3689     // P0 = cmp.eq(Rs,#u2)
3690     DstReg = MI.getOperand(0).getReg();
3691     SrcReg = MI.getOperand(1).getReg();
3692     if (Hexagon::PredRegsRegClass.contains(DstReg) &&
3693         Hexagon::P0 == DstReg && isIntRegForSubInst(SrcReg) &&
3694         MI.getOperand(2).isImm() && isUInt<2>(MI.getOperand(2).getImm()))
3695       return HexagonII::HSIG_A;
3696     break;
3697   case Hexagon::A2_combineii:
3698   case Hexagon::A4_combineii:
3699     // Rdd = combine(#u2,#U2)
3700     DstReg = MI.getOperand(0).getReg();
3701     if (isDblRegForSubInst(DstReg, HRI) &&
3702         ((MI.getOperand(1).isImm() && isUInt<2>(MI.getOperand(1).getImm())) ||
3703         (MI.getOperand(1).isGlobal() &&
3704         isUInt<2>(MI.getOperand(1).getOffset()))) &&
3705         ((MI.getOperand(2).isImm() && isUInt<2>(MI.getOperand(2).getImm())) ||
3706         (MI.getOperand(2).isGlobal() &&
3707         isUInt<2>(MI.getOperand(2).getOffset()))))
3708       return HexagonII::HSIG_A;
3709     break;
3710   case Hexagon::A4_combineri:
3711     // Rdd = combine(Rs,#0)
3712     DstReg = MI.getOperand(0).getReg();
3713     SrcReg = MI.getOperand(1).getReg();
3714     if (isDblRegForSubInst(DstReg, HRI) && isIntRegForSubInst(SrcReg) &&
3715         ((MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0) ||
3716         (MI.getOperand(2).isGlobal() && MI.getOperand(2).getOffset() == 0)))
3717       return HexagonII::HSIG_A;
3718     break;
3719   case Hexagon::A4_combineir:
3720     // Rdd = combine(#0,Rs)
3721     DstReg = MI.getOperand(0).getReg();
3722     SrcReg = MI.getOperand(2).getReg();
3723     if (isDblRegForSubInst(DstReg, HRI) && isIntRegForSubInst(SrcReg) &&
3724         ((MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 0) ||
3725         (MI.getOperand(1).isGlobal() && MI.getOperand(1).getOffset() == 0)))
3726       return HexagonII::HSIG_A;
3727     break;
3728   case Hexagon::A2_sxtb:
3729   case Hexagon::A2_sxth:
3730   case Hexagon::A2_zxtb:
3731   case Hexagon::A2_zxth:
3732     // Rd = sxth/sxtb/zxtb/zxth(Rs)
3733     DstReg = MI.getOperand(0).getReg();
3734     SrcReg = MI.getOperand(1).getReg();
3735     if (isIntRegForSubInst(DstReg) && isIntRegForSubInst(SrcReg))
3736       return HexagonII::HSIG_A;
3737     break;
3738   }
3739 
3740   return HexagonII::HSIG_None;
3741 }
3742 
3743 short HexagonInstrInfo::getEquivalentHWInstr(const MachineInstr &MI) const {
3744   return Hexagon::getRealHWInstr(MI.getOpcode(), Hexagon::InstrType_Real);
3745 }
3746 
3747 unsigned HexagonInstrInfo::getInstrTimingClassLatency(
3748       const InstrItineraryData *ItinData, const MachineInstr &MI) const {
3749   // Default to one cycle for no itinerary. However, an "empty" itinerary may
3750   // still have a MinLatency property, which getStageLatency checks.
3751   if (!ItinData)
3752     return getInstrLatency(ItinData, MI);
3753 
3754   if (MI.isTransient())
3755     return 0;
3756   return ItinData->getStageLatency(MI.getDesc().getSchedClass());
3757 }
3758 
3759 /// getOperandLatency - Compute and return the use operand latency of a given
3760 /// pair of def and use.
3761 /// In most cases, the static scheduling itinerary was enough to determine the
3762 /// operand latency. But it may not be possible for instructions with variable
3763 /// number of defs / uses.
3764 ///
3765 /// This is a raw interface to the itinerary that may be directly overriden by
3766 /// a target. Use computeOperandLatency to get the best estimate of latency.
3767 int HexagonInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
3768                                         const MachineInstr &DefMI,
3769                                         unsigned DefIdx,
3770                                         const MachineInstr &UseMI,
3771                                         unsigned UseIdx) const {
3772   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
3773 
3774   // Get DefIdx and UseIdx for super registers.
3775   MachineOperand DefMO = DefMI.getOperand(DefIdx);
3776 
3777   if (HRI.isPhysicalRegister(DefMO.getReg())) {
3778     if (DefMO.isImplicit()) {
3779       for (MCSuperRegIterator SR(DefMO.getReg(), &HRI); SR.isValid(); ++SR) {
3780         int Idx = DefMI.findRegisterDefOperandIdx(*SR, false, false, &HRI);
3781         if (Idx != -1) {
3782           DefIdx = Idx;
3783           break;
3784         }
3785       }
3786     }
3787 
3788     MachineOperand UseMO = UseMI.getOperand(UseIdx);
3789     if (UseMO.isImplicit()) {
3790       for (MCSuperRegIterator SR(UseMO.getReg(), &HRI); SR.isValid(); ++SR) {
3791         int Idx = UseMI.findRegisterUseOperandIdx(*SR, false, &HRI);
3792         if (Idx != -1) {
3793           UseIdx = Idx;
3794           break;
3795         }
3796       }
3797     }
3798   }
3799 
3800   return TargetInstrInfo::getOperandLatency(ItinData, DefMI, DefIdx,
3801                                             UseMI, UseIdx);
3802 }
3803 
3804 // inverts the predication logic.
3805 // p -> NotP
3806 // NotP -> P
3807 bool HexagonInstrInfo::getInvertedPredSense(
3808       SmallVectorImpl<MachineOperand> &Cond) const {
3809   if (Cond.empty())
3810     return false;
3811   unsigned Opc = getInvertedPredicatedOpcode(Cond[0].getImm());
3812   Cond[0].setImm(Opc);
3813   return true;
3814 }
3815 
3816 unsigned HexagonInstrInfo::getInvertedPredicatedOpcode(const int Opc) const {
3817   int InvPredOpcode;
3818   InvPredOpcode = isPredicatedTrue(Opc) ? Hexagon::getFalsePredOpcode(Opc)
3819                                         : Hexagon::getTruePredOpcode(Opc);
3820   if (InvPredOpcode >= 0) // Valid instruction with the inverted predicate.
3821     return InvPredOpcode;
3822 
3823   llvm_unreachable("Unexpected predicated instruction");
3824 }
3825 
3826 // Returns the max value that doesn't need to be extended.
3827 int HexagonInstrInfo::getMaxValue(const MachineInstr &MI) const {
3828   const uint64_t F = MI.getDesc().TSFlags;
3829   unsigned isSigned = (F >> HexagonII::ExtentSignedPos)
3830                     & HexagonII::ExtentSignedMask;
3831   unsigned bits =  (F >> HexagonII::ExtentBitsPos)
3832                     & HexagonII::ExtentBitsMask;
3833 
3834   if (isSigned) // if value is signed
3835     return ~(-1U << (bits - 1));
3836   else
3837     return ~(-1U << bits);
3838 }
3839 
3840 unsigned HexagonInstrInfo::getMemAccessSize(const MachineInstr &MI) const {
3841   using namespace HexagonII;
3842 
3843   const uint64_t F = MI.getDesc().TSFlags;
3844   unsigned S = (F >> MemAccessSizePos) & MemAccesSizeMask;
3845   unsigned Size = getMemAccessSizeInBytes(MemAccessSize(S));
3846   if (Size != 0)
3847     return Size;
3848 
3849   // Handle vector access sizes.
3850   const HexagonRegisterInfo &HRI = *Subtarget.getRegisterInfo();
3851   switch (S) {
3852     case HexagonII::HVXVectorAccess:
3853       return HRI.getSpillSize(Hexagon::HvxVRRegClass);
3854     default:
3855       llvm_unreachable("Unexpected instruction");
3856   }
3857 }
3858 
3859 // Returns the min value that doesn't need to be extended.
3860 int HexagonInstrInfo::getMinValue(const MachineInstr &MI) const {
3861   const uint64_t F = MI.getDesc().TSFlags;
3862   unsigned isSigned = (F >> HexagonII::ExtentSignedPos)
3863                     & HexagonII::ExtentSignedMask;
3864   unsigned bits =  (F >> HexagonII::ExtentBitsPos)
3865                     & HexagonII::ExtentBitsMask;
3866 
3867   if (isSigned) // if value is signed
3868     return -1U << (bits - 1);
3869   else
3870     return 0;
3871 }
3872 
3873 // Returns opcode of the non-extended equivalent instruction.
3874 short HexagonInstrInfo::getNonExtOpcode(const MachineInstr &MI) const {
3875   // Check if the instruction has a register form that uses register in place
3876   // of the extended operand, if so return that as the non-extended form.
3877   short NonExtOpcode = Hexagon::getRegForm(MI.getOpcode());
3878     if (NonExtOpcode >= 0)
3879       return NonExtOpcode;
3880 
3881   if (MI.getDesc().mayLoad() || MI.getDesc().mayStore()) {
3882     // Check addressing mode and retrieve non-ext equivalent instruction.
3883     switch (getAddrMode(MI)) {
3884     case HexagonII::Absolute:
3885       return Hexagon::changeAddrMode_abs_io(MI.getOpcode());
3886     case HexagonII::BaseImmOffset:
3887       return Hexagon::changeAddrMode_io_rr(MI.getOpcode());
3888     case HexagonII::BaseLongOffset:
3889       return Hexagon::changeAddrMode_ur_rr(MI.getOpcode());
3890 
3891     default:
3892       return -1;
3893     }
3894   }
3895   return -1;
3896 }
3897 
3898 bool HexagonInstrInfo::getPredReg(ArrayRef<MachineOperand> Cond,
3899       unsigned &PredReg, unsigned &PredRegPos, unsigned &PredRegFlags) const {
3900   if (Cond.empty())
3901     return false;
3902   assert(Cond.size() == 2);
3903   if (isNewValueJump(Cond[0].getImm()) || Cond[1].isMBB()) {
3904     DEBUG(dbgs() << "No predregs for new-value jumps/endloop");
3905     return false;
3906   }
3907   PredReg = Cond[1].getReg();
3908   PredRegPos = 1;
3909   // See IfConversion.cpp why we add RegState::Implicit | RegState::Undef
3910   PredRegFlags = 0;
3911   if (Cond[1].isImplicit())
3912     PredRegFlags = RegState::Implicit;
3913   if (Cond[1].isUndef())
3914     PredRegFlags |= RegState::Undef;
3915   return true;
3916 }
3917 
3918 short HexagonInstrInfo::getPseudoInstrPair(const MachineInstr &MI) const {
3919   return Hexagon::getRealHWInstr(MI.getOpcode(), Hexagon::InstrType_Pseudo);
3920 }
3921 
3922 short HexagonInstrInfo::getRegForm(const MachineInstr &MI) const {
3923   return Hexagon::getRegForm(MI.getOpcode());
3924 }
3925 
3926 // Return the number of bytes required to encode the instruction.
3927 // Hexagon instructions are fixed length, 4 bytes, unless they
3928 // use a constant extender, which requires another 4 bytes.
3929 // For debug instructions and prolog labels, return 0.
3930 unsigned HexagonInstrInfo::getSize(const MachineInstr &MI) const {
3931   if (MI.isDebugValue() || MI.isPosition())
3932     return 0;
3933 
3934   unsigned Size = MI.getDesc().getSize();
3935   if (!Size)
3936     // Assume the default insn size in case it cannot be determined
3937     // for whatever reason.
3938     Size = HEXAGON_INSTR_SIZE;
3939 
3940   if (isConstExtended(MI) || isExtended(MI))
3941     Size += HEXAGON_INSTR_SIZE;
3942 
3943   // Try and compute number of instructions in asm.
3944   if (BranchRelaxAsmLarge && MI.getOpcode() == Hexagon::INLINEASM) {
3945     const MachineBasicBlock &MBB = *MI.getParent();
3946     const MachineFunction *MF = MBB.getParent();
3947     const MCAsmInfo *MAI = MF->getTarget().getMCAsmInfo();
3948 
3949     // Count the number of register definitions to find the asm string.
3950     unsigned NumDefs = 0;
3951     for (; MI.getOperand(NumDefs).isReg() && MI.getOperand(NumDefs).isDef();
3952          ++NumDefs)
3953       assert(NumDefs != MI.getNumOperands()-2 && "No asm string?");
3954 
3955     assert(MI.getOperand(NumDefs).isSymbol() && "No asm string?");
3956     // Disassemble the AsmStr and approximate number of instructions.
3957     const char *AsmStr = MI.getOperand(NumDefs).getSymbolName();
3958     Size = getInlineAsmLength(AsmStr, *MAI);
3959   }
3960 
3961   return Size;
3962 }
3963 
3964 uint64_t HexagonInstrInfo::getType(const MachineInstr &MI) const {
3965   const uint64_t F = MI.getDesc().TSFlags;
3966   return (F >> HexagonII::TypePos) & HexagonII::TypeMask;
3967 }
3968 
3969 unsigned HexagonInstrInfo::getUnits(const MachineInstr &MI) const {
3970   const InstrItineraryData &II = *Subtarget.getInstrItineraryData();
3971   const InstrStage &IS = *II.beginStage(MI.getDesc().getSchedClass());
3972 
3973   return IS.getUnits();
3974 }
3975 
3976 // Calculate size of the basic block without debug instructions.
3977 unsigned HexagonInstrInfo::nonDbgBBSize(const MachineBasicBlock *BB) const {
3978   return nonDbgMICount(BB->instr_begin(), BB->instr_end());
3979 }
3980 
3981 unsigned HexagonInstrInfo::nonDbgBundleSize(
3982       MachineBasicBlock::const_iterator BundleHead) const {
3983   assert(BundleHead->isBundle() && "Not a bundle header");
3984   auto MII = BundleHead.getInstrIterator();
3985   // Skip the bundle header.
3986   return nonDbgMICount(++MII, getBundleEnd(BundleHead.getInstrIterator()));
3987 }
3988 
3989 /// immediateExtend - Changes the instruction in place to one using an immediate
3990 /// extender.
3991 void HexagonInstrInfo::immediateExtend(MachineInstr &MI) const {
3992   assert((isExtendable(MI)||isConstExtended(MI)) &&
3993                                "Instruction must be extendable");
3994   // Find which operand is extendable.
3995   short ExtOpNum = getCExtOpNum(MI);
3996   MachineOperand &MO = MI.getOperand(ExtOpNum);
3997   // This needs to be something we understand.
3998   assert((MO.isMBB() || MO.isImm()) &&
3999          "Branch with unknown extendable field type");
4000   // Mark given operand as extended.
4001   MO.addTargetFlag(HexagonII::HMOTF_ConstExtended);
4002 }
4003 
4004 bool HexagonInstrInfo::invertAndChangeJumpTarget(
4005       MachineInstr &MI, MachineBasicBlock *NewTarget) const {
4006   DEBUG(dbgs() << "\n[invertAndChangeJumpTarget] to BB#"
4007                << NewTarget->getNumber(); MI.dump(););
4008   assert(MI.isBranch());
4009   unsigned NewOpcode = getInvertedPredicatedOpcode(MI.getOpcode());
4010   int TargetPos = MI.getNumOperands() - 1;
4011   // In general branch target is the last operand,
4012   // but some implicit defs added at the end might change it.
4013   while ((TargetPos > -1) && !MI.getOperand(TargetPos).isMBB())
4014     --TargetPos;
4015   assert((TargetPos >= 0) && MI.getOperand(TargetPos).isMBB());
4016   MI.getOperand(TargetPos).setMBB(NewTarget);
4017   if (EnableBranchPrediction && isPredicatedNew(MI)) {
4018     NewOpcode = reversePrediction(NewOpcode);
4019   }
4020   MI.setDesc(get(NewOpcode));
4021   return true;
4022 }
4023 
4024 void HexagonInstrInfo::genAllInsnTimingClasses(MachineFunction &MF) const {
4025   /* +++ The code below is used to generate complete set of Hexagon Insn +++ */
4026   MachineFunction::iterator A = MF.begin();
4027   MachineBasicBlock &B = *A;
4028   MachineBasicBlock::iterator I = B.begin();
4029   DebugLoc DL = I->getDebugLoc();
4030   MachineInstr *NewMI;
4031 
4032   for (unsigned insn = TargetOpcode::GENERIC_OP_END+1;
4033        insn < Hexagon::INSTRUCTION_LIST_END; ++insn) {
4034     NewMI = BuildMI(B, I, DL, get(insn));
4035     DEBUG(dbgs() << "\n" << getName(NewMI->getOpcode()) <<
4036           "  Class: " << NewMI->getDesc().getSchedClass());
4037     NewMI->eraseFromParent();
4038   }
4039   /* --- The code above is used to generate complete set of Hexagon Insn --- */
4040 }
4041 
4042 // inverts the predication logic.
4043 // p -> NotP
4044 // NotP -> P
4045 bool HexagonInstrInfo::reversePredSense(MachineInstr &MI) const {
4046   DEBUG(dbgs() << "\nTrying to reverse pred. sense of:"; MI.dump());
4047   MI.setDesc(get(getInvertedPredicatedOpcode(MI.getOpcode())));
4048   return true;
4049 }
4050 
4051 // Reverse the branch prediction.
4052 unsigned HexagonInstrInfo::reversePrediction(unsigned Opcode) const {
4053   int PredRevOpcode = -1;
4054   if (isPredictedTaken(Opcode))
4055     PredRevOpcode = Hexagon::notTakenBranchPrediction(Opcode);
4056   else
4057     PredRevOpcode = Hexagon::takenBranchPrediction(Opcode);
4058   assert(PredRevOpcode > 0);
4059   return PredRevOpcode;
4060 }
4061 
4062 // TODO: Add more rigorous validation.
4063 bool HexagonInstrInfo::validateBranchCond(const ArrayRef<MachineOperand> &Cond)
4064       const {
4065   return Cond.empty() || (Cond[0].isImm() && (Cond.size() != 1));
4066 }
4067 
4068 // Addressing mode relations.
4069 short HexagonInstrInfo::changeAddrMode_abs_io(short Opc) const {
4070   return Opc >= 0 ? Hexagon::changeAddrMode_abs_io(Opc) : Opc;
4071 }
4072 
4073 short HexagonInstrInfo::changeAddrMode_io_abs(short Opc) const {
4074   return Opc >= 0 ? Hexagon::changeAddrMode_io_abs(Opc) : Opc;
4075 }
4076 
4077 short HexagonInstrInfo::changeAddrMode_io_rr(short Opc) const {
4078   return Opc >= 0 ? Hexagon::changeAddrMode_io_rr(Opc) : Opc;
4079 }
4080 
4081 short HexagonInstrInfo::changeAddrMode_rr_io(short Opc) const {
4082   return Opc >= 0 ? Hexagon::changeAddrMode_rr_io(Opc) : Opc;
4083 }
4084 
4085 short HexagonInstrInfo::changeAddrMode_rr_ur(short Opc) const {
4086   return Opc >= 0 ? Hexagon::changeAddrMode_rr_ur(Opc) : Opc;
4087 }
4088 
4089 short HexagonInstrInfo::changeAddrMode_ur_rr(short Opc) const {
4090   return Opc >= 0 ? Hexagon::changeAddrMode_ur_rr(Opc) : Opc;
4091 }
4092