Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: src/IceRegAlloc.cpp

Issue 380363002: Subzero: Fix a regalloc bug involving too-aggressive AllowRegisterOverlap. (Closed) Base URL: https://gerrit.chromium.org/gerrit/p/native_client/pnacl-subzero.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceCfg.cpp ('k') | src/IceTargetLoweringX8632.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/IceCfg.cpp ('k') | src/IceTargetLoweringX8632.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698