Home | History | Annotate | Download | only in Mips
      1 //===-- MipsDelaySlotFiller.cpp - Mips Delay Slot Filler ------------------===//
      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 // Simple pass to fill delay slots with useful instructions.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #define DEBUG_TYPE "delay-slot-filler"
     15 
     16 #include "Mips.h"
     17 #include "MipsInstrInfo.h"
     18 #include "MipsTargetMachine.h"
     19 #include "llvm/ADT/BitVector.h"
     20 #include "llvm/ADT/SmallPtrSet.h"
     21 #include "llvm/ADT/Statistic.h"
     22 #include "llvm/Analysis/AliasAnalysis.h"
     23 #include "llvm/Analysis/ValueTracking.h"
     24 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
     25 #include "llvm/CodeGen/MachineFunctionPass.h"
     26 #include "llvm/CodeGen/MachineInstrBuilder.h"
     27 #include "llvm/CodeGen/PseudoSourceValue.h"
     28 #include "llvm/Support/CommandLine.h"
     29 #include "llvm/Target/TargetInstrInfo.h"
     30 #include "llvm/Target/TargetMachine.h"
     31 #include "llvm/Target/TargetRegisterInfo.h"
     32 
     33 using namespace llvm;
     34 
     35 STATISTIC(FilledSlots, "Number of delay slots filled");
     36 STATISTIC(UsefulSlots, "Number of delay slots filled with instructions that"
     37                        " are not NOP.");
     38 
     39 static cl::opt<bool> DisableDelaySlotFiller(
     40   "disable-mips-delay-filler",
     41   cl::init(false),
     42   cl::desc("Fill all delay slots with NOPs."),
     43   cl::Hidden);
     44 
     45 static cl::opt<bool> DisableForwardSearch(
     46   "disable-mips-df-forward-search",
     47   cl::init(true),
     48   cl::desc("Disallow MIPS delay filler to search forward."),
     49   cl::Hidden);
     50 
     51 static cl::opt<bool> DisableSuccBBSearch(
     52   "disable-mips-df-succbb-search",
     53   cl::init(true),
     54   cl::desc("Disallow MIPS delay filler to search successor basic blocks."),
     55   cl::Hidden);
     56 
     57 static cl::opt<bool> DisableBackwardSearch(
     58   "disable-mips-df-backward-search",
     59   cl::init(false),
     60   cl::desc("Disallow MIPS delay filler to search backward."),
     61   cl::Hidden);
     62 
     63 namespace {
     64   typedef MachineBasicBlock::iterator Iter;
     65   typedef MachineBasicBlock::reverse_iterator ReverseIter;
     66   typedef SmallDenseMap<MachineBasicBlock*, MachineInstr*, 2> BB2BrMap;
     67 
     68   /// \brief A functor comparing edge weight of two blocks.
     69   struct CmpWeight {
     70     CmpWeight(const MachineBasicBlock &S,
     71               const MachineBranchProbabilityInfo &P) : Src(S), Prob(P) {}
     72 
     73     bool operator()(const MachineBasicBlock *Dst0,
     74                     const MachineBasicBlock *Dst1) const {
     75       return Prob.getEdgeWeight(&Src, Dst0) < Prob.getEdgeWeight(&Src, Dst1);
     76     }
     77 
     78     const MachineBasicBlock &Src;
     79     const MachineBranchProbabilityInfo &Prob;
     80   };
     81 
     82   class RegDefsUses {
     83   public:
     84     RegDefsUses(TargetMachine &TM);
     85     void init(const MachineInstr &MI);
     86 
     87     /// This function sets all caller-saved registers in Defs.
     88     void setCallerSaved(const MachineInstr &MI);
     89 
     90     /// This function sets all unallocatable registers in Defs.
     91     void setUnallocatableRegs(const MachineFunction &MF);
     92 
     93     /// Set bits in Uses corresponding to MBB's live-out registers except for
     94     /// the registers that are live-in to SuccBB.
     95     void addLiveOut(const MachineBasicBlock &MBB,
     96                     const MachineBasicBlock &SuccBB);
     97 
     98     bool update(const MachineInstr &MI, unsigned Begin, unsigned End);
     99 
    100   private:
    101     bool checkRegDefsUses(BitVector &NewDefs, BitVector &NewUses, unsigned Reg,
    102                           bool IsDef) const;
    103 
    104     /// Returns true if Reg or its alias is in RegSet.
    105     bool isRegInSet(const BitVector &RegSet, unsigned Reg) const;
    106 
    107     const TargetRegisterInfo &TRI;
    108     BitVector Defs, Uses;
    109   };
    110 
    111   /// Base class for inspecting loads and stores.
    112   class InspectMemInstr {
    113   public:
    114     InspectMemInstr(bool ForbidMemInstr_)
    115       : OrigSeenLoad(false), OrigSeenStore(false), SeenLoad(false),
    116         SeenStore(false), ForbidMemInstr(ForbidMemInstr_) {}
    117 
    118     /// Return true if MI cannot be moved to delay slot.
    119     bool hasHazard(const MachineInstr &MI);
    120 
    121     virtual ~InspectMemInstr() {}
    122 
    123   protected:
    124     /// Flags indicating whether loads or stores have been seen.
    125     bool OrigSeenLoad, OrigSeenStore, SeenLoad, SeenStore;
    126 
    127     /// Memory instructions are not allowed to move to delay slot if this flag
    128     /// is true.
    129     bool ForbidMemInstr;
    130 
    131   private:
    132     virtual bool hasHazard_(const MachineInstr &MI) = 0;
    133   };
    134 
    135   /// This subclass rejects any memory instructions.
    136   class NoMemInstr : public InspectMemInstr {
    137   public:
    138     NoMemInstr() : InspectMemInstr(true) {}
    139   private:
    140     virtual bool hasHazard_(const MachineInstr &MI) { return true; }
    141   };
    142 
    143   /// This subclass accepts loads from stacks and constant loads.
    144   class LoadFromStackOrConst : public InspectMemInstr {
    145   public:
    146     LoadFromStackOrConst() : InspectMemInstr(false) {}
    147   private:
    148     virtual bool hasHazard_(const MachineInstr &MI);
    149   };
    150 
    151   /// This subclass uses memory dependence information to determine whether a
    152   /// memory instruction can be moved to a delay slot.
    153   class MemDefsUses : public InspectMemInstr {
    154   public:
    155     MemDefsUses(const MachineFrameInfo *MFI);
    156 
    157   private:
    158     virtual bool hasHazard_(const MachineInstr &MI);
    159 
    160     /// Update Defs and Uses. Return true if there exist dependences that
    161     /// disqualify the delay slot candidate between V and values in Uses and
    162     /// Defs.
    163     bool updateDefsUses(const Value *V, bool MayStore);
    164 
    165     /// Get the list of underlying objects of MI's memory operand.
    166     bool getUnderlyingObjects(const MachineInstr &MI,
    167                               SmallVectorImpl<const Value *> &Objects) const;
    168 
    169     const MachineFrameInfo *MFI;
    170     SmallPtrSet<const Value*, 4> Uses, Defs;
    171 
    172     /// Flags indicating whether loads or stores with no underlying objects have
    173     /// been seen.
    174     bool SeenNoObjLoad, SeenNoObjStore;
    175   };
    176 
    177   class Filler : public MachineFunctionPass {
    178   public:
    179     Filler(TargetMachine &tm)
    180       : MachineFunctionPass(ID), TM(tm) { }
    181 
    182     virtual const char *getPassName() const {
    183       return "Mips Delay Slot Filler";
    184     }
    185 
    186     bool runOnMachineFunction(MachineFunction &F) {
    187       bool Changed = false;
    188       for (MachineFunction::iterator FI = F.begin(), FE = F.end();
    189            FI != FE; ++FI)
    190         Changed |= runOnMachineBasicBlock(*FI);
    191       return Changed;
    192     }
    193 
    194     void getAnalysisUsage(AnalysisUsage &AU) const {
    195       AU.addRequired<MachineBranchProbabilityInfo>();
    196       MachineFunctionPass::getAnalysisUsage(AU);
    197     }
    198 
    199   private:
    200     bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
    201 
    202     /// This function checks if it is valid to move Candidate to the delay slot
    203     /// and returns true if it isn't. It also updates memory and register
    204     /// dependence information.
    205     bool delayHasHazard(const MachineInstr &Candidate, RegDefsUses &RegDU,
    206                         InspectMemInstr &IM) const;
    207 
    208     /// This function searches range [Begin, End) for an instruction that can be
    209     /// moved to the delay slot. Returns true on success.
    210     template<typename IterTy>
    211     bool searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
    212                      RegDefsUses &RegDU, InspectMemInstr &IM,
    213                      IterTy &Filler) const;
    214 
    215     /// This function searches in the backward direction for an instruction that
    216     /// can be moved to the delay slot. Returns true on success.
    217     bool searchBackward(MachineBasicBlock &MBB, Iter Slot) const;
    218 
    219     /// This function searches MBB in the forward direction for an instruction
    220     /// that can be moved to the delay slot. Returns true on success.
    221     bool searchForward(MachineBasicBlock &MBB, Iter Slot) const;
    222 
    223     /// This function searches one of MBB's successor blocks for an instruction
    224     /// that can be moved to the delay slot and inserts clones of the
    225     /// instruction into the successor's predecessor blocks.
    226     bool searchSuccBBs(MachineBasicBlock &MBB, Iter Slot) const;
    227 
    228     /// Pick a successor block of MBB. Return NULL if MBB doesn't have a
    229     /// successor block that is not a landing pad.
    230     MachineBasicBlock *selectSuccBB(MachineBasicBlock &B) const;
    231 
    232     /// This function analyzes MBB and returns an instruction with an unoccupied
    233     /// slot that branches to Dst.
    234     std::pair<MipsInstrInfo::BranchType, MachineInstr *>
    235     getBranch(MachineBasicBlock &MBB, const MachineBasicBlock &Dst) const;
    236 
    237     /// Examine Pred and see if it is possible to insert an instruction into
    238     /// one of its branches delay slot or its end.
    239     bool examinePred(MachineBasicBlock &Pred, const MachineBasicBlock &Succ,
    240                      RegDefsUses &RegDU, bool &HasMultipleSuccs,
    241                      BB2BrMap &BrMap) const;
    242 
    243     bool terminateSearch(const MachineInstr &Candidate) const;
    244 
    245     TargetMachine &TM;
    246 
    247     static char ID;
    248   };
    249   char Filler::ID = 0;
    250 } // end of anonymous namespace
    251 
    252 static bool hasUnoccupiedSlot(const MachineInstr *MI) {
    253   return MI->hasDelaySlot() && !MI->isBundledWithSucc();
    254 }
    255 
    256 /// This function inserts clones of Filler into predecessor blocks.
    257 static void insertDelayFiller(Iter Filler, const BB2BrMap &BrMap) {
    258   MachineFunction *MF = Filler->getParent()->getParent();
    259 
    260   for (BB2BrMap::const_iterator I = BrMap.begin(); I != BrMap.end(); ++I) {
    261     if (I->second) {
    262       MIBundleBuilder(I->second).append(MF->CloneMachineInstr(&*Filler));
    263       ++UsefulSlots;
    264     } else {
    265       I->first->insert(I->first->end(), MF->CloneMachineInstr(&*Filler));
    266     }
    267   }
    268 }
    269 
    270 /// This function adds registers Filler defines to MBB's live-in register list.
    271 static void addLiveInRegs(Iter Filler, MachineBasicBlock &MBB) {
    272   for (unsigned I = 0, E = Filler->getNumOperands(); I != E; ++I) {
    273     const MachineOperand &MO = Filler->getOperand(I);
    274     unsigned R;
    275 
    276     if (!MO.isReg() || !MO.isDef() || !(R = MO.getReg()))
    277       continue;
    278 
    279 #ifndef NDEBUG
    280     const MachineFunction &MF = *MBB.getParent();
    281     assert(MF.getTarget().getRegisterInfo()->getAllocatableSet(MF).test(R) &&
    282            "Shouldn't move an instruction with unallocatable registers across "
    283            "basic block boundaries.");
    284 #endif
    285 
    286     if (!MBB.isLiveIn(R))
    287       MBB.addLiveIn(R);
    288   }
    289 }
    290 
    291 RegDefsUses::RegDefsUses(TargetMachine &TM)
    292   : TRI(*TM.getRegisterInfo()), Defs(TRI.getNumRegs(), false),
    293     Uses(TRI.getNumRegs(), false) {}
    294 
    295 void RegDefsUses::init(const MachineInstr &MI) {
    296   // Add all register operands which are explicit and non-variadic.
    297   update(MI, 0, MI.getDesc().getNumOperands());
    298 
    299   // If MI is a call, add RA to Defs to prevent users of RA from going into
    300   // delay slot.
    301   if (MI.isCall())
    302     Defs.set(Mips::RA);
    303 
    304   // Add all implicit register operands of branch instructions except
    305   // register AT.
    306   if (MI.isBranch()) {
    307     update(MI, MI.getDesc().getNumOperands(), MI.getNumOperands());
    308     Defs.reset(Mips::AT);
    309   }
    310 }
    311 
    312 void RegDefsUses::setCallerSaved(const MachineInstr &MI) {
    313   assert(MI.isCall());
    314 
    315   // If MI is a call, add all caller-saved registers to Defs.
    316   BitVector CallerSavedRegs(TRI.getNumRegs(), true);
    317 
    318   CallerSavedRegs.reset(Mips::ZERO);
    319   CallerSavedRegs.reset(Mips::ZERO_64);
    320 
    321   for (const MCPhysReg *R = TRI.getCalleeSavedRegs(); *R; ++R)
    322     for (MCRegAliasIterator AI(*R, &TRI, true); AI.isValid(); ++AI)
    323       CallerSavedRegs.reset(*AI);
    324 
    325   Defs |= CallerSavedRegs;
    326 }
    327 
    328 void RegDefsUses::setUnallocatableRegs(const MachineFunction &MF) {
    329   BitVector AllocSet = TRI.getAllocatableSet(MF);
    330 
    331   for (int R = AllocSet.find_first(); R != -1; R = AllocSet.find_next(R))
    332     for (MCRegAliasIterator AI(R, &TRI, false); AI.isValid(); ++AI)
    333       AllocSet.set(*AI);
    334 
    335   AllocSet.set(Mips::ZERO);
    336   AllocSet.set(Mips::ZERO_64);
    337 
    338   Defs |= AllocSet.flip();
    339 }
    340 
    341 void RegDefsUses::addLiveOut(const MachineBasicBlock &MBB,
    342                              const MachineBasicBlock &SuccBB) {
    343   for (MachineBasicBlock::const_succ_iterator SI = MBB.succ_begin(),
    344        SE = MBB.succ_end(); SI != SE; ++SI)
    345     if (*SI != &SuccBB)
    346       for (MachineBasicBlock::livein_iterator LI = (*SI)->livein_begin(),
    347            LE = (*SI)->livein_end(); LI != LE; ++LI)
    348         Uses.set(*LI);
    349 }
    350 
    351 bool RegDefsUses::update(const MachineInstr &MI, unsigned Begin, unsigned End) {
    352   BitVector NewDefs(TRI.getNumRegs()), NewUses(TRI.getNumRegs());
    353   bool HasHazard = false;
    354 
    355   for (unsigned I = Begin; I != End; ++I) {
    356     const MachineOperand &MO = MI.getOperand(I);
    357 
    358     if (MO.isReg() && MO.getReg())
    359       HasHazard |= checkRegDefsUses(NewDefs, NewUses, MO.getReg(), MO.isDef());
    360   }
    361 
    362   Defs |= NewDefs;
    363   Uses |= NewUses;
    364 
    365   return HasHazard;
    366 }
    367 
    368 bool RegDefsUses::checkRegDefsUses(BitVector &NewDefs, BitVector &NewUses,
    369                                    unsigned Reg, bool IsDef) const {
    370   if (IsDef) {
    371     NewDefs.set(Reg);
    372     // check whether Reg has already been defined or used.
    373     return (isRegInSet(Defs, Reg) || isRegInSet(Uses, Reg));
    374   }
    375 
    376   NewUses.set(Reg);
    377   // check whether Reg has already been defined.
    378   return isRegInSet(Defs, Reg);
    379 }
    380 
    381 bool RegDefsUses::isRegInSet(const BitVector &RegSet, unsigned Reg) const {
    382   // Check Reg and all aliased Registers.
    383   for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI)
    384     if (RegSet.test(*AI))
    385       return true;
    386   return false;
    387 }
    388 
    389 bool InspectMemInstr::hasHazard(const MachineInstr &MI) {
    390   if (!MI.mayStore() && !MI.mayLoad())
    391     return false;
    392 
    393   if (ForbidMemInstr)
    394     return true;
    395 
    396   OrigSeenLoad = SeenLoad;
    397   OrigSeenStore = SeenStore;
    398   SeenLoad |= MI.mayLoad();
    399   SeenStore |= MI.mayStore();
    400 
    401   // If MI is an ordered or volatile memory reference, disallow moving
    402   // subsequent loads and stores to delay slot.
    403   if (MI.hasOrderedMemoryRef() && (OrigSeenLoad || OrigSeenStore)) {
    404     ForbidMemInstr = true;
    405     return true;
    406   }
    407 
    408   return hasHazard_(MI);
    409 }
    410 
    411 bool LoadFromStackOrConst::hasHazard_(const MachineInstr &MI) {
    412   if (MI.mayStore())
    413     return true;
    414 
    415   if (!MI.hasOneMemOperand() || !(*MI.memoperands_begin())->getValue())
    416     return true;
    417 
    418   const Value *V = (*MI.memoperands_begin())->getValue();
    419 
    420   if (isa<FixedStackPseudoSourceValue>(V))
    421     return false;
    422 
    423   if (const PseudoSourceValue *PSV = dyn_cast<const PseudoSourceValue>(V))
    424     return !PSV->PseudoSourceValue::isConstant(0) &&
    425       (V != PseudoSourceValue::getStack());
    426 
    427   return true;
    428 }
    429 
    430 MemDefsUses::MemDefsUses(const MachineFrameInfo *MFI_)
    431   : InspectMemInstr(false), MFI(MFI_), SeenNoObjLoad(false),
    432     SeenNoObjStore(false) {}
    433 
    434 bool MemDefsUses::hasHazard_(const MachineInstr &MI) {
    435   bool HasHazard = false;
    436   SmallVector<const Value *, 4> Objs;
    437 
    438   // Check underlying object list.
    439   if (getUnderlyingObjects(MI, Objs)) {
    440     for (SmallVectorImpl<const Value *>::const_iterator I = Objs.begin();
    441          I != Objs.end(); ++I)
    442       HasHazard |= updateDefsUses(*I, MI.mayStore());
    443 
    444     return HasHazard;
    445   }
    446 
    447   // No underlying objects found.
    448   HasHazard = MI.mayStore() && (OrigSeenLoad || OrigSeenStore);
    449   HasHazard |= MI.mayLoad() || OrigSeenStore;
    450 
    451   SeenNoObjLoad |= MI.mayLoad();
    452   SeenNoObjStore |= MI.mayStore();
    453 
    454   return HasHazard;
    455 }
    456 
    457 bool MemDefsUses::updateDefsUses(const Value *V, bool MayStore) {
    458   if (MayStore)
    459     return !Defs.insert(V) || Uses.count(V) || SeenNoObjStore || SeenNoObjLoad;
    460 
    461   Uses.insert(V);
    462   return Defs.count(V) || SeenNoObjStore;
    463 }
    464 
    465 bool MemDefsUses::
    466 getUnderlyingObjects(const MachineInstr &MI,
    467                      SmallVectorImpl<const Value *> &Objects) const {
    468   if (!MI.hasOneMemOperand() || !(*MI.memoperands_begin())->getValue())
    469     return false;
    470 
    471   const Value *V = (*MI.memoperands_begin())->getValue();
    472 
    473   SmallVector<Value *, 4> Objs;
    474   GetUnderlyingObjects(const_cast<Value *>(V), Objs);
    475 
    476   for (SmallVectorImpl<Value *>::iterator I = Objs.begin(), E = Objs.end();
    477        I != E; ++I) {
    478     if (const PseudoSourceValue *PSV = dyn_cast<PseudoSourceValue>(*I)) {
    479       if (PSV->isAliased(MFI))
    480         return false;
    481     } else if (!isIdentifiedObject(V))
    482       return false;
    483 
    484     Objects.push_back(*I);
    485   }
    486 
    487   return true;
    488 }
    489 
    490 /// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
    491 /// We assume there is only one delay slot per delayed instruction.
    492 bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
    493   bool Changed = false;
    494 
    495   for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
    496     if (!hasUnoccupiedSlot(&*I))
    497       continue;
    498 
    499     ++FilledSlots;
    500     Changed = true;
    501 
    502     // Delay slot filling is disabled at -O0.
    503     if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None)) {
    504       if (searchBackward(MBB, I))
    505         continue;
    506 
    507       if (I->isTerminator()) {
    508         if (searchSuccBBs(MBB, I))
    509           continue;
    510       } else if (searchForward(MBB, I)) {
    511         continue;
    512       }
    513     }
    514 
    515     // Bundle the NOP to the instruction with the delay slot.
    516     const MipsInstrInfo *TII =
    517       static_cast<const MipsInstrInfo*>(TM.getInstrInfo());
    518     BuildMI(MBB, llvm::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
    519     MIBundleBuilder(MBB, I, llvm::next(llvm::next(I)));
    520   }
    521 
    522   return Changed;
    523 }
    524 
    525 /// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
    526 /// slots in Mips MachineFunctions
    527 FunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
    528   return new Filler(tm);
    529 }
    530 
    531 template<typename IterTy>
    532 bool Filler::searchRange(MachineBasicBlock &MBB, IterTy Begin, IterTy End,
    533                          RegDefsUses &RegDU, InspectMemInstr& IM,
    534                          IterTy &Filler) const {
    535   for (IterTy I = Begin; I != End; ++I) {
    536     // skip debug value
    537     if (I->isDebugValue())
    538       continue;
    539 
    540     if (terminateSearch(*I))
    541       break;
    542 
    543     assert((!I->isCall() && !I->isReturn() && !I->isBranch()) &&
    544            "Cannot put calls, returns or branches in delay slot.");
    545 
    546     if (delayHasHazard(*I, RegDU, IM))
    547       continue;
    548 
    549     Filler = I;
    550     return true;
    551   }
    552 
    553   return false;
    554 }
    555 
    556 bool Filler::searchBackward(MachineBasicBlock &MBB, Iter Slot) const {
    557   if (DisableBackwardSearch)
    558     return false;
    559 
    560   RegDefsUses RegDU(TM);
    561   MemDefsUses MemDU(MBB.getParent()->getFrameInfo());
    562   ReverseIter Filler;
    563 
    564   RegDU.init(*Slot);
    565 
    566   if (searchRange(MBB, ReverseIter(Slot), MBB.rend(), RegDU, MemDU, Filler)) {
    567     MBB.splice(llvm::next(Slot), &MBB, llvm::next(Filler).base());
    568     MIBundleBuilder(MBB, Slot, llvm::next(llvm::next(Slot)));
    569     ++UsefulSlots;
    570     return true;
    571   }
    572 
    573   return false;
    574 }
    575 
    576 bool Filler::searchForward(MachineBasicBlock &MBB, Iter Slot) const {
    577   // Can handle only calls.
    578   if (DisableForwardSearch || !Slot->isCall())
    579     return false;
    580 
    581   RegDefsUses RegDU(TM);
    582   NoMemInstr NM;
    583   Iter Filler;
    584 
    585   RegDU.setCallerSaved(*Slot);
    586 
    587   if (searchRange(MBB, llvm::next(Slot), MBB.end(), RegDU, NM, Filler)) {
    588     MBB.splice(llvm::next(Slot), &MBB, Filler);
    589     MIBundleBuilder(MBB, Slot, llvm::next(llvm::next(Slot)));
    590     ++UsefulSlots;
    591     return true;
    592   }
    593 
    594   return false;
    595 }
    596 
    597 bool Filler::searchSuccBBs(MachineBasicBlock &MBB, Iter Slot) const {
    598   if (DisableSuccBBSearch)
    599     return false;
    600 
    601   MachineBasicBlock *SuccBB = selectSuccBB(MBB);
    602 
    603   if (!SuccBB)
    604     return false;
    605 
    606   RegDefsUses RegDU(TM);
    607   bool HasMultipleSuccs = false;
    608   BB2BrMap BrMap;
    609   OwningPtr<InspectMemInstr> IM;
    610   Iter Filler;
    611 
    612   // Iterate over SuccBB's predecessor list.
    613   for (MachineBasicBlock::pred_iterator PI = SuccBB->pred_begin(),
    614        PE = SuccBB->pred_end(); PI != PE; ++PI)
    615     if (!examinePred(**PI, *SuccBB, RegDU, HasMultipleSuccs, BrMap))
    616       return false;
    617 
    618   // Do not allow moving instructions which have unallocatable register operands
    619   // across basic block boundaries.
    620   RegDU.setUnallocatableRegs(*MBB.getParent());
    621 
    622   // Only allow moving loads from stack or constants if any of the SuccBB's
    623   // predecessors have multiple successors.
    624   if (HasMultipleSuccs) {
    625     IM.reset(new LoadFromStackOrConst());
    626   } else {
    627     const MachineFrameInfo *MFI = MBB.getParent()->getFrameInfo();
    628     IM.reset(new MemDefsUses(MFI));
    629   }
    630 
    631   if (!searchRange(MBB, SuccBB->begin(), SuccBB->end(), RegDU, *IM, Filler))
    632     return false;
    633 
    634   insertDelayFiller(Filler, BrMap);
    635   addLiveInRegs(Filler, *SuccBB);
    636   Filler->eraseFromParent();
    637 
    638   return true;
    639 }
    640 
    641 MachineBasicBlock *Filler::selectSuccBB(MachineBasicBlock &B) const {
    642   if (B.succ_empty())
    643     return NULL;
    644 
    645   // Select the successor with the larget edge weight.
    646   CmpWeight Cmp(B, getAnalysis<MachineBranchProbabilityInfo>());
    647   MachineBasicBlock *S = *std::max_element(B.succ_begin(), B.succ_end(), Cmp);
    648   return S->isLandingPad() ? NULL : S;
    649 }
    650 
    651 std::pair<MipsInstrInfo::BranchType, MachineInstr *>
    652 Filler::getBranch(MachineBasicBlock &MBB, const MachineBasicBlock &Dst) const {
    653   const MipsInstrInfo *TII =
    654     static_cast<const MipsInstrInfo*>(TM.getInstrInfo());
    655   MachineBasicBlock *TrueBB = 0, *FalseBB = 0;
    656   SmallVector<MachineInstr*, 2> BranchInstrs;
    657   SmallVector<MachineOperand, 2> Cond;
    658 
    659   MipsInstrInfo::BranchType R =
    660     TII->AnalyzeBranch(MBB, TrueBB, FalseBB, Cond, false, BranchInstrs);
    661 
    662   if ((R == MipsInstrInfo::BT_None) || (R == MipsInstrInfo::BT_NoBranch))
    663     return std::make_pair(R, (MachineInstr*)NULL);
    664 
    665   if (R != MipsInstrInfo::BT_CondUncond) {
    666     if (!hasUnoccupiedSlot(BranchInstrs[0]))
    667       return std::make_pair(MipsInstrInfo::BT_None, (MachineInstr*)NULL);
    668 
    669     assert(((R != MipsInstrInfo::BT_Uncond) || (TrueBB == &Dst)));
    670 
    671     return std::make_pair(R, BranchInstrs[0]);
    672   }
    673 
    674   assert((TrueBB == &Dst) || (FalseBB == &Dst));
    675 
    676   // Examine the conditional branch. See if its slot is occupied.
    677   if (hasUnoccupiedSlot(BranchInstrs[0]))
    678     return std::make_pair(MipsInstrInfo::BT_Cond, BranchInstrs[0]);
    679 
    680   // If that fails, try the unconditional branch.
    681   if (hasUnoccupiedSlot(BranchInstrs[1]) && (FalseBB == &Dst))
    682     return std::make_pair(MipsInstrInfo::BT_Uncond, BranchInstrs[1]);
    683 
    684   return std::make_pair(MipsInstrInfo::BT_None, (MachineInstr*)NULL);
    685 }
    686 
    687 bool Filler::examinePred(MachineBasicBlock &Pred, const MachineBasicBlock &Succ,
    688                          RegDefsUses &RegDU, bool &HasMultipleSuccs,
    689                          BB2BrMap &BrMap) const {
    690   std::pair<MipsInstrInfo::BranchType, MachineInstr *> P =
    691     getBranch(Pred, Succ);
    692 
    693   // Return if either getBranch wasn't able to analyze the branches or there
    694   // were no branches with unoccupied slots.
    695   if (P.first == MipsInstrInfo::BT_None)
    696     return false;
    697 
    698   if ((P.first != MipsInstrInfo::BT_Uncond) &&
    699       (P.first != MipsInstrInfo::BT_NoBranch)) {
    700     HasMultipleSuccs = true;
    701     RegDU.addLiveOut(Pred, Succ);
    702   }
    703 
    704   BrMap[&Pred] = P.second;
    705   return true;
    706 }
    707 
    708 bool Filler::delayHasHazard(const MachineInstr &Candidate, RegDefsUses &RegDU,
    709                             InspectMemInstr &IM) const {
    710   bool HasHazard = (Candidate.isImplicitDef() || Candidate.isKill());
    711 
    712   HasHazard |= IM.hasHazard(Candidate);
    713   HasHazard |= RegDU.update(Candidate, 0, Candidate.getNumOperands());
    714 
    715   return HasHazard;
    716 }
    717 
    718 bool Filler::terminateSearch(const MachineInstr &Candidate) const {
    719   return (Candidate.isTerminator() || Candidate.isCall() ||
    720           Candidate.isLabel() || Candidate.isInlineAsm() ||
    721           Candidate.hasUnmodeledSideEffects());
    722 }
    723