|  | //===-- llvm/CodeGen/Splitter.h - Splitter -*- C++ -*----------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CODEGEN_SPLITTER_H | 
|  | #define LLVM_CODEGEN_SPLITTER_H | 
|  |  | 
|  | #include "llvm/CodeGen/MachineFunctionPass.h" | 
|  | #include "llvm/CodeGen/MachineLoopInfo.h" | 
|  | #include "llvm/CodeGen/SlotIndexes.h" | 
|  |  | 
|  | #include <deque> | 
|  | #include <map> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class LiveInterval; | 
|  | class LiveIntervals; | 
|  | struct LiveRange; | 
|  | class LoopSplit; | 
|  | class MachineDominatorTree; | 
|  | class MachineRegisterInfo; | 
|  | class SlotIndexes; | 
|  | class TargetInstrInfo; | 
|  | class VNInfo; | 
|  |  | 
|  | class LoopSplitter : public MachineFunctionPass { | 
|  | friend class LoopSplit; | 
|  | public: | 
|  | static char ID; | 
|  |  | 
|  | LoopSplitter() : MachineFunctionPass(ID) { | 
|  | initializeLoopSplitterPass(*PassRegistry::getPassRegistry()); | 
|  | } | 
|  |  | 
|  | virtual void getAnalysisUsage(AnalysisUsage &au) const; | 
|  |  | 
|  | virtual bool runOnMachineFunction(MachineFunction &fn); | 
|  |  | 
|  | virtual void releaseMemory(); | 
|  |  | 
|  |  | 
|  | private: | 
|  |  | 
|  | MachineFunction *mf; | 
|  | LiveIntervals *lis; | 
|  | MachineLoopInfo *mli; | 
|  | MachineRegisterInfo *mri; | 
|  | MachineDominatorTree *mdt; | 
|  | SlotIndexes *sis; | 
|  | const TargetInstrInfo *tii; | 
|  | const TargetRegisterInfo *tri; | 
|  |  | 
|  | std::string fqn; | 
|  | std::deque<LiveInterval*> intervals; | 
|  |  | 
|  | typedef std::pair<SlotIndex, SlotIndex> SlotPair; | 
|  | typedef std::vector<SlotPair> LoopRanges; | 
|  | typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap; | 
|  | LoopRangeMap loopRangeMap; | 
|  |  | 
|  | void dumpLoopInfo(MachineLoop &loop); | 
|  |  | 
|  | void dumpOddTerminators(); | 
|  |  | 
|  | void updateTerminators(MachineBasicBlock &mbb); | 
|  |  | 
|  | bool canInsertPreHeader(MachineLoop &loop); | 
|  | MachineBasicBlock& insertPreHeader(MachineLoop &loop); | 
|  |  | 
|  | bool isCriticalEdge(MachineLoop::Edge &edge); | 
|  | bool canSplitEdge(MachineLoop::Edge &edge); | 
|  | MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop); | 
|  |  | 
|  | LoopRanges& getLoopRanges(MachineLoop &loop); | 
|  | std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr, | 
|  | MachineLoop &loop); | 
|  |  | 
|  | void dumpLoopRanges(MachineLoop &loop); | 
|  |  | 
|  | void processHeader(LoopSplit &split); | 
|  | void processLoopExits(LoopSplit &split); | 
|  | void processLoopUses(LoopSplit &split); | 
|  |  | 
|  | bool splitOverLoop(LiveInterval &li, MachineLoop &loop); | 
|  |  | 
|  | void processInterval(LiveInterval &li); | 
|  |  | 
|  | void processIntervals(); | 
|  | }; | 
|  |  | 
|  | } | 
|  |  | 
|  | #endif |