MipsDelaySlotFiller.cpp revision d977aacf990d241d0224d20518f631a928c1b1a8
190db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka//===-- MipsDelaySlotFiller.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//
1090db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka// Simple pass to fill 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"
18cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka#include "llvm/ADT/BitVector.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Statistic.h"
209684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFunctionPass.h"
219684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/CodeGen/MachineInstrBuilder.h"
22a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka#include "llvm/Support/CommandLine.h"
239684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes#include "llvm/Target/TargetInstrInfo.h"
24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h"
25a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka#include "llvm/Target/TargetRegisterInfo.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),
3690db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka  cl::desc("Fill all delay slots with NOPs."),
37a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  cl::Hidden);
38a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
39f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka// This option can be used to silence complaints by machine verifier passes.
40f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanakastatic cl::opt<bool> SkipDelaySlotFiller(
41f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  "skip-mips-delay-filler",
42f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  cl::init(false),
43f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  cl::desc("Skip MIPS' delay slot filling pass."),
44f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka  cl::Hidden);
45f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka
469684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopesnamespace {
475dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka  class Filler : public MachineFunctionPass {
485dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka  public:
4990c595425bdc47563714d6ed13f6e9151552ceaeBruno Cardoso Lopes    Filler(TargetMachine &tm)
5090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      : MachineFunctionPass(ID), TM(tm), TII(tm.getInstrInfo()) { }
519684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
529684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    virtual const char *getPassName() const {
539684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      return "Mips Delay Slot Filler";
549684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    }
559684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
569684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    bool runOnMachineFunction(MachineFunction &F) {
57f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka      if (SkipDelaySlotFiller)
58f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka        return false;
59f9c3f3b8a8702e0d98be5fb9cd5428c49c7164a2Akira Hatanaka
609684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      bool Changed = false;
619684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      for (MachineFunction::iterator FI = F.begin(), FE = F.end();
629684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes           FI != FE; ++FI)
639684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes        Changed |= runOnMachineBasicBlock(*FI);
649684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes      return Changed;
659684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes    }
669684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
675dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka  private:
68eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    typedef MachineBasicBlock::iterator Iter;
69eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    typedef MachineBasicBlock::reverse_iterator ReverseIter;
705dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka
715dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    bool runOnMachineBasicBlock(MachineBasicBlock &MBB);
725dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka
73cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    /// Initialize RegDefs and RegUses.
74cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    void initRegDefsUses(const MachineInstr &MI, BitVector &RegDefs,
75cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                         BitVector &RegUses) const;
76a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
77cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    bool isRegInSet(const BitVector &RegSet, unsigned Reg) const;
78a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
79cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    bool checkRegDefsUses(const BitVector &RegDefs, const BitVector &RegUses,
80cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                          BitVector &NewDefs, BitVector &NewUses,
81cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                          unsigned Reg, bool IsDef) const;
82cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
83cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    bool checkRegDefsUses(BitVector &RegDefs, BitVector &RegUses,
84cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                          const MachineInstr &MI, unsigned Begin,
85cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                          unsigned End) const;
86cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
87cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    /// This function checks if it is valid to move Candidate to the delay slot
88cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    /// and returns true if it isn't. It also updates load and store flags and
89cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    /// register defs and uses.
9090db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka    bool delayHasHazard(const MachineInstr &Candidate, bool &SawLoad,
91cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                        bool &SawStore, BitVector &RegDefs,
92cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                        BitVector &RegUses) const;
93a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
9490db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka    bool findDelayInstr(MachineBasicBlock &MBB, Iter slot, Iter &Filler) const;
95eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka
96eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    bool terminateSearch(const MachineInstr &Candidate) const;
97a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
985dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    TargetMachine &TM;
995dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    const TargetInstrInfo *TII;
100a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
1015dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    static char ID;
1029684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  };
1039684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  char Filler::ID = 0;
1049684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes} // end of anonymous namespace
1059684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1069684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// runOnMachineBasicBlock - Fill in delay slots for the given basic block.
107a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka/// We assume there is only one delay slot per delayed instruction.
10890db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanakabool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
1099684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  bool Changed = false;
11053120e0a9fde4b3e8057b9d5b9ad8ec50fbaa31dAkira Hatanaka
111eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka  for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
1125dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    if (!I->hasDelaySlot())
1135dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka      continue;
1145dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka
1155dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    ++FilledSlots;
1165dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    Changed = true;
117eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    Iter D;
1185dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka
1195dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    // Delay slot filling is disabled at -O0.
1205dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None) &&
1215dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka        findDelayInstr(MBB, I, D)) {
1225dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka      MBB.splice(llvm::next(I), &MBB, D);
1235dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka      ++UsefulSlots;
1245dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka    } else
1255dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka      BuildMI(MBB, llvm::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
126a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
127eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    // Bundle the delay slot filler to the instruction with the delay slot.
128eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    MIBundleBuilder(MBB, I, llvm::next(llvm::next(I)));
1295dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka  }
1305dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka
1315dd41c95f3075fc5c01cfb6822a66ac584fcc8c7Akira Hatanaka  return Changed;
1329684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes}
1339684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
1349684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// createMipsDelaySlotFillerPass - Returns a pass that fills in delay
1359684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes/// slots in Mips MachineFunctions
1369684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso LopesFunctionPass *llvm::createMipsDelaySlotFillerPass(MipsTargetMachine &tm) {
1379684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes  return new Filler(tm);
1389684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes}
1399684a697d59cdcbe9dff84bdaf3b42cf0465e821Bruno Cardoso Lopes
14090db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanakabool Filler::findDelayInstr(MachineBasicBlock &MBB, Iter Slot,
14190db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka                            Iter &Filler) const {
142cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  unsigned NumRegs = TM.getRegisterInfo()->getNumRegs();
143cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  BitVector RegDefs(NumRegs), RegUses(NumRegs);
144a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
145cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  initRegDefsUses(*Slot, RegDefs, RegUses);
146a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
14790db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka  bool SawLoad = false;
14890db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka  bool SawStore = false;
149a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
15090db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka  for (ReverseIter I(Slot); I != MBB.rend(); ++I) {
151a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    // skip debug value
152a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka    if (I->isDebugValue())
153a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
154a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
155eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka    if (terminateSearch(*I))
156a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      break;
157a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
158cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    if (delayHasHazard(*I, SawLoad, SawStore, RegDefs, RegUses))
159a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      continue;
160a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
16190db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka    Filler = llvm::next(I).base();
1626f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka    return true;
163a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
1646f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka
1656f818abbe3dce0bee8257ea7d7dd4cb951f4dc7cAkira Hatanaka  return false;
166a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
167a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
168cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanakabool Filler::checkRegDefsUses(const BitVector &RegDefs,
169cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                              const BitVector &RegUses,
170cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                              BitVector &NewDefs, BitVector &NewUses,
171cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                              unsigned Reg, bool IsDef) const {
172cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  if (IsDef) {
173cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    NewDefs.set(Reg);
174cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    // check whether Reg has already been defined or used.
175cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    return (isRegInSet(RegDefs, Reg) || isRegInSet(RegUses, Reg));
176cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  }
177cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
178cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  NewUses.set(Reg);
179cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  // check whether Reg has already been defined.
180cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  return isRegInSet(RegDefs, Reg);
181cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka}
182cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
183cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanakabool Filler::checkRegDefsUses(BitVector &RegDefs, BitVector &RegUses,
184cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                              const MachineInstr &MI, unsigned Begin,
185cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                              unsigned End) const {
186cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  unsigned NumRegs = TM.getRegisterInfo()->getNumRegs();
187cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  BitVector NewDefs(NumRegs), NewUses(NumRegs);
188cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  bool HasHazard = false;
189cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
190cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  for (unsigned I = Begin; I != End; ++I) {
191cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    const MachineOperand &MO = MI.getOperand(I);
192cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
193cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    if (MO.isReg() && MO.getReg())
194cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka      HasHazard |= checkRegDefsUses(RegDefs, RegUses, NewDefs, NewUses,
195cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                                    MO.getReg(), MO.isDef());
196cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  }
197cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
198cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  RegDefs |= NewDefs;
199cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  RegUses |= NewUses;
200cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
201cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  return HasHazard;
202cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka}
203cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
20490db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanakabool Filler::delayHasHazard(const MachineInstr &Candidate, bool &SawLoad,
205cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                            bool &SawStore, BitVector &RegDefs,
206cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                            BitVector &RegUses) const {
207cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  bool HasHazard = (Candidate.isImplicitDef() || Candidate.isKill());
208a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
209cfc3fb57372b2ebd580b966469121cba2029bae9Akira Hatanaka  // Loads or stores cannot be moved past a store to the delay slot
210bb481f882093fb738d2bb15610c79364bada5496Jia Liu  // and stores cannot be moved past a load.
211d977aacf990d241d0224d20518f631a928c1b1a8Akira Hatanaka  if (Candidate.mayStore() || Candidate.hasOrderedMemoryRef()) {
212cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    HasHazard |= SawStore | SawLoad;
21390db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka    SawStore = true;
214cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  } else if (Candidate.mayLoad()) {
215cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    HasHazard |= SawStore;
216cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    SawLoad = true;
217a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  }
218a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
21990db35a3e7d24ad81aa0ce6b641186faed033cdcAkira Hatanaka  assert((!Candidate.isCall() && !Candidate.isReturn()) &&
22042be280a288b2bfc5f072ea83802088e0fb073e7Akira Hatanaka         "Cannot put calls or returns in delay slot.");
2210c419a7c4bec0a4931dd1dbd9f1adb43ec9b15c2Akira Hatanaka
222cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  HasHazard |= checkRegDefsUses(RegDefs, RegUses, Candidate, 0,
223cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                                Candidate.getNumOperands());
224a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
225cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  return HasHazard;
226a032dbd62f46a40b2cf759ce0dd0ebd41ef0614cAkira Hatanaka}
227a032dbd62f46a40b2cf759ce0dd0ebd41ef0614cAkira Hatanaka
228cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanakavoid Filler::initRegDefsUses(const MachineInstr &MI, BitVector &RegDefs,
229cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                             BitVector &RegUses) const {
230cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  // Add all register operands which are explicit and non-variadic.
231cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  checkRegDefsUses(RegDefs, RegUses, MI, 0, MI.getDesc().getNumOperands());
2320f0c59a0f881d7743bc518ed16022109447e5a4bAkira Hatanaka
233a032dbd62f46a40b2cf759ce0dd0ebd41ef0614cAkira Hatanaka  // If MI is a call, add RA to RegDefs to prevent users of RA from going into
234a032dbd62f46a40b2cf759ce0dd0ebd41ef0614cAkira Hatanaka  // delay slot.
235cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  if (MI.isCall())
236cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    RegDefs.set(Mips::RA);
237cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka
238cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  // Add all implicit register operands of branch instructions except
239cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  // register AT.
240cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka  if (MI.isBranch()) {
241cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    checkRegDefsUses(RegDefs, RegUses, MI, MI.getDesc().getNumOperands(),
242cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka                     MI.getNumOperands());
243cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    RegDefs.reset(Mips::AT);
244a032dbd62f46a40b2cf759ce0dd0ebd41ef0614cAkira Hatanaka  }
245a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
246a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka
247a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka//returns true if the Reg or its alias is in the RegSet.
248cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanakabool Filler::isRegInSet(const BitVector &RegSet, unsigned Reg) const {
249f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen  // Check Reg and all aliased Registers.
250f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen  for (MCRegAliasIterator AI(Reg, TM.getRegisterInfo(), true);
251f152fe8d487c46873bbdd4abab43200f783e978bJakob Stoklund Olesen       AI.isValid(); ++AI)
252cd7319dc5f91ac81ab9d8505f34937e91bfcf65dAkira Hatanaka    if (RegSet.test(*AI))
253a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka      return true;
254a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka  return false;
255a3defb07a075e936c435428d5adeedc5f12f5ab5Akira Hatanaka}
256eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka
257eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanakabool Filler::terminateSearch(const MachineInstr &Candidate) const {
258eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka  return (Candidate.isTerminator() || Candidate.isCall() ||
259eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka          Candidate.isLabel() || Candidate.isInlineAsm() ||
260eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka          Candidate.hasUnmodeledSideEffects());
261eba97c573f08332c9c9d1875c304cce1bea2e28eAkira Hatanaka}
262