Use the new script to sort the includes of every file under lib.
[oota-llvm.git] / lib / Target / Hexagon / HexagonHardwareLoops.cpp
1 //===-- HexagonHardwareLoops.cpp - Identify and generate hardware loops ---===//
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 pass identifies loops where we can generate the Hexagon hardware
11 // loop instruction.  The hardware loop can perform loop branches with a
12 // zero-cycle overhead.
13 //
14 // The pattern that defines the induction variable can changed depending on
15 // prior optimizations.  For example, the IndVarSimplify phase run by 'opt'
16 // normalizes induction variables, and the Loop Strength Reduction pass
17 // run by 'llc' may also make changes to the induction variable.
18 // The pattern detected by this phase is due to running Strength Reduction.
19 //
20 // Criteria for hardware loops:
21 //  - Countable loops (w/ ind. var for a trip count)
22 //  - Assumes loops are normalized by IndVarSimplify
23 //  - Try inner-most loops first
24 //  - No nested hardware loops.
25 //  - No function calls in loops.
26 //
27 //===----------------------------------------------------------------------===//
28
29 #define DEBUG_TYPE "hwloops"
30 #include "Hexagon.h"
31 #include "HexagonTargetMachine.h"
32 #include "llvm/ADT/DenseMap.h"
33 #include "llvm/ADT/Statistic.h"
34 #include "llvm/CodeGen/MachineDominators.h"
35 #include "llvm/CodeGen/MachineFunction.h"
36 #include "llvm/CodeGen/MachineFunctionPass.h"
37 #include "llvm/CodeGen/MachineInstrBuilder.h"
38 #include "llvm/CodeGen/MachineLoopInfo.h"
39 #include "llvm/CodeGen/MachineRegisterInfo.h"
40 #include "llvm/CodeGen/Passes.h"
41 #include "llvm/CodeGen/RegisterScavenging.h"
42 #include "llvm/Constants.h"
43 #include "llvm/PassSupport.h"
44 #include "llvm/Support/Debug.h"
45 #include "llvm/Support/raw_ostream.h"
46 #include "llvm/Target/TargetInstrInfo.h"
47 #include <algorithm>
48
49 using namespace llvm;
50
51 STATISTIC(NumHWLoops, "Number of loops converted to hardware loops");
52
53 namespace {
54   class CountValue;
55   struct HexagonHardwareLoops : public MachineFunctionPass {
56     MachineLoopInfo       *MLI;
57     MachineRegisterInfo   *MRI;
58     const TargetInstrInfo *TII;
59
60   public:
61     static char ID;   // Pass identification, replacement for typeid
62
63     HexagonHardwareLoops() : MachineFunctionPass(ID) {}
64
65     virtual bool runOnMachineFunction(MachineFunction &MF);
66
67     const char *getPassName() const { return "Hexagon Hardware Loops"; }
68
69     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
70       AU.setPreservesCFG();
71       AU.addRequired<MachineDominatorTree>();
72       AU.addPreserved<MachineDominatorTree>();
73       AU.addRequired<MachineLoopInfo>();
74       AU.addPreserved<MachineLoopInfo>();
75       MachineFunctionPass::getAnalysisUsage(AU);
76     }
77
78   private:
79     /// getCanonicalInductionVariable - Check to see if the loop has a canonical
80     /// induction variable.
81     /// Should be defined in MachineLoop. Based upon version in class Loop.
82     const MachineInstr *getCanonicalInductionVariable(MachineLoop *L) const;
83
84     /// getTripCount - Return a loop-invariant LLVM register indicating the
85     /// number of times the loop will be executed.  If the trip-count cannot
86     /// be determined, this return null.
87     CountValue *getTripCount(MachineLoop *L) const;
88
89     /// isInductionOperation - Return true if the instruction matches the
90     /// pattern for an opertion that defines an induction variable.
91     bool isInductionOperation(const MachineInstr *MI, unsigned IVReg) const;
92
93     /// isInvalidOperation - Return true if the instruction is not valid within
94     /// a hardware loop.
95     bool isInvalidLoopOperation(const MachineInstr *MI) const;
96
97     /// containsInavlidInstruction - Return true if the loop contains an
98     /// instruction that inhibits using the hardware loop.
99     bool containsInvalidInstruction(MachineLoop *L) const;
100
101     /// converToHardwareLoop - Given a loop, check if we can convert it to a
102     /// hardware loop.  If so, then perform the conversion and return true.
103     bool convertToHardwareLoop(MachineLoop *L);
104
105   };
106
107   char HexagonHardwareLoops::ID = 0;
108
109
110   // CountValue class - Abstraction for a trip count of a loop. A
111   // smaller vesrsion of the MachineOperand class without the concerns
112   // of changing the operand representation.
113   class CountValue {
114   public:
115     enum CountValueType {
116       CV_Register,
117       CV_Immediate
118     };
119   private:
120     CountValueType Kind;
121     union Values {
122       unsigned RegNum;
123       int64_t ImmVal;
124       Values(unsigned r) : RegNum(r) {}
125       Values(int64_t i) : ImmVal(i) {}
126     } Contents;
127     bool isNegative;
128
129   public:
130     CountValue(unsigned r, bool neg) : Kind(CV_Register), Contents(r),
131                                        isNegative(neg) {}
132     explicit CountValue(int64_t i) : Kind(CV_Immediate), Contents(i),
133                                      isNegative(i < 0) {}
134     CountValueType getType() const { return Kind; }
135     bool isReg() const { return Kind == CV_Register; }
136     bool isImm() const { return Kind == CV_Immediate; }
137     bool isNeg() const { return isNegative; }
138
139     unsigned getReg() const {
140       assert(isReg() && "Wrong CountValue accessor");
141       return Contents.RegNum;
142     }
143     void setReg(unsigned Val) {
144       Contents.RegNum = Val;
145     }
146     int64_t getImm() const {
147       assert(isImm() && "Wrong CountValue accessor");
148       if (isNegative) {
149         return -Contents.ImmVal;
150       }
151       return Contents.ImmVal;
152     }
153     void setImm(int64_t Val) {
154       Contents.ImmVal = Val;
155     }
156
157     void print(raw_ostream &OS, const TargetMachine *TM = 0) const {
158       if (isReg()) { OS << PrintReg(getReg()); }
159       if (isImm()) { OS << getImm(); }
160     }
161   };
162
163   struct HexagonFixupHwLoops : public MachineFunctionPass {
164   public:
165     static char ID;     // Pass identification, replacement for typeid.
166
167     HexagonFixupHwLoops() : MachineFunctionPass(ID) {}
168
169     virtual bool runOnMachineFunction(MachineFunction &MF);
170
171     const char *getPassName() const { return "Hexagon Hardware Loop Fixup"; }
172
173     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
174       AU.setPreservesCFG();
175       MachineFunctionPass::getAnalysisUsage(AU);
176     }
177
178   private:
179     /// Maximum distance between the loop instr and the basic block.
180     /// Just an estimate.
181     static const unsigned MAX_LOOP_DISTANCE = 200;
182
183     /// fixupLoopInstrs - Check the offset between each loop instruction and
184     /// the loop basic block to determine if we can use the LOOP instruction
185     /// or if we need to set the LC/SA registers explicitly.
186     bool fixupLoopInstrs(MachineFunction &MF);
187
188     /// convertLoopInstr - Add the instruction to set the LC and SA registers
189     /// explicitly.
190     void convertLoopInstr(MachineFunction &MF,
191                           MachineBasicBlock::iterator &MII,
192                           RegScavenger &RS);
193
194   };
195
196   char HexagonFixupHwLoops::ID = 0;
197
198 } // end anonymous namespace
199
200
201 /// isHardwareLoop - Returns true if the instruction is a hardware loop
202 /// instruction.
203 static bool isHardwareLoop(const MachineInstr *MI) {
204   return MI->getOpcode() == Hexagon::LOOP0_r ||
205     MI->getOpcode() == Hexagon::LOOP0_i;
206 }
207
208 /// isCompareEquals - Returns true if the instruction is a compare equals
209 /// instruction with an immediate operand.
210 static bool isCompareEqualsImm(const MachineInstr *MI) {
211   return MI->getOpcode() == Hexagon::CMPEQri;
212 }
213
214
215 /// createHexagonHardwareLoops - Factory for creating
216 /// the hardware loop phase.
217 FunctionPass *llvm::createHexagonHardwareLoops() {
218   return new HexagonHardwareLoops();
219 }
220
221
222 bool HexagonHardwareLoops::runOnMachineFunction(MachineFunction &MF) {
223   DEBUG(dbgs() << "********* Hexagon Hardware Loops *********\n");
224
225   bool Changed = false;
226
227   // get the loop information
228   MLI = &getAnalysis<MachineLoopInfo>();
229   // get the register information
230   MRI = &MF.getRegInfo();
231   // the target specific instructio info.
232   TII = MF.getTarget().getInstrInfo();
233
234   for (MachineLoopInfo::iterator I = MLI->begin(), E = MLI->end();
235        I != E; ++I) {
236     MachineLoop *L = *I;
237     if (!L->getParentLoop()) {
238       Changed |= convertToHardwareLoop(L);
239     }
240   }
241
242   return Changed;
243 }
244
245 /// getCanonicalInductionVariable - Check to see if the loop has a canonical
246 /// induction variable. We check for a simple recurrence pattern - an
247 /// integer recurrence that decrements by one each time through the loop and
248 /// ends at zero.  If so, return the phi node that corresponds to it.
249 ///
250 /// Based upon the similar code in LoopInfo except this code is specific to
251 /// the machine.
252 /// This method assumes that the IndVarSimplify pass has been run by 'opt'.
253 ///
254 const MachineInstr
255 *HexagonHardwareLoops::getCanonicalInductionVariable(MachineLoop *L) const {
256   MachineBasicBlock *TopMBB = L->getTopBlock();
257   MachineBasicBlock::pred_iterator PI = TopMBB->pred_begin();
258   assert(PI != TopMBB->pred_end() &&
259          "Loop must have more than one incoming edge!");
260   MachineBasicBlock *Backedge = *PI++;
261   if (PI == TopMBB->pred_end()) return 0;  // dead loop
262   MachineBasicBlock *Incoming = *PI++;
263   if (PI != TopMBB->pred_end()) return 0;  // multiple backedges?
264
265   // make sure there is one incoming and one backedge and determine which
266   // is which.
267   if (L->contains(Incoming)) {
268     if (L->contains(Backedge))
269       return 0;
270     std::swap(Incoming, Backedge);
271   } else if (!L->contains(Backedge))
272     return 0;
273
274   // Loop over all of the PHI nodes, looking for a canonical induction variable:
275   //   - The PHI node is "reg1 = PHI reg2, BB1, reg3, BB2".
276   //   - The recurrence comes from the backedge.
277   //   - the definition is an induction operatio.n
278   for (MachineBasicBlock::iterator I = TopMBB->begin(), E = TopMBB->end();
279        I != E && I->isPHI(); ++I) {
280     const MachineInstr *MPhi = &*I;
281     unsigned DefReg = MPhi->getOperand(0).getReg();
282     for (unsigned i = 1; i != MPhi->getNumOperands(); i += 2) {
283       // Check each operand for the value from the backedge.
284       MachineBasicBlock *MBB = MPhi->getOperand(i+1).getMBB();
285       if (L->contains(MBB)) { // operands comes from the backedge
286         // Check if the definition is an induction operation.
287         const MachineInstr *DI = MRI->getVRegDef(MPhi->getOperand(i).getReg());
288         if (isInductionOperation(DI, DefReg)) {
289           return MPhi;
290         }
291       }
292     }
293   }
294   return 0;
295 }
296
297 /// getTripCount - Return a loop-invariant LLVM value indicating the
298 /// number of times the loop will be executed.  The trip count can
299 /// be either a register or a constant value.  If the trip-count
300 /// cannot be determined, this returns null.
301 ///
302 /// We find the trip count from the phi instruction that defines the
303 /// induction variable.  We follow the links to the CMP instruction
304 /// to get the trip count.
305 ///
306 /// Based upon getTripCount in LoopInfo.
307 ///
308 CountValue *HexagonHardwareLoops::getTripCount(MachineLoop *L) const {
309   // Check that the loop has a induction variable.
310   const MachineInstr *IV_Inst = getCanonicalInductionVariable(L);
311   if (IV_Inst == 0) return 0;
312
313   // Canonical loops will end with a 'cmpeq_ri IV, Imm',
314   //  if Imm is 0, get the count from the PHI opnd
315   //  if Imm is -M, than M is the count
316   //  Otherwise, Imm is the count
317   const MachineOperand *IV_Opnd;
318   const MachineOperand *InitialValue;
319   if (!L->contains(IV_Inst->getOperand(2).getMBB())) {
320     InitialValue = &IV_Inst->getOperand(1);
321     IV_Opnd = &IV_Inst->getOperand(3);
322   } else {
323     InitialValue = &IV_Inst->getOperand(3);
324     IV_Opnd = &IV_Inst->getOperand(1);
325   }
326
327   // Look for the cmp instruction to determine if we
328   // can get a useful trip count.  The trip count can
329   // be either a register or an immediate.  The location
330   // of the value depends upon the type (reg or imm).
331   for (MachineRegisterInfo::reg_iterator
332        RI = MRI->reg_begin(IV_Opnd->getReg()), RE = MRI->reg_end();
333        RI != RE; ++RI) {
334     IV_Opnd = &RI.getOperand();
335     const MachineInstr *MI = IV_Opnd->getParent();
336     if (L->contains(MI) && isCompareEqualsImm(MI)) {
337       const MachineOperand &MO = MI->getOperand(2);
338       assert(MO.isImm() && "IV Cmp Operand should be 0");
339       int64_t ImmVal = MO.getImm();
340
341       const MachineInstr *IV_DefInstr = MRI->getVRegDef(IV_Opnd->getReg());
342       assert(L->contains(IV_DefInstr->getParent()) &&
343              "IV definition should occurs in loop");
344       int64_t iv_value = IV_DefInstr->getOperand(2).getImm();
345
346       if (ImmVal == 0) {
347         // Make sure the induction variable changes by one on each iteration.
348         if (iv_value != 1 && iv_value != -1) {
349           return 0;
350         }
351         return new CountValue(InitialValue->getReg(), iv_value > 0);
352       } else {
353         assert(InitialValue->isReg() && "Expecting register for init value");
354         const MachineInstr *DefInstr = MRI->getVRegDef(InitialValue->getReg());
355         if (DefInstr && DefInstr->getOpcode() == Hexagon::TFRI) {
356           int64_t count = ImmVal - DefInstr->getOperand(1).getImm();
357           if ((count % iv_value) != 0) {
358             return 0;
359           }
360           return new CountValue(count/iv_value);
361         }
362       }
363     }
364   }
365   return 0;
366 }
367
368 /// isInductionOperation - return true if the operation is matches the
369 /// pattern that defines an induction variable:
370 ///    add iv, c
371 ///
372 bool
373 HexagonHardwareLoops::isInductionOperation(const MachineInstr *MI,
374                                            unsigned IVReg) const {
375   return (MI->getOpcode() ==
376           Hexagon::ADD_ri && MI->getOperand(1).getReg() == IVReg);
377 }
378
379 /// isInvalidOperation - Return true if the operation is invalid within
380 /// hardware loop.
381 bool
382 HexagonHardwareLoops::isInvalidLoopOperation(const MachineInstr *MI) const {
383
384   // call is not allowed because the callee may use a hardware loop
385   if (MI->getDesc().isCall()) {
386     return true;
387   }
388   // do not allow nested hardware loops
389   if (isHardwareLoop(MI)) {
390     return true;
391   }
392   // check if the instruction defines a hardware loop register
393   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
394     const MachineOperand &MO = MI->getOperand(i);
395     if (MO.isReg() && MO.isDef() &&
396         (MO.getReg() == Hexagon::LC0 || MO.getReg() == Hexagon::LC1 ||
397          MO.getReg() == Hexagon::SA0 || MO.getReg() == Hexagon::SA0)) {
398       return true;
399     }
400   }
401   return false;
402 }
403
404 /// containsInvalidInstruction - Return true if the loop contains
405 /// an instruction that inhibits the use of the hardware loop function.
406 ///
407 bool HexagonHardwareLoops::containsInvalidInstruction(MachineLoop *L) const {
408   const std::vector<MachineBasicBlock*> Blocks = L->getBlocks();
409   for (unsigned i = 0, e = Blocks.size(); i != e; ++i) {
410     MachineBasicBlock *MBB = Blocks[i];
411     for (MachineBasicBlock::iterator
412            MII = MBB->begin(), E = MBB->end(); MII != E; ++MII) {
413       const MachineInstr *MI = &*MII;
414       if (isInvalidLoopOperation(MI)) {
415         return true;
416       }
417     }
418   }
419   return false;
420 }
421
422 /// converToHardwareLoop - check if the loop is a candidate for
423 /// converting to a hardware loop.  If so, then perform the
424 /// transformation.
425 ///
426 /// This function works on innermost loops first.  A loop can
427 /// be converted if it is a counting loop; either a register
428 /// value or an immediate.
429 ///
430 /// The code makes several assumptions about the representation
431 /// of the loop in llvm.
432 bool HexagonHardwareLoops::convertToHardwareLoop(MachineLoop *L) {
433   bool Changed = false;
434   // Process nested loops first.
435   for (MachineLoop::iterator I = L->begin(), E = L->end(); I != E; ++I) {
436     Changed |= convertToHardwareLoop(*I);
437   }
438   // If a nested loop has been converted, then we can't convert this loop.
439   if (Changed) {
440     return Changed;
441   }
442   // Are we able to determine the trip count for the loop?
443   CountValue *TripCount = getTripCount(L);
444   if (TripCount == 0) {
445     return false;
446   }
447   // Does the loop contain any invalid instructions?
448   if (containsInvalidInstruction(L)) {
449     return false;
450   }
451   MachineBasicBlock *Preheader = L->getLoopPreheader();
452   // No preheader means there's not place for the loop instr.
453   if (Preheader == 0) {
454     return false;
455   }
456   MachineBasicBlock::iterator InsertPos = Preheader->getFirstTerminator();
457
458   MachineBasicBlock *LastMBB = L->getExitingBlock();
459   // Don't generate hw loop if the loop has more than one exit.
460   if (LastMBB == 0) {
461     return false;
462   }
463   MachineBasicBlock::iterator LastI = LastMBB->getFirstTerminator();
464
465   // Determine the loop start.
466   MachineBasicBlock *LoopStart = L->getTopBlock();
467   if (L->getLoopLatch() != LastMBB) {
468     // When the exit and latch are not the same, use the latch block as the
469     // start.
470     // The loop start address is used only after the 1st iteration, and the loop
471     // latch may contains instrs. that need to be executed after the 1st iter.
472     LoopStart = L->getLoopLatch();
473     // Make sure the latch is a successor of the exit, otherwise it won't work.
474     if (!LastMBB->isSuccessor(LoopStart)) {
475       return false;
476     }
477   }
478
479   // Convert the loop to a hardware loop
480   DEBUG(dbgs() << "Change to hardware loop at "; L->dump());
481
482   if (TripCount->isReg()) {
483     // Create a copy of the loop count register.
484     MachineFunction *MF = LastMBB->getParent();
485     const TargetRegisterClass *RC =
486       MF->getRegInfo().getRegClass(TripCount->getReg());
487     unsigned CountReg = MF->getRegInfo().createVirtualRegister(RC);
488     BuildMI(*Preheader, InsertPos, InsertPos->getDebugLoc(),
489             TII->get(TargetOpcode::COPY), CountReg).addReg(TripCount->getReg());
490     if (TripCount->isNeg()) {
491       unsigned CountReg1 = CountReg;
492       CountReg = MF->getRegInfo().createVirtualRegister(RC);
493       BuildMI(*Preheader, InsertPos, InsertPos->getDebugLoc(),
494               TII->get(Hexagon::NEG), CountReg).addReg(CountReg1);
495     }
496
497     // Add the Loop instruction to the beginning of the loop.
498     BuildMI(*Preheader, InsertPos, InsertPos->getDebugLoc(),
499             TII->get(Hexagon::LOOP0_r)).addMBB(LoopStart).addReg(CountReg);
500   } else {
501     assert(TripCount->isImm() && "Expecting immedate vaule for trip count");
502     // Add the Loop immediate instruction to the beginning of the loop.
503     int64_t CountImm = TripCount->getImm();
504     BuildMI(*Preheader, InsertPos, InsertPos->getDebugLoc(),
505             TII->get(Hexagon::LOOP0_i)).addMBB(LoopStart).addImm(CountImm);
506   }
507
508   // Make sure the loop start always has a reference in the CFG.  We need to
509   // create a BlockAddress operand to get this mechanism to work both the
510   // MachineBasicBlock and BasicBlock objects need the flag set.
511   LoopStart->setHasAddressTaken();
512   // This line is needed to set the hasAddressTaken flag on the BasicBlock
513   // object
514   BlockAddress::get(const_cast<BasicBlock *>(LoopStart->getBasicBlock()));
515
516   // Replace the loop branch with an endloop instruction.
517   DebugLoc dl = LastI->getDebugLoc();
518   BuildMI(*LastMBB, LastI, dl, TII->get(Hexagon::ENDLOOP0)).addMBB(LoopStart);
519
520   // The loop ends with either:
521   //  - a conditional branch followed by an unconditional branch, or
522   //  - a conditional branch to the loop start.
523   if (LastI->getOpcode() == Hexagon::JMP_c ||
524       LastI->getOpcode() == Hexagon::JMP_cNot) {
525     // delete one and change/add an uncond. branch to out of the loop
526     MachineBasicBlock *BranchTarget = LastI->getOperand(1).getMBB();
527     LastI = LastMBB->erase(LastI);
528     if (!L->contains(BranchTarget)) {
529       if (LastI != LastMBB->end()) {
530         TII->RemoveBranch(*LastMBB);
531       }
532       SmallVector<MachineOperand, 0> Cond;
533       TII->InsertBranch(*LastMBB, BranchTarget, 0, Cond, dl);
534     }
535   } else {
536     // Conditional branch to loop start; just delete it.
537     LastMBB->erase(LastI);
538   }
539   delete TripCount;
540
541   ++NumHWLoops;
542   return true;
543 }
544
545 /// createHexagonFixupHwLoops - Factory for creating the hardware loop
546 /// phase.
547 FunctionPass *llvm::createHexagonFixupHwLoops() {
548   return new HexagonFixupHwLoops();
549 }
550
551 bool HexagonFixupHwLoops::runOnMachineFunction(MachineFunction &MF) {
552   DEBUG(dbgs() << "****** Hexagon Hardware Loop Fixup ******\n");
553
554   bool Changed = fixupLoopInstrs(MF);
555   return Changed;
556 }
557
558 /// fixupLoopInsts - For Hexagon, if the loop label is to far from the
559 /// loop instruction then we need to set the LC0 and SA0 registers
560 /// explicitly instead of using LOOP(start,count).  This function
561 /// checks the distance, and generates register assignments if needed.
562 ///
563 /// This function makes two passes over the basic blocks.  The first
564 /// pass computes the offset of the basic block from the start.
565 /// The second pass checks all the loop instructions.
566 bool HexagonFixupHwLoops::fixupLoopInstrs(MachineFunction &MF) {
567
568   // Offset of the current instruction from the start.
569   unsigned InstOffset = 0;
570   // Map for each basic block to it's first instruction.
571   DenseMap<MachineBasicBlock*, unsigned> BlockToInstOffset;
572
573   // First pass - compute the offset of each basic block.
574   for (MachineFunction::iterator MBB = MF.begin(), MBBe = MF.end();
575        MBB != MBBe; ++MBB) {
576     BlockToInstOffset[MBB] = InstOffset;
577     InstOffset += (MBB->size() * 4);
578   }
579
580   // Second pass - check each loop instruction to see if it needs to
581   // be converted.
582   InstOffset = 0;
583   bool Changed = false;
584   RegScavenger RS;
585
586   // Loop over all the basic blocks.
587   for (MachineFunction::iterator MBB = MF.begin(), MBBe = MF.end();
588        MBB != MBBe; ++MBB) {
589     InstOffset = BlockToInstOffset[MBB];
590     RS.enterBasicBlock(MBB);
591
592     // Loop over all the instructions.
593     MachineBasicBlock::iterator MIE = MBB->end();
594     MachineBasicBlock::iterator MII = MBB->begin();
595     while (MII != MIE) {
596       if (isHardwareLoop(MII)) {
597         RS.forward(MII);
598         assert(MII->getOperand(0).isMBB() &&
599                "Expect a basic block as loop operand");
600         int diff = InstOffset - BlockToInstOffset[MII->getOperand(0).getMBB()];
601         diff = (diff > 0 ? diff : -diff);
602         if ((unsigned)diff > MAX_LOOP_DISTANCE) {
603           // Convert to explicity setting LC0 and SA0.
604           convertLoopInstr(MF, MII, RS);
605           MII = MBB->erase(MII);
606           Changed = true;
607         } else {
608           ++MII;
609         }
610       } else {
611         ++MII;
612       }
613       InstOffset += 4;
614     }
615   }
616
617   return Changed;
618
619 }
620
621 /// convertLoopInstr - convert a loop instruction to a sequence of instructions
622 /// that set the lc and sa register explicitly.
623 void HexagonFixupHwLoops::convertLoopInstr(MachineFunction &MF,
624                                            MachineBasicBlock::iterator &MII,
625                                            RegScavenger &RS) {
626   const TargetInstrInfo *TII = MF.getTarget().getInstrInfo();
627   MachineBasicBlock *MBB = MII->getParent();
628   DebugLoc DL = MII->getDebugLoc();
629   unsigned Scratch = RS.scavengeRegister(&Hexagon::IntRegsRegClass, MII, 0);
630
631   // First, set the LC0 with the trip count.
632   if (MII->getOperand(1).isReg()) {
633     // Trip count is a register
634     BuildMI(*MBB, MII, DL, TII->get(Hexagon::TFCR), Hexagon::LC0)
635       .addReg(MII->getOperand(1).getReg());
636   } else {
637     // Trip count is an immediate.
638     BuildMI(*MBB, MII, DL, TII->get(Hexagon::TFRI), Scratch)
639       .addImm(MII->getOperand(1).getImm());
640     BuildMI(*MBB, MII, DL, TII->get(Hexagon::TFCR), Hexagon::LC0)
641       .addReg(Scratch);
642   }
643   // Then, set the SA0 with the loop start address.
644   BuildMI(*MBB, MII, DL, TII->get(Hexagon::CONST32_Label), Scratch)
645     .addMBB(MII->getOperand(0).getMBB());
646   BuildMI(*MBB, MII, DL, TII->get(Hexagon::TFCR), Hexagon::SA0).addReg(Scratch);
647 }