Chromium Code Reviews| 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 |