1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- 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"
31176965f46b9f4ca7c83746355853601c05488564Akira Hatanaka                       " are not NOP.");
329684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
336522a9e04bcfa447299f4fd10ee9afffd5834a47Akira Hatanakastatic cl::opt<bool> DisableDelaySlotFiller(
346522a9e04bcfa447299f4fd10ee9afffd5834a47Akira Hatanaka  "disable-mips-delay-filler",
35a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  cl::init(false),
366522a9e04bcfa447299f4fd10ee9afffd5834a47Akira Hatanaka  cl::desc("Disable the delay slot filler, which attempts to fill the Mips"
376522a9e04bcfa447299f4fd10ee9afffd5834a47Akira Hatanaka           "delay slots with useful instructions."),
38a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  cl::Hidden);
39a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
40f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka// This option can be used to silence complaints by machine verifier passes.
41f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanakastatic cl::opt<bool> SkipDelaySlotFiller(
42f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  "skip-mips-delay-filler",
43f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  cl::init(false),
44f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  cl::desc("Skip MIPS' delay slot filling pass."),
45f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  cl::Hidden);
46f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka
479684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopesnamespace {
489684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  struct Filler : public MachineFunctionPass {
49158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    typedef MachineBasicBlock::instr_iterator InstrIter;
50158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    typedef MachineBasicBlock::reverse_instr_iterator ReverseInstrIter;
519684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
529684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    TargetMachine &TM;
539684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    const TargetInstrInfo *TII;
54158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    InstrIter LastFiller;
559684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
569684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    static char ID;
5790c595425bdc47563714d6ed13f6e9151552ceaeBruno Cardoso Lopes    Filler(TargetMachine &tm)
5890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      : MachineFunctionPass(ID), TM(tm), TII(tm.getInstrInfo()) { }
599684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
609684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    virtual const char *getPassName() const {
619684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      return "Mips Delay Slot Filler";
629684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    }
639684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
649684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
659684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    bool runOnMachineFunction(MachineFunction &F) {
66f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka      if (SkipDelaySlotFiller)
67f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka        return false;
68f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka
699684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      bool Changed = false;
709684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      for (MachineFunction::iterator FI = F.begin(), FE = F.end();
719684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes           FI != FE; ++FI)
729684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes        Changed |= runOnMachineBasicBlock(*FI);
739684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      return Changed;
749684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    }
759684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
76a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    bool isDelayFiller(MachineBasicBlock &MBB,
77158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka                       InstrIter candidate);
78a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
79158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    void insertCallUses(InstrIter MI,
80864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                        SmallSet<unsigned, 32> &RegDefs,
81864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                        SmallSet<unsigned, 32> &RegUses);
82a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
83158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    void insertDefsUses(InstrIter MI,
84864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                        SmallSet<unsigned, 32> &RegDefs,
85864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                        SmallSet<unsigned, 32> &RegUses);
86a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
87864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka    bool IsRegInSet(SmallSet<unsigned, 32> &RegSet,
88a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                    unsigned Reg);
89a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
90158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    bool delayHasHazard(InstrIter candidate,
91a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        bool &sawLoad, bool &sawStore,
92a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32> &RegDefs,
93a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                        SmallSet<unsigned, 32> &RegUses);
94a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
956f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    bool
96158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    findDelayInstr(MachineBasicBlock &MBB, InstrIter slot,
97158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka                   InstrIter &Filler);
98a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
99a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1009684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  };
1019684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  char Filler::ID = 0;
1029684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes} // end of anonymous namespace
1039684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1049684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
105a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka/// We assume there is only one delay slot per delayed instruction.
1069684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopesbool Filler::
107a3defb07a075e936c435428d5adeedc5f12f5ab5Akira HatanakarunOnMachineBasicBlock(MachineBasicBlock &MBB) {
1089684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  bool Changed = false;
109158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka  LastFiller = MBB.instr_end();
11053120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka
111158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka  for (InstrIter I = MBB.instr_begin(); I != MBB.instr_end(); ++I)
1125a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng    if (I->hasDelaySlot()) {
1139684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      ++FilledSlots;
1149684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      Changed = true;
11590c595425bdc47563714d6ed13f6e9151552ceaeBruno Cardoso Lopes
116158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka      InstrIter D;
1176f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
11816865d06128c266b5505cc21f5d086d18173408cAkira Hatanaka      // Delay slot filling is disabled at -O0.
11916865d06128c266b5505cc21f5d086d18173408cAkira Hatanaka      if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None) &&
12016865d06128c266b5505cc21f5d086d18173408cAkira Hatanaka          findDelayInstr(MBB, I, D)) {
1216f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka        MBB.splice(llvm::next(I), &MBB, D);
1226f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka        ++UsefulSlots;
123bb481f882093fb738d2bb15610c79364bada5496Jia Liu      } else
1246f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka        BuildMI(MBB, llvm::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
1256f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
12653120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka      // Record the filler instruction that filled the delay slot.
12753120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka      // The instruction after it will be visited in the next iteration.
12853120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka      LastFiller = ++I;
129158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka
130158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka      // Set InsideBundle bit so that the machine verifier doesn't expect this
131158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka      // instruction to be a terminator.
132158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka      LastFiller->setIsInsideBundle();
133a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka     }
1349684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  return Changed;
135a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1369684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes}
1379684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1389684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
1399684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// slots in Mips MachineFunctions
1409684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso LopesFunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
1419684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  return new Filler(tm);
1429684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes}
1439684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1446f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanakabool Filler::findDelayInstr(MachineBasicBlock &MBB,
145158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka                            InstrIter slot,
146158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka                            InstrIter &Filler) {
147a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  SmallSet<unsigned, 32> RegDefs;
148a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  SmallSet<unsigned, 32> RegUses;
149a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1500f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka  insertDefsUses(slot, RegDefs, RegUses);
151a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1527d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka  bool sawLoad = false;
1537d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka  bool sawStore = false;
154a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
155158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka  for (ReverseInstrIter I(slot); I != MBB.instr_rend(); ++I) {
156a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    // skip debug value
157a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (I->isDebugValue())
158a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
159a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1607d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka    // Convert to forward iterator.
161158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanaka    InstrIter FI(llvm::next(I).base());
1627d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka
163a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (I->hasUnmodeledSideEffects()
164a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        || I->isInlineAsm()
165a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        || I->isLabel()
1667d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka        || FI == LastFiller
1675a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng        || I->isPseudo()
168a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        //
169a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        // Should not allow:
170a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        // ERET, DERET or WAIT, PAUSE. Need to add these to instruction
171a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        // list. TBD.
172a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        )
173a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      break;
174a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1757d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka    if (delayHasHazard(FI, sawLoad, sawStore, RegDefs, RegUses)) {
1767d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka      insertDefsUses(FI, RegDefs, RegUses);
177a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
178a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    }
179a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1807d8e04d5f199228ad385d6005f46f0defa23039bAkira Hatanaka    Filler = FI;
1816f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    return true;
182a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
1836f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
1846f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka  return false;
185a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
186a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
187158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanakabool Filler::delayHasHazard(InstrIter candidate,
18882099683060abb1f74453d06e78a3729a75ef7eeAkira Hatanaka                            bool &sawLoad, bool &sawStore,
189a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32> &RegDefs,
190a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka                            SmallSet<unsigned, 32> &RegUses) {
191a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  if (candidate->isImplicitDef() || candidate->isKill())
192a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    return true;
193a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
194cfc3fb57372b2ebd580b966469121cba2029bae9Akira Hatanaka  // Loads or stores cannot be moved past a store to the delay slot
195bb481f882093fb738d2bb15610c79364bada5496Jia Liu  // and stores cannot be moved past a load.
1965a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  if (candidate->mayLoad()) {
197a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (sawStore)
198a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
199cfc3fb57372b2ebd580b966469121cba2029bae9Akira Hatanaka    sawLoad = true;
200a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
201a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
2025a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  if (candidate->mayStore()) {
203a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (sawStore)
204a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
205a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    sawStore = true;
206a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (sawLoad)
207a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
208a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
209a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
2105a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  assert((!candidate->isCall() && !candidate->isReturn()) &&
21142be280a288b2bfc5f072ea83802088e0fb073e7Akira Hatanaka         "Cannot put calls or returns in delay slot.");
2120c419a7c4bec0a4931dd1dbd9f1adb43ec9b15c2Akira Hatanaka
213a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  for (unsigned i = 0, e = candidate->getNumOperands(); i!= e; ++i) {
214a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    const MachineOperand &MO = candidate->getOperand(i);
2150c419a7c4bec0a4931dd1dbd9f1adb43ec9b15c2Akira Hatanaka    unsigned Reg;
216a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
2170c419a7c4bec0a4931dd1dbd9f1adb43ec9b15c2Akira Hatanaka    if (!MO.isReg() || !(Reg = MO.getReg()))
2180c419a7c4bec0a4931dd1dbd9f1adb43ec9b15c2Akira Hatanaka      continue; // skip
219a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
220a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isDef()) {
221a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      // check whether Reg is defined or used before delay slot.
222a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      if (IsRegInSet(RegDefs, Reg) || IsRegInSet(RegUses, Reg))
223a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        return true;
224a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    }
225a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isUse()) {
226a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      // check whether Reg is defined before delay slot.
227a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      if (IsRegInSet(RegDefs, Reg))
228a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka        return true;
229a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    }
230a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
231a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  return false;
232a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
233a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
234a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka// Insert Defs and Uses of MI into the sets RegDefs and RegUses.
235158413930f25ecdd0902e1cc11bb8dc3683b94f8Akira Hatanakavoid Filler::insertDefsUses(InstrIter MI,
236864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                            SmallSet<unsigned, 32> &RegDefs,
237864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                            SmallSet<unsigned, 32> &RegUses) {
2380c419a7c4bec0a4931dd1dbd9f1adb43ec9b15c2Akira Hatanaka  // If MI is a call or return, just examine the explicit non-variadic operands.
2396e4e64859fe019c949f3d2c89abdfc2fe27f3af5Akira Hatanaka  MCInstrDesc MCID = MI->getDesc();
2405a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  unsigned e = MI->isCall() || MI->isReturn() ? MCID.getNumOperands() :
2415a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng                                                MI->getNumOperands();
242bb481f882093fb738d2bb15610c79364bada5496Jia Liu
243bb481f882093fb738d2bb15610c79364bada5496Jia Liu  // Add RA to RegDefs to prevent users of RA from going into delay slot.
2445a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng  if (MI->isCall())
2452f52338f50cc629f7a43bef3caf0d20af53fe284Akira Hatanaka    RegDefs.insert(Mips::RA);
2460f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka
2470f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka  for (unsigned i = 0; i != e; ++i) {
248a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    const MachineOperand &MO = MI->getOperand(i);
2490f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka    unsigned Reg;
250a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
2510f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka    if (!MO.isReg() || !(Reg = MO.getReg()))
252a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
2530f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka
254a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (MO.isDef())
255a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      RegDefs.insert(Reg);
2560f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka    else if (MO.isUse())
257a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      RegUses.insert(Reg);
258a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
259a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
260a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
261a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka//returns true if the Reg or its alias is in the RegSet.
262864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanakabool Filler::IsRegInSet(SmallSet<unsigned, 32> &RegSet, unsigned Reg) {
263f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen  // Check Reg and all aliased Registers.
264f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen  for (MCRegAliasIterator AI(Reg, TM.getRegisterInfo(), true);
265f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen       AI.isValid(); ++AI)
266f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen    if (RegSet.count(*AI))
267a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
268a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  return false;
269a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
270