Add a getName function to MachineFunction. Use it in places that previously did getFu...
[oota-llvm.git] / lib / CodeGen / CalcSpillWeights.cpp
1 //===------------------------ CalcSpillWeights.cpp ------------------------===//
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 #define DEBUG_TYPE "calcspillweights"
11
12 #include "llvm/ADT/SmallSet.h"
13 #include "llvm/CodeGen/CalcSpillWeights.h"
14 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
15 #include "llvm/CodeGen/MachineFunction.h"
16 #include "llvm/CodeGen/MachineLoopInfo.h"
17 #include "llvm/CodeGen/MachineRegisterInfo.h"
18 #include "llvm/CodeGen/SlotIndexes.h"
19 #include "llvm/Support/Debug.h"
20 #include "llvm/Support/raw_ostream.h"
21 #include "llvm/Target/TargetInstrInfo.h"
22 #include "llvm/Target/TargetMachine.h"
23 #include "llvm/Target/TargetRegisterInfo.h"
24 using namespace llvm;
25
26 char CalculateSpillWeights::ID = 0;
27 INITIALIZE_PASS_BEGIN(CalculateSpillWeights, "calcspillweights",
28                 "Calculate spill weights", false, false)
29 INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
30 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
31 INITIALIZE_PASS_END(CalculateSpillWeights, "calcspillweights",
32                 "Calculate spill weights", false, false)
33
34 void CalculateSpillWeights::getAnalysisUsage(AnalysisUsage &au) const {
35   au.addRequired<LiveIntervals>();
36   au.addRequired<MachineLoopInfo>();
37   au.setPreservesAll();
38   MachineFunctionPass::getAnalysisUsage(au);
39 }
40
41 bool CalculateSpillWeights::runOnMachineFunction(MachineFunction &MF) {
42
43   DEBUG(dbgs() << "********** Compute Spill Weights **********\n"
44                << "********** Function: "
45                << MF.getName() << '\n');
46
47   LiveIntervals &LIS = getAnalysis<LiveIntervals>();
48   MachineRegisterInfo &MRI = MF.getRegInfo();
49   VirtRegAuxInfo VRAI(MF, LIS, getAnalysis<MachineLoopInfo>());
50   for (unsigned i = 0, e = MRI.getNumVirtRegs(); i != e; ++i) {
51     unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
52     if (MRI.reg_nodbg_empty(Reg))
53       continue;
54     VRAI.CalculateWeightAndHint(LIS.getInterval(Reg));
55   }
56   return false;
57 }
58
59 // Return the preferred allocation register for reg, given a COPY instruction.
60 static unsigned copyHint(const MachineInstr *mi, unsigned reg,
61                          const TargetRegisterInfo &tri,
62                          const MachineRegisterInfo &mri) {
63   unsigned sub, hreg, hsub;
64   if (mi->getOperand(0).getReg() == reg) {
65     sub = mi->getOperand(0).getSubReg();
66     hreg = mi->getOperand(1).getReg();
67     hsub = mi->getOperand(1).getSubReg();
68   } else {
69     sub = mi->getOperand(1).getSubReg();
70     hreg = mi->getOperand(0).getReg();
71     hsub = mi->getOperand(0).getSubReg();
72   }
73
74   if (!hreg)
75     return 0;
76
77   if (TargetRegisterInfo::isVirtualRegister(hreg))
78     return sub == hsub ? hreg : 0;
79
80   const TargetRegisterClass *rc = mri.getRegClass(reg);
81
82   // Only allow physreg hints in rc.
83   if (sub == 0)
84     return rc->contains(hreg) ? hreg : 0;
85
86   // reg:sub should match the physreg hreg.
87   return tri.getMatchingSuperReg(hreg, sub, rc);
88 }
89
90 // Check if all values in LI are rematerializable
91 static bool isRematerializable(const LiveInterval &LI,
92                                const LiveIntervals &LIS,
93                                const TargetInstrInfo &TII) {
94   for (LiveInterval::const_vni_iterator I = LI.vni_begin(), E = LI.vni_end();
95        I != E; ++I) {
96     const VNInfo *VNI = *I;
97     if (VNI->isUnused())
98       continue;
99     if (VNI->isPHIDef())
100       return false;
101
102     MachineInstr *MI = LIS.getInstructionFromIndex(VNI->def);
103     assert(MI && "Dead valno in interval");
104
105     if (!TII.isTriviallyReMaterializable(MI, LIS.getAliasAnalysis()))
106       return false;
107   }
108   return true;
109 }
110
111 void VirtRegAuxInfo::CalculateWeightAndHint(LiveInterval &li) {
112   MachineRegisterInfo &mri = MF.getRegInfo();
113   const TargetRegisterInfo &tri = *MF.getTarget().getRegisterInfo();
114   MachineBasicBlock *mbb = 0;
115   MachineLoop *loop = 0;
116   unsigned loopDepth = 0;
117   bool isExiting = false;
118   float totalWeight = 0;
119   SmallPtrSet<MachineInstr*, 8> visited;
120
121   // Find the best physreg hist and the best virtreg hint.
122   float bestPhys = 0, bestVirt = 0;
123   unsigned hintPhys = 0, hintVirt = 0;
124
125   // Don't recompute a target specific hint.
126   bool noHint = mri.getRegAllocationHint(li.reg).first != 0;
127
128   // Don't recompute spill weight for an unspillable register.
129   bool Spillable = li.isSpillable();
130
131   for (MachineRegisterInfo::reg_iterator I = mri.reg_begin(li.reg);
132        MachineInstr *mi = I.skipInstruction();) {
133     if (mi->isIdentityCopy() || mi->isImplicitDef() || mi->isDebugValue())
134       continue;
135     if (!visited.insert(mi))
136       continue;
137
138     float weight = 1.0f;
139     if (Spillable) {
140       // Get loop info for mi.
141       if (mi->getParent() != mbb) {
142         mbb = mi->getParent();
143         loop = Loops.getLoopFor(mbb);
144         loopDepth = loop ? loop->getLoopDepth() : 0;
145         isExiting = loop ? loop->isLoopExiting(mbb) : false;
146       }
147
148       // Calculate instr weight.
149       bool reads, writes;
150       tie(reads, writes) = mi->readsWritesVirtualRegister(li.reg);
151       weight = LiveIntervals::getSpillWeight(writes, reads, loopDepth);
152
153       // Give extra weight to what looks like a loop induction variable update.
154       if (writes && isExiting && LIS.isLiveOutOfMBB(li, mbb))
155         weight *= 3;
156
157       totalWeight += weight;
158     }
159
160     // Get allocation hints from copies.
161     if (noHint || !mi->isCopy())
162       continue;
163     unsigned hint = copyHint(mi, li.reg, tri, mri);
164     if (!hint)
165       continue;
166     float hweight = Hint[hint] += weight;
167     if (TargetRegisterInfo::isPhysicalRegister(hint)) {
168       if (hweight > bestPhys && LIS.isAllocatable(hint))
169         bestPhys = hweight, hintPhys = hint;
170     } else {
171       if (hweight > bestVirt)
172         bestVirt = hweight, hintVirt = hint;
173     }
174   }
175
176   Hint.clear();
177
178   // Always prefer the physreg hint.
179   if (unsigned hint = hintPhys ? hintPhys : hintVirt) {
180     mri.setRegAllocationHint(li.reg, 0, hint);
181     // Weakly boost the spill weight of hinted registers.
182     totalWeight *= 1.01F;
183   }
184
185   // If the live interval was already unspillable, leave it that way.
186   if (!Spillable)
187     return;
188
189   // Mark li as unspillable if all live ranges are tiny.
190   if (li.isZeroLength(LIS.getSlotIndexes())) {
191     li.markNotSpillable();
192     return;
193   }
194
195   // If all of the definitions of the interval are re-materializable,
196   // it is a preferred candidate for spilling.
197   // FIXME: this gets much more complicated once we support non-trivial
198   // re-materialization.
199   if (isRematerializable(li, LIS, *MF.getTarget().getInstrInfo()))
200     totalWeight *= 0.5F;
201
202   li.weight = normalizeSpillWeight(totalWeight, li.getSize());
203 }