DelaySlotFiller.cpp revision f152fe8d487c46873bbdd4abab43200f783e978b
19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//===-- DelaySlotFiller.cpp - SPARC delay slot filler ---------------------===//
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                     The LLVM Compiler Infrastructure
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// This file is distributed under the University of Illinois Open Source
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// License. See LICENSE.TXT for details.
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//===----------------------------------------------------------------------===//
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// This is a simple local pass that attempts to fill delay slots with useful
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// instructions. If no instructions can be moved into the delay slot, then a
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// NOP is placed.
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//===----------------------------------------------------------------------===//
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#define DEBUG_TYPE "delay-slot-filler"
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "Sparc.h"
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/CodeGen/MachineFunctionPass.h"
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/CodeGen/MachineInstrBuilder.h"
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/Support/CommandLine.h"
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/Target/TargetMachine.h"
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/Target/TargetInstrInfo.h"
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/Target/TargetRegisterInfo.h"
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/ADT/SmallSet.h"
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson#include "llvm/ADT/Statistic.h"
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonusing namespace llvm;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse WilsonSTATISTIC(FilledSlots, "Number of delay slots filled");
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonstatic cl::opt<bool> DisableDelaySlotFiller(
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  "disable-sparc-delay-filler",
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  cl::init(false),
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  cl::desc("Disable the Sparc delay slot filler."),
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  cl::Hidden);
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonnamespace {
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  struct Filler : public MachineFunctionPass {
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /// Target machine description which we query for reg. names, data
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /// layout, etc.
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ///
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    TargetMachine &TM;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    const TargetInstrInfo *TII;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static char ID;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Filler(TargetMachine &tm)
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      : MachineFunctionPass(ID), TM(tm), TII(tm.getInstrInfo()) { }
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    virtual const char *getPassName() const {
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return "SPARC Delay Slot Filler";
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    bool runOnMachineFunction(MachineFunction &F) {
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      bool Changed = false;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (MachineFunction::iterator FI = F.begin(), FE = F.end();
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           FI != FE; ++FI)
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Changed |= runOnMachineBasicBlock(*FI);
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return Changed;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    bool isDelayFiller(MachineBasicBlock &MBB,
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                       MachineBasicBlock::iterator candidate);
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void insertCallUses(MachineBasicBlock::iterator MI,
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        SmallSet<unsigned, 32>& RegUses);
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void insertDefsUses(MachineBasicBlock::iterator MI,
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        SmallSet<unsigned, 32>& RegDefs,
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        SmallSet<unsigned, 32>& RegUses);
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    bool IsRegInSet(SmallSet<unsigned, 32>& RegSet,
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    unsigned Reg);
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    bool delayHasHazard(MachineBasicBlock::iterator candidate,
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        bool &sawLoad, bool &sawStore,
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        SmallSet<unsigned, 32> &RegDefs,
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        SmallSet<unsigned, 32> &RegUses);
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    MachineBasicBlock::iterator
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    findDelayInstr(MachineBasicBlock &MBB, MachineBasicBlock::iterator slot);
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    bool needsUnimp(MachineBasicBlock::iterator I, unsigned &StructSize);
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  };
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  char Filler::ID = 0;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} // end of anonymous namespace
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/// createSparcDelaySlotFillerPass - Returns a pass that fills in delay
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/// slots in Sparc MachineFunctions
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson///
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse WilsonFunctionPass *llvm::createSparcDelaySlotFillerPass(TargetMachine &tm) {
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  return new Filler(tm);
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/// We assume there is only one delay slot per delayed instruction.
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson///
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonbool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  bool Changed = false;
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I)
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (I->hasDelaySlot()) {
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      MachineBasicBlock::iterator D = MBB.end();
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      MachineBasicBlock::iterator J = I;
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!DisableDelaySlotFiller)
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        D = findDelayInstr(MBB, I);
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ++FilledSlots;
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Changed = true;
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (D == MBB.end())
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        BuildMI(MBB, ++J, I->getDebugLoc(), TII->get(SP::NOP));
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        MBB.splice(++J, &MBB, D);
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      unsigned structSize = 0;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (needsUnimp(I, structSize)) {
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        MachineBasicBlock::iterator J = I;
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ++J; //skip the delay filler.
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        BuildMI(MBB, ++J, I->getDebugLoc(),
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                TII->get(SP::UNIMP)).addImm(structSize);
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  return Changed;
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse WilsonMachineBasicBlock::iterator
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse WilsonFiller::findDelayInstr(MachineBasicBlock &MBB,
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                       MachineBasicBlock::iterator slot)
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  SmallSet<unsigned, 32> RegDefs;
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  SmallSet<unsigned, 32> RegUses;
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  bool sawLoad = false;
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  bool sawStore = false;
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  MachineBasicBlock::iterator I = slot;
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  if (slot->getOpcode() == SP::RET)
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return MBB.end();
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  if (slot->getOpcode() == SP::RETL) {
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    --I;
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (I->getOpcode() != SP::RESTORErr)
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return MBB.end();
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //change retl to ret
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    slot->setDesc(TII->get(SP::RET));
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return I;
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //Call's delay filler can def some of call's uses.
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  if (slot->isCall())
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    insertCallUses(slot, RegUses);
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  else
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    insertDefsUses(slot, RegDefs, RegUses);
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  bool done = false;
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  while (!done) {
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    done = (I == MBB.begin());
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!done)
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      --I;
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // skip debug value
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (I->isDebugValue())
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      continue;
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (I->hasUnmodeledSideEffects()
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || I->isInlineAsm()
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || I->isLabel()
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || I->hasDelaySlot()
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        || isDelayFiller(MBB, I))
175      break;
176
177    if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) {
178      insertDefsUses(I, RegDefs, RegUses);
179      continue;
180    }
181
182    return I;
183  }
184  return MBB.end();
185}
186
187bool Filler::delayHasHazard(MachineBasicBlock::iterator candidate,
188                            bool &sawLoad,
189                            bool &sawStore,
190                            SmallSet<unsigned, 32> &RegDefs,
191                            SmallSet<unsigned, 32> &RegUses)
192{
193
194  if (candidate->isImplicitDef() || candidate->isKill())
195    return true;
196
197  if (candidate->mayLoad()) {
198    sawLoad = true;
199    if (sawStore)
200      return true;
201  }
202
203  if (candidate->mayStore()) {
204    if (sawStore)
205      return true;
206    sawStore = true;
207    if (sawLoad)
208      return true;
209  }
210
211  for (unsigned i = 0, e = candidate->getNumOperands(); i!= e; ++i) {
212    const MachineOperand &MO = candidate->getOperand(i);
213    if (!MO.isReg())
214      continue; // skip
215
216    unsigned Reg = MO.getReg();
217
218    if (MO.isDef()) {
219      //check whether Reg is defined or used before delay slot.
220      if (IsRegInSet(RegDefs, Reg) || IsRegInSet(RegUses, Reg))
221        return true;
222    }
223    if (MO.isUse()) {
224      //check whether Reg is defined before delay slot.
225      if (IsRegInSet(RegDefs, Reg))
226        return true;
227    }
228  }
229  return false;
230}
231
232
233void Filler::insertCallUses(MachineBasicBlock::iterator MI,
234                            SmallSet<unsigned, 32>& RegUses)
235{
236
237  switch(MI->getOpcode()) {
238  default: llvm_unreachable("Unknown opcode.");
239  case SP::CALL: break;
240  case SP::JMPLrr:
241  case SP::JMPLri:
242    assert(MI->getNumOperands() >= 2);
243    const MachineOperand &Reg = MI->getOperand(0);
244    assert(Reg.isReg() && "JMPL first operand is not a register.");
245    assert(Reg.isUse() && "JMPL first operand is not a use.");
246    RegUses.insert(Reg.getReg());
247
248    const MachineOperand &RegOrImm = MI->getOperand(1);
249    if (RegOrImm.isImm())
250        break;
251    assert(RegOrImm.isReg() && "JMPLrr second operand is not a register.");
252    assert(RegOrImm.isUse() && "JMPLrr second operand is not a use.");
253    RegUses.insert(RegOrImm.getReg());
254    break;
255  }
256}
257
258//Insert Defs and Uses of MI into the sets RegDefs and RegUses.
259void Filler::insertDefsUses(MachineBasicBlock::iterator MI,
260                            SmallSet<unsigned, 32>& RegDefs,
261                            SmallSet<unsigned, 32>& RegUses)
262{
263  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
264    const MachineOperand &MO = MI->getOperand(i);
265    if (!MO.isReg())
266      continue;
267
268    unsigned Reg = MO.getReg();
269    if (Reg == 0)
270      continue;
271    if (MO.isDef())
272      RegDefs.insert(Reg);
273    if (MO.isUse())
274      RegUses.insert(Reg);
275
276  }
277}
278
279//returns true if the Reg or its alias is in the RegSet.
280bool Filler::IsRegInSet(SmallSet<unsigned, 32>& RegSet, unsigned Reg)
281{
282  // Check Reg and all aliased Registers.
283  for (MCRegAliasIterator AI(Reg, TM.getRegisterInfo(), true);
284       AI.isValid(); ++AI)
285    if (RegSet.count(*AI))
286      return true;
287  return false;
288}
289
290// return true if the candidate is a delay filler.
291bool Filler::isDelayFiller(MachineBasicBlock &MBB,
292                           MachineBasicBlock::iterator candidate)
293{
294  if (candidate == MBB.begin())
295    return false;
296  if (candidate->getOpcode() == SP::UNIMP)
297    return true;
298  --candidate;
299  return candidate->hasDelaySlot();
300}
301
302bool Filler::needsUnimp(MachineBasicBlock::iterator I, unsigned &StructSize)
303{
304  if (!I->isCall())
305    return false;
306
307  unsigned structSizeOpNum = 0;
308  switch (I->getOpcode()) {
309  default: llvm_unreachable("Unknown call opcode.");
310  case SP::CALL: structSizeOpNum = 1; break;
311  case SP::JMPLrr:
312  case SP::JMPLri: structSizeOpNum = 2; break;
313  }
314
315  const MachineOperand &MO = I->getOperand(structSizeOpNum);
316  if (!MO.isImm())
317    return false;
318  StructSize = MO.getImm();
319  return true;
320}
321