//===-- PreAllocSplitting.cpp - Pre-allocation Interval Spltting Pass. ----===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements the machine instruction level pre-register allocation // live interval splitting pass. It finds live interval barriers, i.e. // instructions which will kill all physical registers in certain register // classes, and split all live intervals which cross the barrier. // //===----------------------------------------------------------------------===// #define DEBUG_TYPE "pre-alloc-split" #include "llvm/CodeGen/LiveIntervalAnalysis.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/RegisterCoalescer.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/SmallPtrSet.h" using namespace llvm; namespace { class VISIBILITY_HIDDEN PreAllocSplitting : public MachineFunctionPass { // ProcessedBarriers - Register live interval barriers that have already // been processed. SmallPtrSet ProcessedBarriers; // ActiveBarriers - Register live interval barriers that are currently // being processed. SmallSet ActiveBarriers; public: static char ID; PreAllocSplitting() : MachineFunctionPass(&ID) {} virtual bool runOnMachineFunction(MachineFunction &MF); virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.addPreserved(); AU.addPreserved(); AU.addPreserved(); if (StrongPHIElim) AU.addPreservedID(StrongPHIEliminationID); else AU.addPreservedID(PHIEliminationID); AU.addPreservedID(TwoAddressInstructionPassID); MachineFunctionPass::getAnalysisUsage(AU); } virtual void releaseMemory() { ProcessedBarriers.clear(); ActiveBarriers.clear(); } virtual const char *getPassName() const { return "Pre-Register Allocaton Live Interval Splitting"; } }; } // end anonymous namespace char PreAllocSplitting::ID = 0; static RegisterPass X("pre-alloc-splitting", "Pre-Register Allocation Live Interval Splitting"); const PassInfo *const llvm::PreAllocSplittingID = &X; bool PreAllocSplitting::runOnMachineFunction(MachineFunction &MF) { return false; }