DelaySlotFiller.cpp revision 749c6f6b5ed301c84aac562e414486549d7b98eb
17c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner//===-- DelaySlotFiller.cpp - SPARC delay slot filler ---------------------===// 2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman// 320117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// The LLVM Compiler Infrastructure 420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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 1495b2c7da5e83670881270c1cd231a240be0556d9Chris Lattner#define DEBUG_TYPE "delayslotfiller" 157c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "Sparc.h" 1620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke#include "llvm/CodeGen/MachineFunctionPass.h" 1720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke#include "llvm/CodeGen/MachineInstrBuilder.h" 18870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke#include "llvm/Target/TargetMachine.h" 19870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke#include "llvm/Target/TargetInstrInfo.h" 2074dfcf12000fcec60e1854f7bb78d481347a0a4bBrian Gaeke#include "llvm/ADT/Statistic.h" 2120117102c2e10fa2c0fa74965894e28751a3df34Brian Gaekeusing namespace llvm; 2220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 2395b2c7da5e83670881270c1cd231a240be0556d9Chris LattnerSTATISTIC(FilledSlots, "Number of delay slots filled"); 2420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 2595b2c7da5e83670881270c1cd231a240be0556d9Chris Lattnernamespace { 2620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke struct Filler : public MachineFunctionPass { 2720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke /// Target machine description which we query for reg. names, data 2820117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke /// layout, etc. 2920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke /// 3020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke TargetMachine &TM; 31870248b16491c9a9a604494b4e7aa94035af2158Brian Gaeke const TargetInstrInfo *TII; 3220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 331997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 34794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel Filler(TargetMachine &tm) 35794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel : MachineFunctionPass((intptr_t)&ID), TM(tm), TII(tm.getInstrInfo()) { } 3620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 377c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner virtual const char *getPassName() const { 387c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner return "SPARC Delay Slot Filler"; 3920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke } 4020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 417c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner bool runOnMachineBasicBlock(MachineBasicBlock &MBB); 427c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner bool runOnMachineFunction(MachineFunction &F) { 4320117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke bool Changed = false; 447c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner for (MachineFunction::iterator FI = F.begin(), FE = F.end(); 4520117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke FI != FE; ++FI) 467c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner Changed |= runOnMachineBasicBlock(*FI); 4720117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke return Changed; 4820117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke } 4920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 5020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke }; 511997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel char Filler::ID = 0; 5220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke} // end of anonymous namespace 5320117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 547c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner/// createSparcDelaySlotFillerPass - Returns a pass that fills in delay 557c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner/// slots in Sparc MachineFunctions 5620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke/// 577c90f73a1b06040d971a3dd95a491031ae6238d5Chris LattnerFunctionPass *llvm::createSparcDelaySlotFillerPass(TargetMachine &tm) { 587c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner return new Filler(tm); 5920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke} 6020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke 6120117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke/// runOnMachineBasicBlock - Fill in delay slots for the given basic block. 620f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke/// Currently, we fill delay slots with NOPs. We assume there is only one 630f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke/// delay slot per delayed instruction. 6420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke/// 657c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerbool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) { 660f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke bool Changed = false; 677c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ++I) 68749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner if (I->getDesc().hasDelaySlot()) { 6920117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke MachineBasicBlock::iterator J = I; 7020117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke ++J; 71c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng BuildMI(MBB, J, TII->get(SP::NOP)); 7220117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke ++FilledSlots; 730f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke Changed = true; 7420117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke } 750f51cc1759e2162485b5f9ee57b3b5bc8f5c6759Brian Gaeke return Changed; 7620117102c2e10fa2c0fa74965894e28751a3df34Brian Gaeke} 77