DelaySlotFiller.cpp revision 7c90f73a1b06040d971a3dd95a491031ae6238d5
17c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner//===-- DelaySlotFiller.cpp - SPARC delay slot filler ---------------------===// 2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman// 320117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// The LLVM Compiler Infrastructure 420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// 520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// This file was developed by the LLVM research group and is distributed under 620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// the University of Illinois Open Source License. See LICENSE.TXT for details. 7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman// 820117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke//===----------------------------------------------------------------------===// 920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// 10870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke// This is a simple local pass that fills delay slots with NOPs. 1120117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// 1220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke//===----------------------------------------------------------------------===// 1320117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 147c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "Sparc.h" 1520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke#include "llvm/CodeGen/MachineFunctionPass.h" 1620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke#include "llvm/CodeGen/MachineInstrBuilder.h" 17870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke#include "llvm/Target/TargetMachine.h" 18870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke#include "llvm/Target/TargetInstrInfo.h" 1974dfcf12000fcec60e1854f7bb78d481347a0a4bBrian Gaeke#include "llvm/ADT/Statistic.h" 2020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaekeusing namespace llvm; 2120117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 2220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaekenamespace { 237c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner Statistic<> FilledSlots("delayslotfiller", "Num. of delay slots filled"); 2420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 2520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke struct Filler : public MachineFunctionPass { 2620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke /// Target machine description which we query for reg. names, data 2720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke /// layout, etc. 2820117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke /// 2920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke TargetMachine &TM; 30870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke const TargetInstrInfo *TII; 3120117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 327c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner Filler(TargetMachine &tm) : TM(tm), TII(tm.getInstrInfo()) { } 3320117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 347c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner virtual const char *getPassName() const { 357c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner return "SPARC Delay Slot Filler"; 3620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke } 3720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 387c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner bool runOnMachineBasicBlock(MachineBasicBlock &MBB); 397c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner bool runOnMachineFunction(MachineFunction &F) { 4020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke bool Changed = false; 417c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner for (MachineFunction::iterator FI = F.begin(), FE = F.end(); 4220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke FI != FE; ++FI) 437c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner Changed |= runOnMachineBasicBlock(*FI); 4420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke return Changed; 4520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke } 4620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 4720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke }; 4820117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke} // end of anonymous namespace 4920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 507c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner/// createSparcDelaySlotFillerPass - Returns a pass that fills in delay 517c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner/// slots in Sparc MachineFunctions 5220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke/// 537c90f73a1b06040d971a3dd95a491031ae6238d5Chris LattnerFunctionPass *llvm::createSparcDelaySlotFillerPass(TargetMachine &tm) { 547c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner return new Filler(tm); 5520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke} 5620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 5720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke/// runOnMachineBasicBlock - Fill in delay slots for the given basic block. 580f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke/// Currently, we fill delay slots with NOPs. We assume there is only one 590f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke/// delay slot per delayed instruction. 6020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke/// 617c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerbool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) { 620f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke bool Changed = false; 637c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I) 647c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner if (TII->hasDelaySlot(I->getOpcode())) { 6520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke MachineBasicBlock::iterator J = I; 6620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke ++J; 677c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner BuildMI(MBB, J, SP::NOP, 0); 6820117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke ++FilledSlots; 690f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke Changed = true; 7020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke } 710f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke return Changed; 7220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke} 73