OLD | NEW |
---|---|
1 //===- subzero/src/IceRegAlloc.cpp - Linear-scan implementation -----------===// | 1 //===- subzero/src/IceRegAlloc.cpp - Linear-scan implementation -----------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file implements the LinearScan class, which performs the | 10 // This file implements the LinearScan class, which performs the |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
198 // variables that were allowed marked with | 198 // variables that were allowed marked with |
199 // AllowRegisterOverlap. | 199 // AllowRegisterOverlap. |
200 Free[RegNum] = false; | 200 Free[RegNum] = false; |
201 } | 201 } |
202 } | 202 } |
203 | 203 |
204 // Remove registers from the Free[] list where an Unhandled range | 204 // Remove registers from the Free[] list where an Unhandled range |
205 // overlaps with the current range and is precolored. | 205 // overlaps with the current range and is precolored. |
206 // Cur.endsBefore(*I) is an early exit check that turns a | 206 // Cur.endsBefore(*I) is an early exit check that turns a |
207 // guaranteed O(N^2) algorithm into expected linear complexity. | 207 // guaranteed O(N^2) algorithm into expected linear complexity. |
208 llvm::SmallBitVector PrecoloredUnhandled(RegMask.size()); | |
208 for (OrderedRanges::const_iterator I = Unhandled.begin(), | 209 for (OrderedRanges::const_iterator I = Unhandled.begin(), |
209 E = Unhandled.end(); | 210 E = Unhandled.end(); |
210 I != E && !Cur.endsBefore(*I); ++I) { | 211 I != E && !Cur.endsBefore(*I); ++I) { |
211 LiveRangeWrapper Item = *I; | 212 LiveRangeWrapper Item = *I; |
212 if (Item.Var->hasReg() && Item.overlaps(Cur)) { | 213 if (Item.Var->hasReg() && Item.overlaps(Cur)) { |
213 Free[Item.Var->getRegNum()] = false; // Note: getRegNum not getRegNumTmp | 214 Free[Item.Var->getRegNum()] = false; // Note: getRegNum not getRegNumTmp |
215 PrecoloredUnhandled[Item.Var->getRegNum()] = true; | |
214 } | 216 } |
215 } | 217 } |
216 | 218 |
217 // Print info about physical register availability. | 219 // Print info about physical register availability. |
218 if (Func->getContext()->isVerbose(IceV_LinearScan)) { | 220 if (Func->getContext()->isVerbose(IceV_LinearScan)) { |
219 for (SizeT i = 0; i < RegMask.size(); ++i) { | 221 for (SizeT i = 0; i < RegMask.size(); ++i) { |
220 if (RegMask[i]) { | 222 if (RegMask[i]) { |
221 Str << Func->getTarget()->getRegName(i, IceType_i32) | 223 Str << Func->getTarget()->getRegName(i, IceType_i32) |
222 << "(U=" << RegUses[i] << ",F=" << Free[i] << ") "; | 224 << "(U=" << RegUses[i] << ",F=" << Free[i] << ") "; |
jvoung (off chromium)
2014/07/10 21:55:32
Maybe print the PrecoloredUnhandled[] status too.
jvoung (off chromium)
2014/07/10 21:56:42
Hmm, or I guess you can look at the Unhandled list
Jim Stichnoth
2014/07/10 22:32:10
Good idea, done. You're right that you can study
| |
223 } | 225 } |
224 } | 226 } |
225 Str << "\n"; | 227 Str << "\n"; |
226 } | 228 } |
227 | 229 |
228 Variable *Prefer = Cur.Var->getPreferredRegister(); | 230 Variable *Prefer = Cur.Var->getPreferredRegister(); |
229 int32_t PreferReg = Prefer && Prefer->hasRegTmp() ? Prefer->getRegNumTmp() | 231 int32_t PreferReg = Prefer && Prefer->hasRegTmp() ? Prefer->getRegNumTmp() |
230 : Variable::NoRegister; | 232 : Variable::NoRegister; |
233 bool AllowedToOverlap = Cur.Var->getRegisterOverlap() && | |
234 PreferReg != Variable::NoRegister && | |
235 !PrecoloredUnhandled[PreferReg]; | |
231 if (PreferReg != Variable::NoRegister && | 236 if (PreferReg != Variable::NoRegister && |
232 (Cur.Var->getRegisterOverlap() || Free[PreferReg])) { | 237 (AllowedToOverlap || Free[PreferReg])) { |
233 // First choice: a preferred register that is either free or is | 238 // First choice: a preferred register that is either free or is |
234 // allowed to overlap with its linked variable. | 239 // allowed to overlap with its linked variable. |
235 Cur.Var->setRegNumTmp(PreferReg); | 240 Cur.Var->setRegNumTmp(PreferReg); |
236 if (Func->getContext()->isVerbose(IceV_LinearScan)) { | 241 if (Func->getContext()->isVerbose(IceV_LinearScan)) { |
237 Str << "Preferring "; | 242 Str << "Preferring "; |
238 Cur.dump(Func); | 243 Cur.dump(Func); |
239 Str << "\n"; | 244 Str << "\n"; |
240 } | 245 } |
241 assert(RegUses[PreferReg] >= 0); | 246 assert(RegUses[PreferReg] >= 0); |
242 ++RegUses[PreferReg]; | 247 ++RegUses[PreferReg]; |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
452 } | 457 } |
453 Str << "++++++ Inactive:\n"; | 458 Str << "++++++ Inactive:\n"; |
454 for (UnorderedRanges::const_iterator I = Inactive.begin(), E = Inactive.end(); | 459 for (UnorderedRanges::const_iterator I = Inactive.begin(), E = Inactive.end(); |
455 I != E; ++I) { | 460 I != E; ++I) { |
456 I->dump(Func); | 461 I->dump(Func); |
457 Str << "\n"; | 462 Str << "\n"; |
458 } | 463 } |
459 } | 464 } |
460 | 465 |
461 } // end of namespace Ice | 466 } // end of namespace Ice |
OLD | NEW |