Rename getFixedStack to getStackObject. The stack objects represented are not
[oota-llvm.git] / lib / CodeGen / ScheduleDAGInstrs.h
1 //==- ScheduleDAGInstrs.h - MachineInstr Scheduling --------------*- 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 // This file implements the ScheduleDAGInstrs class, which implements
11 // scheduling for a MachineInstr-based dependency graph.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef SCHEDULEDAGINSTRS_H
16 #define SCHEDULEDAGINSTRS_H
17
18 #include "llvm/CodeGen/MachineDominators.h"
19 #include "llvm/CodeGen/MachineLoopInfo.h"
20 #include "llvm/CodeGen/ScheduleDAG.h"
21 #include "llvm/Support/Compiler.h"
22 #include "llvm/Target/TargetRegisterInfo.h"
23 #include "llvm/ADT/DenseMap.h"
24 #include "llvm/ADT/SmallSet.h"
25 #include <map>
26
27 namespace llvm {
28   class MachineLoopInfo;
29   class MachineDominatorTree;
30
31   /// LoopDependencies - This class analyzes loop-oriented register
32   /// dependencies, which are used to guide scheduling decisions.
33   /// For example, loop induction variable increments should be
34   /// scheduled as soon as possible after the variable's last use.
35   ///
36   class VISIBILITY_HIDDEN LoopDependencies {
37     const MachineLoopInfo &MLI;
38     const MachineDominatorTree &MDT;
39
40   public:
41     typedef std::map<unsigned, std::pair<const MachineOperand *, unsigned> >
42       LoopDeps;
43     LoopDeps Deps;
44
45     LoopDependencies(const MachineLoopInfo &mli,
46                      const MachineDominatorTree &mdt) :
47       MLI(mli), MDT(mdt) {}
48
49     /// VisitLoop - Clear out any previous state and analyze the given loop.
50     ///
51     void VisitLoop(const MachineLoop *Loop) {
52       Deps.clear();
53       MachineBasicBlock *Header = Loop->getHeader();
54       SmallSet<unsigned, 8> LoopLiveIns;
55       for (MachineBasicBlock::livein_iterator LI = Header->livein_begin(),
56            LE = Header->livein_end(); LI != LE; ++LI)
57         LoopLiveIns.insert(*LI);
58
59       const MachineDomTreeNode *Node = MDT.getNode(Header);
60       const MachineBasicBlock *MBB = Node->getBlock();
61       assert(Loop->contains(MBB) &&
62              "Loop does not contain header!");
63       VisitRegion(Node, MBB, Loop, LoopLiveIns);
64     }
65
66   private:
67     void VisitRegion(const MachineDomTreeNode *Node,
68                      const MachineBasicBlock *MBB,
69                      const MachineLoop *Loop,
70                      const SmallSet<unsigned, 8> &LoopLiveIns) {
71       unsigned Count = 0;
72       for (MachineBasicBlock::const_iterator I = MBB->begin(), E = MBB->end();
73            I != E; ++I, ++Count) {
74         const MachineInstr *MI = I;
75         for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
76           const MachineOperand &MO = MI->getOperand(i);
77           if (!MO.isReg() || !MO.isUse())
78             continue;
79           unsigned MOReg = MO.getReg();
80           if (LoopLiveIns.count(MOReg))
81             Deps.insert(std::make_pair(MOReg, std::make_pair(&MO, Count)));
82         }
83       }
84
85       const std::vector<MachineDomTreeNode*> &Children = Node->getChildren();
86       for (std::vector<MachineDomTreeNode*>::const_iterator I =
87            Children.begin(), E = Children.end(); I != E; ++I) {
88         const MachineDomTreeNode *ChildNode = *I;
89         MachineBasicBlock *ChildBlock = ChildNode->getBlock();
90         if (Loop->contains(ChildBlock))
91           VisitRegion(ChildNode, ChildBlock, Loop, LoopLiveIns);
92       }
93     }
94   };
95
96   /// ScheduleDAGInstrs - A ScheduleDAG subclass for scheduling lists of
97   /// MachineInstrs.
98   class VISIBILITY_HIDDEN ScheduleDAGInstrs : public ScheduleDAG {
99     const MachineLoopInfo &MLI;
100     const MachineDominatorTree &MDT;
101
102     /// Defs, Uses - Remember where defs and uses of each physical register
103     /// are as we iterate upward through the instructions. This is allocated
104     /// here instead of inside BuildSchedGraph to avoid the need for it to be
105     /// initialized and destructed for each block.
106     std::vector<SUnit *> Defs[TargetRegisterInfo::FirstVirtualRegister];
107     std::vector<SUnit *> Uses[TargetRegisterInfo::FirstVirtualRegister];
108
109     /// PendingLoads - Remember where unknown loads are after the most recent
110     /// unknown store, as we iterate. As with Defs and Uses, this is here
111     /// to minimize construction/destruction.
112     std::vector<SUnit *> PendingLoads;
113
114     /// LoopRegs - Track which registers are used for loop-carried dependencies.
115     ///
116     LoopDependencies LoopRegs;
117
118     /// LoopLiveInRegs - Track which regs are live into a loop, to help guide
119     /// back-edge-aware scheduling.
120     ///
121     SmallSet<unsigned, 8> LoopLiveInRegs;
122
123   public:
124     MachineBasicBlock::iterator Begin;    // The beginning of the range to
125                                           // be scheduled. The range extends
126                                           // to InsertPos.
127     unsigned InsertPosIndex;              // The index in BB of InsertPos.
128
129     explicit ScheduleDAGInstrs(MachineFunction &mf,
130                                const MachineLoopInfo &mli,
131                                const MachineDominatorTree &mdt);
132
133     virtual ~ScheduleDAGInstrs() {}
134
135     /// NewSUnit - Creates a new SUnit and return a ptr to it.
136     ///
137     SUnit *NewSUnit(MachineInstr *MI) {
138 #ifndef NDEBUG
139       const SUnit *Addr = SUnits.empty() ? 0 : &SUnits[0];
140 #endif
141       SUnits.push_back(SUnit(MI, (unsigned)SUnits.size()));
142       assert((Addr == 0 || Addr == &SUnits[0]) &&
143              "SUnits std::vector reallocated on the fly!");
144       SUnits.back().OrigNode = &SUnits.back();
145       return &SUnits.back();
146     }
147
148     /// Run - perform scheduling.
149     ///
150     void Run(MachineBasicBlock *bb,
151              MachineBasicBlock::iterator begin,
152              MachineBasicBlock::iterator end,
153              unsigned endindex);
154
155     /// BuildSchedGraph - Build SUnits from the MachineBasicBlock that we are
156     /// input.
157     virtual void BuildSchedGraph(AliasAnalysis *AA);
158
159     /// ComputeLatency - Compute node latency.
160     ///
161     virtual void ComputeLatency(SUnit *SU);
162
163     /// ComputeOperandLatency - Override dependence edge latency using
164     /// operand use/def information
165     ///
166     virtual void ComputeOperandLatency(SUnit *Def, SUnit *Use,
167                                        SDep& dep) const;
168
169     virtual MachineBasicBlock*
170     EmitSchedule(DenseMap<MachineBasicBlock*, MachineBasicBlock*>*);
171
172     /// StartBlock - Prepare to perform scheduling in the given block.
173     ///
174     virtual void StartBlock(MachineBasicBlock *BB);
175
176     /// Schedule - Order nodes according to selected style, filling
177     /// in the Sequence member.
178     ///
179     virtual void Schedule() = 0;
180
181     /// FinishBlock - Clean up after scheduling in the given block.
182     ///
183     virtual void FinishBlock();
184
185     virtual void dumpNode(const SUnit *SU) const;
186
187     virtual std::string getGraphNodeLabel(const SUnit *SU) const;
188   };
189 }
190
191 #endif