[mips] Define helper function searchRange
authorAkira Hatanaka <ahatanaka@mips.com>
Fri, 1 Mar 2013 00:26:14 +0000 (00:26 +0000)
committerAkira Hatanaka <ahatanaka@mips.com>
Fri, 1 Mar 2013 00:26:14 +0000 (00:26 +0000)
No functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176318 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsDelaySlotFiller.cpp

index 2762e2542dcbea23b2f9325a65bd5cbd942a0dbc..0d6b00915f5cf1049c335a3464ede32715b5b421 100644 (file)
@@ -129,6 +129,12 @@ namespace {
     bool delayHasHazard(const MachineInstr &Candidate, RegDefsUses &RegDU,
                         MemDefsUses &MemDU) const;
 
+    /// This function searches range [Begin, End) for an instruction that can be
+    /// moved to the delay slot. Returns true on success.
+    template<typename IterTy>
+    bool searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
+                     RegDefsUses &RegDU, MemDefsUses &MemDU, IterTy &Filler) const;
+
     bool searchBackward(MachineBasicBlock &MBB, Iter Slot, Iter &Filler) const;
 
     bool terminateSearch(const MachineInstr &Candidate) const;
@@ -312,14 +318,11 @@ FunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
   return new Filler(tm);
 }
 
-bool Filler::searchBackward(MachineBasicBlock &MBB, Iter Slot,
-                            Iter &Filler) const {
-  RegDefsUses RegDU(TM);
-  MemDefsUses MemDU(MBB.getParent()->getFrameInfo());
-
-  RegDU.init(*Slot);
-
-  for (ReverseIter I(Slot); I != MBB.rend(); ++I) {
+template<typename IterTy>
+bool Filler::searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
+                         RegDefsUses &RegDU, MemDefsUses &MemDU,
+                         IterTy &Filler) const {
+  for (IterTy I = Begin; I != End; ++I) {
     // skip debug value
     if (I->isDebugValue())
       continue;
@@ -333,7 +336,24 @@ bool Filler::searchBackward(MachineBasicBlock &MBB, Iter Slot,
     if (delayHasHazard(*I, RegDU, MemDU))
       continue;
 
-    Filler = llvm::next(I).base();
+    Filler = I;
+    return true;
+  }
+
+  return false;
+}
+
+bool Filler::searchBackward(MachineBasicBlock &MBB, Iter Slot,
+                            Iter &Filler) const {
+  RegDefsUses RegDU(TM);
+  MemDefsUses MemDU(MBB.getParent()->getFrameInfo());
+  ReverseIter FillerReverse;
+
+  RegDU.init(*Slot);
+
+  if (searchRange(MBB, ReverseIter(Slot), MBB.rend(), RegDU, MemDU,
+                  FillerReverse)) {
+    Filler = llvm::next(FillerReverse).base();
     return true;
   }