MipsDelaySlotFiller.cpp revision 53120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31d
19684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//===-- DelaySlotFiller.cpp - Mips delay slot filler ---------------------===//
29684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//
39684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
49684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
79684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//
84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
99684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//
10a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka// Simple pass to fills delay slots with useful instructions.
119684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes//
124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
139684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
149684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#define DEBUG_TYPE "delay-slot-filler"
159684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
169684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "Mips.h"
179684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "MipsTargetMachine.h"
189684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFunctionPass.h"
199684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/CodeGen/MachineInstrBuilder.h"
20a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka#include "llvm/Support/CommandLine.h"
21a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka#include "llvm/Target/TargetMachine.h"
229684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/Target/TargetInstrInfo.h"
23a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka#include "llvm/Target/TargetRegisterInfo.h"
24a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka#include "llvm/ADT/SmallSet.h"
259684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/ADT/Statistic.h"
269684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
279684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopesusing namespace llvm;
289684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
299684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso LopesSTATISTIC(FilledSlots, "Number of delay slots filled");
3098f4d4d2db66375bedb461a9f6f9092a3c6703b2Akira HatanakaSTATISTIC(UsefulSlots, "Number of delay slots filled with instructions that"
3198f4d4d2db66375bedb461a9f6f9092a3c6703b2Akira Hatanaka                       "are not NOP.");
329684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
33a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanakastatic cl::opt<bool> EnableDelaySlotFiller(
34a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  "enable-mips-delay-filler",
35a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  cl::init(false),
366585b51821847df582b568a63298c506cd26c3a4Akira Hatanaka  cl::desc("Fill the Mips delay slots useful instructions."),
37a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  cl::Hidden);
38a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
399684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopesnamespace {
409684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  struct Filler : public MachineFunctionPass {
419684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
429684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    TargetMachine &TM;
439684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    const TargetInstrInfo *TII;
4453120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka    MachineBasicBlock::iterator LastFiller;
459684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
469684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    static char ID;
4790c595425bdc47563714d6ed13f6e9151552ceaeBruno Cardoso Lopes    Filler(TargetMachine &tm)
4890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      : MachineFunctionPass(ID), TM(tm), TII(tm.getInstrInfo()) { }
499684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
509684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    virtual const char *getPassName() const {
519684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      return "Mips Delay Slot Filler";
529684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    }
539684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
549684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
559684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    bool runOnMachineFunction(MachineFunction &F) {
569684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      bool Changed = false;
579684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      for (MachineFunction::iterator FI = F.begin(), FE = F.end();
589684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes           FI != FE; ++FI)
599684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes        Changed |= runOnMachineBasicBlock(*FI);
609684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      return Changed;
619684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    }
629684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
63a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    bool isDelayFiller(MachineBasicBlock &MBB,
64a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                       MachineBasicBlock::iterator candidate);
65a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
66a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    void insertCallUses(MachineBasicBlock::iterator MI,
67a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32>& RegDefs,
68a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32>& RegUses);
69a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
70a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    void insertDefsUses(MachineBasicBlock::iterator MI,
71a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32>& RegDefs,
72a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32>& RegUses);
73a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
74a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    bool IsRegInSet(SmallSet<unsigned, 32>& RegSet,
75a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                    unsigned Reg);
76a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
77a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    bool delayHasHazard(MachineBasicBlock::iterator candidate,
78a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        bool &sawLoad, bool &sawStore,
79a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32> &RegDefs,
80a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32> &RegUses);
81a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
826f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    bool
836f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    findDelayInstr(MachineBasicBlock &MBB, MachineBasicBlock::iterator slot,
846f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka                   MachineBasicBlock::iterator &Filler);
85a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
86a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
879684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  };
889684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  char Filler::ID = 0;
899684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes} // end of anonymous namespace
909684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
919684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
92a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka/// We assume there is only one delay slot per delayed instruction.
939684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopesbool Filler::
94a3defb07a075e936c435428d5adeedc5f12f5ab5Akira HatanakarunOnMachineBasicBlock(MachineBasicBlock &MBB) {
959684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  bool Changed = false;
9653120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka  LastFiller = MBB.end();
9753120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka
98a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I)
99a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (I->getDesc().hasDelaySlot()) {
1009684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      ++FilledSlots;
1019684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      Changed = true;
10290c595425bdc47563714d6ed13f6e9151552ceaeBruno Cardoso Lopes
1036f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka      MachineBasicBlock::iterator D;
1046f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
1056f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka      if (EnableDelaySlotFiller && findDelayInstr(MBB, I, D)) {
1066f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka        MBB.splice(llvm::next(I), &MBB, D);
1076f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka        ++UsefulSlots;
1086f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka      }
1096f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka      else
1106f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka        BuildMI(MBB, llvm::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
1116f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
11253120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka      // Record the filler instruction that filled the delay slot.
11353120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka      // The instruction after it will be visited in the next iteration.
11453120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka      LastFiller = ++I;
115a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka     }
1169684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  return Changed;
117a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1189684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes}
1199684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1209684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
1219684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// slots in Mips MachineFunctions
1229684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso LopesFunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
1239684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  return new Filler(tm);
1249684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes}
1259684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1266f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanakabool Filler::findDelayInstr(MachineBasicBlock &MBB,
1276f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka                            MachineBasicBlock::iterator slot,
1286f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka                            MachineBasicBlock::iterator &Filler) {
129a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  SmallSet<unsigned, 32> RegDefs;
130a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  SmallSet<unsigned, 32> RegUses;
131a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  bool sawLoad = false;
132a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  bool sawStore = false;
133a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
134a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  MachineBasicBlock::iterator I = slot;
135a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
136a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  // Call's delay filler can def some of call's uses.
137a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  if (slot->getDesc().isCall())
138a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    insertCallUses(slot, RegDefs, RegUses);
139a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  else
140a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    insertDefsUses(slot, RegDefs, RegUses);
141a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
142a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  bool done = false;
143a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
144a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  while (!done) {
145a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    done = (I == MBB.begin());
146a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
147a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (!done)
148a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      --I;
149a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
150a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    // skip debug value
151a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (I->isDebugValue())
152a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
153a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
154a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (I->hasUnmodeledSideEffects()
155a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        || I->isInlineAsm()
156a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        || I->isLabel()
15753120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka        || I == LastFiller
158a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        || I->getDesc().isPseudo()
159a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        //
160a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        // Should not allow:
161a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        // ERET, DERET or WAIT, PAUSE. Need to add these to instruction
162a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        // list. TBD.
163a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        )
164a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      break;
165a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
166a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) {
167a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      insertDefsUses(I, RegDefs, RegUses);
168a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
169a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    }
170a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1716f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    Filler = I;
1726f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    return true;
173a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
1746f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
1756f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka  return false;
176a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
177a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
178a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanakabool Filler::delayHasHazard(MachineBasicBlock::iterator candidate,
179a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            bool &sawLoad,
180a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            bool &sawStore,
181a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32> &RegDefs,
182a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32> &RegUses) {
183a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  if (candidate->isImplicitDef() || candidate->isKill())
184a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    return true;
185a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
186cfc3fb57372b2ebd580b966469121cba2029bae9Akira Hatanaka  // Loads or stores cannot be moved past a store to the delay slot
187cfc3fb57372b2ebd580b966469121cba2029bae9Akira Hatanaka  // and stores cannot be moved past a load.
188a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  if (candidate->getDesc().mayLoad()) {
189a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (sawStore)
190a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
191cfc3fb57372b2ebd580b966469121cba2029bae9Akira Hatanaka    sawLoad = true;
192a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
193a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
194a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  if (candidate->getDesc().mayStore()) {
195a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (sawStore)
196a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
197a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    sawStore = true;
198a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (sawLoad)
199a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
200a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
201a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
202a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  for (unsigned i = 0, e = candidate->getNumOperands(); i!= e; ++i) {
203a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    const MachineOperand &MO = candidate->getOperand(i);
204a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (!MO.isReg())
205a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue; // skip
206a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
207a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    unsigned Reg = MO.getReg();
208a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
209a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isDef()) {
210a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      // check whether Reg is defined or used before delay slot.
211a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      if (IsRegInSet(RegDefs, Reg) || IsRegInSet(RegUses, Reg))
212a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        return true;
213a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    }
214a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isUse()) {
215a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      // check whether Reg is defined before delay slot.
216a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      if (IsRegInSet(RegDefs, Reg))
217a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        return true;
218a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    }
219a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
220a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  return false;
221a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
222a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
223a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanakavoid Filler::insertCallUses(MachineBasicBlock::iterator MI,
224a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32>& RegDefs,
225a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32>& RegUses) {
226a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  switch(MI->getOpcode()) {
227a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  default: llvm_unreachable("Unknown opcode.");
228a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  case Mips::JAL:
229a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    RegDefs.insert(31);
230a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    break;
231a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  case Mips::JALR:
232a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    assert(MI->getNumOperands() >= 1);
233a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    const MachineOperand &Reg = MI->getOperand(0);
234a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    assert(Reg.isReg() && "JALR first operand is not a register.");
235a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    RegUses.insert(Reg.getReg());
236a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    RegDefs.insert(31);
237a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    break;
238a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
239a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
240a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
241a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka// Insert Defs and Uses of MI into the sets RegDefs and RegUses.
242a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanakavoid Filler::insertDefsUses(MachineBasicBlock::iterator MI,
243a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32>& RegDefs,
244a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32>& RegUses) {
245a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
246a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    const MachineOperand &MO = MI->getOperand(i);
247a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (!MO.isReg())
248a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
249a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
250a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    unsigned Reg = MO.getReg();
251a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (Reg == 0)
252a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
253a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isDef())
254a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      RegDefs.insert(Reg);
255a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isUse())
256a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      RegUses.insert(Reg);
257a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
258a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
259a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
260a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka//returns true if the Reg or its alias is in the RegSet.
261a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanakabool Filler::IsRegInSet(SmallSet<unsigned, 32>& RegSet, unsigned Reg) {
262a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  if (RegSet.count(Reg))
263a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    return true;
264a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  // check Aliased Registers
265a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  for (const unsigned *Alias = TM.getRegisterInfo()->getAliasSet(Reg);
266a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka       *Alias; ++Alias)
267a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (RegSet.count(*Alias))
268a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
269a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
270a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  return false;
271a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
272