Changeset 192355 in webkit
- Timestamp:
- Nov 11, 2015, 11:38:00 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r192353 r192355 1 2015-11-11 Benjamin Poulain <bpoulain@apple.com> 2 3 [JSC] Air: we have more register than what the allocator believed 4 https://bugs.webkit.org/show_bug.cgi?id=151182 5 6 Reviewed by Michael Saboff. 7 8 I was using GPRInfo/FPRInfo to get the number of register while coloring the interference graph. 9 The problem is, those classes are lying about register availability. 10 11 They don't report stuff reserved by the MacroAssembler and reserve some registers. 12 FPRInfo is the worst, reporting only 6 of the 15 registers we have. 13 14 The ground truth in our case is that we can color with all the registers returned 15 by regsInPriorityOrder(). I changed IteratedRegisterCoalescingAllocator to use that value. 16 17 The new test testSpillFP() covers simple spilling of doubles. 18 19 * b3/air/AirIteratedRegisterCoalescing.cpp: 20 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::IteratedRegisterCoalescingAllocator): 21 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::makeWorkList): 22 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::decrementDegree): 23 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::precoloredCoalescingHeuristic): 24 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::conservativeHeuristic): 25 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::addWorkList): 26 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::combine): 27 (JSC::B3::Air::IteratedRegisterCoalescingAllocator::freezeMoves): 28 * b3/testb3.cpp: 29 (JSC::B3::testSpillFP): 30 (JSC::B3::run): 31 1 32 2015-11-11 Mark Lam <mark.lam@apple.com> 2 33 -
trunk/Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp
r192292 r192355 129 129 130 130 template<Arg::Type type> 131 struct Bank;132 133 template<>134 struct Bank<Arg::GP> {135 typedef GPRInfo Info;136 };137 138 template<>139 struct Bank<Arg::FP> {140 typedef FPRInfo Info;141 };142 143 template<Arg::Type type>144 131 class IteratedRegisterCoalescingAllocator { 145 132 public: 146 133 IteratedRegisterCoalescingAllocator(Code& code) 134 : m_numberOfRegisters(regsInPriorityOrder(type).size()) 147 135 { 148 136 initializeDegrees(code); … … 325 313 Tmp tmp = AbsoluteTmpHelper<type>::tmpFromAbsoluteIndex(i); 326 314 327 if (degree >= Bank<type>::Info::numberOfRegisters)315 if (degree >= m_numberOfRegisters) 328 316 m_spillWorklist.add(tmp); 329 317 else if (!m_moveList[AbsoluteTmpHelper<type>::absoluteIndex(tmp)].isEmpty()) … … 367 355 368 356 unsigned oldDegree = m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(tmp)]--; 369 if (oldDegree == Bank<type>::Info::numberOfRegisters) {357 if (oldDegree == m_numberOfRegisters) { 370 358 enableMovesOnValueAndAdjacents(tmp); 371 359 m_spillWorklist.remove(tmp); … … 473 461 if (!adjacentTmp.isReg() 474 462 && !hasBeenSimplified(adjacentTmp) 475 && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(adjacentTmp)] >= Bank<type>::Info::numberOfRegisters463 && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(adjacentTmp)] >= m_numberOfRegisters 476 464 && !m_interferenceEdges.contains(InterferenceEdge(u, adjacentTmp))) 477 465 return false; … … 494 482 auto adjacentsOfV = m_adjacencyList[AbsoluteTmpHelper<type>::absoluteIndex(v)]; 495 483 496 if (adjacentsOfU.size() + adjacentsOfV.size() < Bank<type>::Info::numberOfRegisters) {484 if (adjacentsOfU.size() + adjacentsOfV.size() < m_numberOfRegisters) { 497 485 // Shortcut: if the total number of adjacents is less than the number of register, the condition is always met. 498 486 return true; … … 504 492 ASSERT(adjacentTmp != v); 505 493 ASSERT(adjacentTmp != u); 506 if (!hasBeenSimplified(adjacentTmp) && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(adjacentTmp)] >= Bank<type>::Info::numberOfRegisters) {494 if (!hasBeenSimplified(adjacentTmp) && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(adjacentTmp)] >= m_numberOfRegisters) { 507 495 auto addResult = highOrderAdjacents.add(adjacentTmp); 508 if (addResult.isNewEntry && highOrderAdjacents.size() >= Bank<type>::Info::numberOfRegisters)496 if (addResult.isNewEntry && highOrderAdjacents.size() >= m_numberOfRegisters) 509 497 return false; 510 498 } … … 513 501 ASSERT(adjacentTmp != u); 514 502 ASSERT(adjacentTmp != v); 515 if (!hasBeenSimplified(adjacentTmp) && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(adjacentTmp)] >= Bank<type>::Info::numberOfRegisters) {503 if (!hasBeenSimplified(adjacentTmp) && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(adjacentTmp)] >= m_numberOfRegisters) { 516 504 auto addResult = highOrderAdjacents.add(adjacentTmp); 517 if (addResult.isNewEntry && highOrderAdjacents.size() >= Bank<type>::Info::numberOfRegisters)505 if (addResult.isNewEntry && highOrderAdjacents.size() >= m_numberOfRegisters) 518 506 return false; 519 507 } 520 508 } 521 509 522 ASSERT(highOrderAdjacents.size() < Bank<type>::Info::numberOfRegisters);510 ASSERT(highOrderAdjacents.size() < m_numberOfRegisters); 523 511 return true; 524 512 } … … 526 514 void addWorkList(Tmp tmp) 527 515 { 528 if (!tmp.isReg() && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(tmp)] < Bank<type>::Info::numberOfRegisters && !isMoveRelated(tmp)) {516 if (!tmp.isReg() && m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(tmp)] < m_numberOfRegisters && !isMoveRelated(tmp)) { 529 517 m_freezeWorklist.remove(tmp); 530 518 m_simplifyWorklist.append(tmp); … … 548 536 }); 549 537 550 if (m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(u)] >= Bank<type>::Info::numberOfRegisters && m_freezeWorklist.remove(u))538 if (m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(u)] >= m_numberOfRegisters && m_freezeWorklist.remove(u)) 551 539 m_spillWorklist.add(u); 552 540 } … … 566 554 567 555 Tmp otherTmp = inst.args[0].tmp() != tmp ? inst.args[0].tmp() : inst.args[1].tmp(); 568 if (m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(otherTmp)] < Bank<type>::Info::numberOfRegisters && !isMoveRelated(otherTmp)) {556 if (m_degrees[AbsoluteTmpHelper<type>::absoluteIndex(otherTmp)] < m_numberOfRegisters && !isMoveRelated(otherTmp)) { 569 557 m_freezeWorklist.remove(otherTmp); 570 558 m_simplifyWorklist.append(otherTmp); … … 755 743 typedef SimpleClassHashTraits<InterferenceEdge> InterferenceEdgeHashTraits; 756 744 745 unsigned m_numberOfRegisters { 0 }; 746 757 747 // The interference graph. 758 748 HashSet<InterferenceEdge, InterferenceEdgeHash, InterferenceEdgeHashTraits> m_interferenceEdges; -
trunk/Source/JavaScriptCore/b3/testb3.cpp
r192347 r192355 2076 2076 root->appendNew<ControlValue>(proc, Return, Origin(), total); 2077 2077 compileAndRun<int>(proc, 1, 2); 2078 } 2079 2080 void testSpillFP() 2081 { 2082 Procedure proc; 2083 BasicBlock* root = proc.addBlock(); 2084 2085 Vector<Value*> sources; 2086 sources.append(root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)); 2087 sources.append(root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR1)); 2088 2089 for (unsigned i = 0; i < 30; ++i) { 2090 sources.append( 2091 root->appendNew<Value>(proc, Add, Origin(), sources[sources.size() - 1], sources[sources.size() - 2]) 2092 ); 2093 } 2094 2095 Value* total = root->appendNew<ConstDoubleValue>(proc, Origin(), 0.); 2096 for (Value* value : sources) 2097 total = root->appendNew<Value>(proc, Add, Origin(), total, value); 2098 2099 root->appendNew<ControlValue>(proc, Return, Origin(), total); 2100 compileAndRun<double>(proc, 1.1, 2.5); 2078 2101 } 2079 2102 … … 3883 3906 3884 3907 RUN(testSpillGP()); 3908 RUN(testSpillFP()); 3885 3909 3886 3910 RUN(testCallSimple(1, 2));
Note:
See TracChangeset
for help on using the changeset viewer.