1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===-- DelaySlotFiller.cpp - SPARC delay slot filler ---------------------===// 2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The LLVM Compiler Infrastructure 4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source 6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details. 7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This is a simple local pass that attempts to fill delay slots with useful 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// instructions. If no instructions can be moved into the delay slot, then a 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// NOP is placed. 13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define DEBUG_TYPE "delay-slot-filler" 16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "Sparc.h" 17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/CodeGen/MachineFunctionPass.h" 18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/CodeGen/MachineInstrBuilder.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/CommandLine.h" 20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Target/TargetMachine.h" 21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Target/TargetInstrInfo.h" 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetRegisterInfo.h" 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/SmallSet.h" 24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/ADT/Statistic.h" 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm; 27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanSTATISTIC(FilledSlots, "Number of delay slots filled"); 29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic cl::opt<bool> DisableDelaySlotFiller( 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "disable-sparc-delay-filler", 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman cl::init(false), 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman cl::desc("Disable the Sparc delay slot filler."), 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman cl::Hidden); 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace { 37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman struct Filler : public MachineFunctionPass { 38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman /// Target machine description which we query for reg. names, data 39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman /// layout, etc. 40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman /// 41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman TargetMachine &TM; 42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman const TargetInstrInfo *TII; 43894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static char ID; 45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Filler(TargetMachine &tm) 46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman : MachineFunctionPass(ID), TM(tm), TII(tm.getInstrInfo()) { } 47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman virtual const char *getPassName() const { 49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return "SPARC Delay Slot Filler"; 50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool runOnMachineBasicBlock(MachineBasicBlock &MBB); 53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool runOnMachineFunction(MachineFunction &F) { 54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool Changed = false; 55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (MachineFunction::iterator FI = F.begin(), FE = F.end(); 56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman FI != FE; ++FI) 57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed |= runOnMachineBasicBlock(*FI); 58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return Changed; 59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool isDelayFiller(MachineBasicBlock &MBB, 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator candidate); 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void insertCallUses(MachineBasicBlock::iterator MI, 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32>& RegUses); 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void insertDefsUses(MachineBasicBlock::iterator MI, 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32>& RegDefs, 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32>& RegUses); 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool IsRegInSet(SmallSet<unsigned, 32>& RegSet, 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Reg); 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool delayHasHazard(MachineBasicBlock::iterator candidate, 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool &sawLoad, bool &sawStore, 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32> &RegDefs, 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32> &RegUses); 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman findDelayInstr(MachineBasicBlock &MBB, MachineBasicBlock::iterator slot); 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool needsUnimp(MachineBasicBlock::iterator I, unsigned &StructSize); 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman char Filler::ID = 0; 86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} // end of anonymous namespace 87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// createSparcDelaySlotFillerPass - Returns a pass that fills in delay 89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// slots in Sparc MachineFunctions 90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// 91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanFunctionPass *llvm::createSparcDelaySlotFillerPass(TargetMachine &tm) { 92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return new Filler(tm); 93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// runOnMachineBasicBlock - Fill in delay slots for the given basic block. 9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// We assume there is only one delay slot per delayed instruction. 98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman/// 99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) { 100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman bool Changed = false; 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I) 103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (I->getDesc().hasDelaySlot()) { 10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator D = MBB.end(); 105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman MachineBasicBlock::iterator J = I; 10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!DisableDelaySlotFiller) 10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman D = findDelayInstr(MBB, I); 10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ++FilledSlots; 111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman Changed = true; 11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (D == MBB.end()) 11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman BuildMI(MBB, ++J, I->getDebugLoc(), TII->get(SP::NOP)); 11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else 11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MBB.splice(++J, &MBB, D); 11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned structSize = 0; 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (needsUnimp(I, structSize)) { 11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator J = I; 12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ++J; //skip the delay filler. 12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman BuildMI(MBB, ++J, I->getDebugLoc(), 12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TII->get(SP::UNIMP)).addImm(structSize); 12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return Changed; 126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMachineBasicBlock::iterator 12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFiller::findDelayInstr(MachineBasicBlock &MBB, 13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator slot) 13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32> RegDefs; 13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32> RegUses; 13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool sawLoad = false; 13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool sawStore = false; 13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator I = slot; 13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (slot->getOpcode() == SP::RET) 14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MBB.end(); 14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (slot->getOpcode() == SP::RETL) { 14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman --I; 14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (I->getOpcode() != SP::RESTORErr) 14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MBB.end(); 14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //change retl to ret 14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman slot->setDesc(TII->get(SP::RET)); 14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return I; 14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //Call's delay filler can def some of call's uses. 15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (slot->getDesc().isCall()) 15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman insertCallUses(slot, RegUses); 15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else 15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman insertDefsUses(slot, RegDefs, RegUses); 15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool done = false; 15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman while (!done) { 16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman done = (I == MBB.begin()); 16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!done) 16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman --I; 16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // skip debug value 16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (I->isDebugValue()) 16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman continue; 16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (I->hasUnmodeledSideEffects() 17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman || I->isInlineAsm() 17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman || I->isLabel() 17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman || I->getDesc().hasDelaySlot() 17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman || isDelayFiller(MBB, I)) 17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) { 17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman insertDefsUses(I, RegDefs, RegUses); 17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman continue; 18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return I; 18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MBB.end(); 18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool Filler::delayHasHazard(MachineBasicBlock::iterator candidate, 18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool &sawLoad, 18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool &sawStore, 19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32> &RegDefs, 19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32> &RegUses) 19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (candidate->isImplicitDef() || candidate->isKill()) 19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (candidate->getDesc().mayLoad()) { 19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman sawLoad = true; 19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (sawStore) 20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (candidate->getDesc().mayStore()) { 20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (sawStore) 20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman sawStore = true; 20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (sawLoad) 20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (unsigned i = 0, e = candidate->getNumOperands(); i!= e; ++i) { 21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MachineOperand &MO = candidate->getOperand(i); 21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!MO.isReg()) 21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman continue; // skip 21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Reg = MO.getReg(); 21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (MO.isDef()) { 21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //check whether Reg is defined or used before delay slot. 22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (IsRegInSet(RegDefs, Reg) || IsRegInSet(RegUses, Reg)) 22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (MO.isUse()) { 22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman //check whether Reg is defined before delay slot. 22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (IsRegInSet(RegDefs, Reg)) 22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid Filler::insertCallUses(MachineBasicBlock::iterator MI, 23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32>& RegUses) 23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch(MI->getOpcode()) { 23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: llvm_unreachable("Unknown opcode."); 23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case SP::CALL: break; 24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case SP::JMPLrr: 24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case SP::JMPLri: 24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(MI->getNumOperands() >= 2); 24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MachineOperand &Reg = MI->getOperand(0); 24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Reg.isReg() && "JMPL first operand is not a register."); 24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Reg.isUse() && "JMPL first operand is not a use."); 24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegUses.insert(Reg.getReg()); 24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MachineOperand &RegOrImm = MI->getOperand(1); 24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (RegOrImm.isImm()) 25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(RegOrImm.isReg() && "JMPLrr second operand is not a register."); 25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(RegOrImm.isUse() && "JMPLrr second operand is not a use."); 25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegUses.insert(RegOrImm.getReg()); 25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//Insert Defs and Uses of MI into the sets RegDefs and RegUses. 25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid Filler::insertDefsUses(MachineBasicBlock::iterator MI, 26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32>& RegDefs, 26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallSet<unsigned, 32>& RegUses) 26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MachineOperand &MO = MI->getOperand(i); 26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!MO.isReg()) 26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman continue; 26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Reg = MO.getReg(); 26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Reg == 0) 27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman continue; 27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (MO.isDef()) 27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegDefs.insert(Reg); 27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (MO.isUse()) 27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegUses.insert(Reg); 27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//returns true if the Reg or its alias is in the RegSet. 28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool Filler::IsRegInSet(SmallSet<unsigned, 32>& RegSet, unsigned Reg) 28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (RegSet.count(Reg)) 28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // check Aliased Registers 28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (const unsigned *Alias = TM.getRegisterInfo()->getAliasSet(Reg); 28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman *Alias; ++ Alias) 28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (RegSet.count(*Alias)) 28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// return true if the candidate is a delay filler. 29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool Filler::isDelayFiller(MachineBasicBlock &MBB, 29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator candidate) 29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (candidate == MBB.begin()) 29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (candidate->getOpcode() == SP::UNIMP) 30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCInstrDesc &prevdesc = (--candidate)->getDesc(); 30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return prevdesc.hasDelaySlot(); 30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool Filler::needsUnimp(MachineBasicBlock::iterator I, unsigned &StructSize) 30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman{ 30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!I->getDesc().isCall()) 30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned structSizeOpNum = 0; 31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (I->getOpcode()) { 31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: llvm_unreachable("Unknown call opcode."); 31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case SP::CALL: structSizeOpNum = 1; break; 31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case SP::JMPLrr: 31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case SP::JMPLri: structSizeOpNum = 2; break; 31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MachineOperand &MO = I->getOperand(structSizeOpNum); 31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!MO.isImm()) 32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StructSize = MO.getImm(); 32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 324