1 //===-- llvm/CodeGen/Splitter.h - Splitter -*- C++ -*----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CODEGEN_SPLITTER_H 11 #define LLVM_CODEGEN_SPLITTER_H 12 13 #include "llvm/CodeGen/MachineFunctionPass.h" 14 #include "llvm/CodeGen/MachineLoopInfo.h" 15 #include "llvm/CodeGen/SlotIndexes.h" 16 17 #include <deque> 18 #include <map> 19 #include <string> 20 #include <vector> 21 22 namespace llvm { 23 24 class LiveInterval; 25 class LiveIntervals; 26 struct LiveRange; 27 class LoopSplit; 28 class MachineDominatorTree; 29 class MachineRegisterInfo; 30 class SlotIndexes; 31 class TargetInstrInfo; 32 class VNInfo; 33 34 class LoopSplitter : public MachineFunctionPass { 35 friend class LoopSplit; 36 public: 37 static char ID; 38 LoopSplitter()39 LoopSplitter() : MachineFunctionPass(ID) { 40 initializeLoopSplitterPass(*PassRegistry::getPassRegistry()); 41 } 42 43 virtual void getAnalysisUsage(AnalysisUsage &au) const; 44 45 virtual bool runOnMachineFunction(MachineFunction &fn); 46 47 virtual void releaseMemory(); 48 49 50 private: 51 52 MachineFunction *mf; 53 LiveIntervals *lis; 54 MachineLoopInfo *mli; 55 MachineRegisterInfo *mri; 56 MachineDominatorTree *mdt; 57 SlotIndexes *sis; 58 const TargetInstrInfo *tii; 59 const TargetRegisterInfo *tri; 60 61 std::string fqn; 62 std::deque<LiveInterval*> intervals; 63 64 typedef std::pair<SlotIndex, SlotIndex> SlotPair; 65 typedef std::vector<SlotPair> LoopRanges; 66 typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap; 67 LoopRangeMap loopRangeMap; 68 69 void dumpLoopInfo(MachineLoop &loop); 70 71 void dumpOddTerminators(); 72 73 void updateTerminators(MachineBasicBlock &mbb); 74 75 bool canInsertPreHeader(MachineLoop &loop); 76 MachineBasicBlock& insertPreHeader(MachineLoop &loop); 77 78 bool isCriticalEdge(MachineLoop::Edge &edge); 79 bool canSplitEdge(MachineLoop::Edge &edge); 80 MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop); 81 82 LoopRanges& getLoopRanges(MachineLoop &loop); 83 std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr, 84 MachineLoop &loop); 85 86 void dumpLoopRanges(MachineLoop &loop); 87 88 void processHeader(LoopSplit &split); 89 void processLoopExits(LoopSplit &split); 90 void processLoopUses(LoopSplit &split); 91 92 bool splitOverLoop(LiveInterval &li, MachineLoop &loop); 93 94 void processInterval(LiveInterval &li); 95 96 void processIntervals(); 97 }; 98 99 } 100 101 #endif 102