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