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