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