1 //===-- llvm/CodeGen/Splitter.h - Splitter -*- C++ -*----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_CODEGEN_SPLITTER_H
11 #define LLVM_CODEGEN_SPLITTER_H
13 #include "llvm/CodeGen/MachineFunctionPass.h"
14 #include "llvm/CodeGen/MachineLoopInfo.h"
15 #include "llvm/CodeGen/SlotIndexes.h"
28 class MachineDominatorTree;
29 class MachineRegisterInfo;
31 class TargetInstrInfo;
34 class LoopSplitter : public MachineFunctionPass {
35 friend class LoopSplit;
39 LoopSplitter() : MachineFunctionPass(ID) {}
41 virtual void getAnalysisUsage(AnalysisUsage &au) const;
43 virtual bool runOnMachineFunction(MachineFunction &fn);
45 virtual void releaseMemory();
53 MachineRegisterInfo *mri;
54 MachineDominatorTree *mdt;
56 const TargetInstrInfo *tii;
57 const TargetRegisterInfo *tri;
60 std::deque<LiveInterval*> intervals;
62 typedef std::pair<SlotIndex, SlotIndex> SlotPair;
63 typedef std::vector<SlotPair> LoopRanges;
64 typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap;
65 LoopRangeMap loopRangeMap;
67 void dumpLoopInfo(MachineLoop &loop);
69 void dumpOddTerminators();
71 void updateTerminators(MachineBasicBlock &mbb);
73 bool canInsertPreHeader(MachineLoop &loop);
74 MachineBasicBlock& insertPreHeader(MachineLoop &loop);
76 bool isCriticalEdge(MachineLoop::Edge &edge);
77 bool canSplitEdge(MachineLoop::Edge &edge);
78 MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop);
80 LoopRanges& getLoopRanges(MachineLoop &loop);
81 std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr,
84 void dumpLoopRanges(MachineLoop &loop);
86 void processHeader(LoopSplit &split);
87 void processLoopExits(LoopSplit &split);
88 void processLoopUses(LoopSplit &split);
90 bool splitOverLoop(LiveInterval &li, MachineLoop &loop);
92 void processInterval(LiveInterval &li);
94 void processIntervals();