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