blob: 2b0645dfdcd715343995ea4571ad69bfc1e1e316 [file] [log] [blame]
Lang Hames60f422f2010-07-17 07:34:01 +00001//===-- 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
22namespace llvm {
23
24 class LiveInterval;
25 class LiveIntervals;
Douglas Gregor806de352010-07-18 11:47:56 +000026 struct LiveRange;
Lang Hames60f422f2010-07-17 07:34:01 +000027 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