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