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