2b0645dfdcd715343995ea4571ad69bfc1e1e316
[oota-llvm.git] / lib / CodeGen / Splitter.h
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
39     LoopSplitter() : MachineFunctionPass(&ID) {}
40
41     virtual void getAnalysisUsage(AnalysisUsage &au) const;
42
43     virtual bool runOnMachineFunction(MachineFunction &fn);
44
45     virtual void releaseMemory();
46
47
48   private:
49
50     MachineFunction *mf;
51     LiveIntervals *lis;
52     MachineLoopInfo *mli;
53     MachineRegisterInfo *mri;
54     MachineDominatorTree *mdt;
55     SlotIndexes *sis;
56     const TargetInstrInfo *tii;
57     const TargetRegisterInfo *tri;
58
59     std::string fqn;
60     std::deque<LiveInterval*> intervals;
61
62     typedef std::pair<SlotIndex, SlotIndex> SlotPair;
63     typedef std::vector<SlotPair> LoopRanges;
64     typedef std::map<MachineLoop*, LoopRanges> LoopRangeMap;
65     LoopRangeMap loopRangeMap;
66
67     void dumpLoopInfo(MachineLoop &loop);
68
69     void dumpOddTerminators();
70
71     void updateTerminators(MachineBasicBlock &mbb);
72
73     bool canInsertPreHeader(MachineLoop &loop);
74     MachineBasicBlock& insertPreHeader(MachineLoop &loop);
75
76     bool isCriticalEdge(MachineLoop::Edge &edge);
77     bool canSplitEdge(MachineLoop::Edge &edge);
78     MachineBasicBlock& splitEdge(MachineLoop::Edge &edge, MachineLoop &loop);
79
80     LoopRanges& getLoopRanges(MachineLoop &loop);
81     std::pair<bool, SlotPair> getLoopSubRange(const LiveRange &lr,
82                                               MachineLoop &loop);
83
84     void dumpLoopRanges(MachineLoop &loop);
85
86     void processHeader(LoopSplit &split);
87     void processLoopExits(LoopSplit &split);
88     void processLoopUses(LoopSplit &split);
89
90     bool splitOverLoop(LiveInterval &li, MachineLoop &loop);
91
92     void processInterval(LiveInterval &li);
93
94     void processIntervals();
95   };
96
97 }
98
99 #endif