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

Side by Side Diff: src/IceCfg.cpp

Issue 1738683003: Subzero. Moar performance tweaks. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments Created 4 years, 9 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
OLDNEW
1 //===- subzero/src/IceCfg.cpp - Control flow graph implementation ---------===// 1 //===- subzero/src/IceCfg.cpp - Control flow graph 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 /// \file 10 /// \file
11 /// \brief Implements the Cfg class. 11 /// \brief Implements the Cfg class.
12 /// 12 ///
13 //===----------------------------------------------------------------------===// 13 //===----------------------------------------------------------------------===//
14 14
15 #include "IceCfg.h" 15 #include "IceCfg.h"
16 16
17 #include "IceAssembler.h" 17 #include "IceAssembler.h"
18 #include "IceBitVector.h"
18 #include "IceCfgNode.h" 19 #include "IceCfgNode.h"
19 #include "IceClFlags.h" 20 #include "IceClFlags.h"
20 #include "IceDefs.h" 21 #include "IceDefs.h"
21 #include "IceELFObjectWriter.h" 22 #include "IceELFObjectWriter.h"
22 #include "IceGlobalInits.h" 23 #include "IceGlobalInits.h"
23 #include "IceInst.h" 24 #include "IceInst.h"
24 #include "IceInstVarIter.h" 25 #include "IceInstVarIter.h"
25 #include "IceLiveness.h" 26 #include "IceLiveness.h"
26 #include "IceLoopAnalyzer.h" 27 #include "IceLoopAnalyzer.h"
27 #include "IceOperand.h" 28 #include "IceOperand.h"
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 getContext()->dumpTimers(); 231 getContext()->dumpTimers();
231 } 232 }
232 233
233 void Cfg::computeInOutEdges() { 234 void Cfg::computeInOutEdges() {
234 // Compute the out-edges. 235 // Compute the out-edges.
235 for (CfgNode *Node : Nodes) 236 for (CfgNode *Node : Nodes)
236 Node->computeSuccessors(); 237 Node->computeSuccessors();
237 238
238 // Prune any unreachable nodes before computing in-edges. 239 // Prune any unreachable nodes before computing in-edges.
239 SizeT NumNodes = getNumNodes(); 240 SizeT NumNodes = getNumNodes();
240 llvm::BitVector Reachable(NumNodes); 241 BitVector Reachable(NumNodes);
241 llvm::BitVector Pending(NumNodes); 242 BitVector Pending(NumNodes);
242 Pending.set(getEntryNode()->getIndex()); 243 Pending.set(getEntryNode()->getIndex());
243 while (true) { 244 while (true) {
244 int Index = Pending.find_first(); 245 int Index = Pending.find_first();
245 if (Index == -1) 246 if (Index == -1)
246 break; 247 break;
247 Pending.reset(Index); 248 Pending.reset(Index);
248 Reachable.set(Index); 249 Reachable.set(Index);
249 CfgNode *Node = Nodes[Index]; 250 CfgNode *Node = Nodes[Index];
250 assert(Node->getIndex() == (SizeT)Index); 251 assert(Node->getIndex() == (SizeT)Index);
251 for (CfgNode *Succ : Node->getOutEdges()) { 252 for (CfgNode *Succ : Node->getOutEdges()) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 Reordered.reserve(Placed.size() + Unreachable.size()); 421 Reordered.reserve(Placed.size() + Unreachable.size());
421 for (CfgNode *Node : Placed) 422 for (CfgNode *Node : Placed)
422 Reordered.push_back(Node); 423 Reordered.push_back(Node);
423 for (CfgNode *Node : Unreachable) 424 for (CfgNode *Node : Unreachable)
424 Reordered.push_back(Node); 425 Reordered.push_back(Node);
425 assert(getNumNodes() == Reordered.size()); 426 assert(getNumNodes() == Reordered.size());
426 swapNodes(Reordered); 427 swapNodes(Reordered);
427 } 428 }
428 429
429 namespace { 430 namespace {
430 void getRandomPostOrder(CfgNode *Node, llvm::BitVector &ToVisit, 431 void getRandomPostOrder(CfgNode *Node, BitVector &ToVisit,
431 Ice::NodeList &PostOrder, 432 Ice::NodeList &PostOrder,
432 Ice::RandomNumberGenerator *RNG) { 433 Ice::RandomNumberGenerator *RNG) {
433 assert(ToVisit[Node->getIndex()]); 434 assert(ToVisit[Node->getIndex()]);
434 ToVisit[Node->getIndex()] = false; 435 ToVisit[Node->getIndex()] = false;
435 NodeList Outs = Node->getOutEdges(); 436 NodeList Outs = Node->getOutEdges();
436 Ice::RandomShuffle(Outs.begin(), Outs.end(), 437 Ice::RandomShuffle(Outs.begin(), Outs.end(),
437 [RNG](int N) { return RNG->next(N); }); 438 [RNG](int N) { return RNG->next(N); });
438 for (CfgNode *Next : Outs) { 439 for (CfgNode *Next : Outs) {
439 if (ToVisit[Next->getIndex()]) 440 if (ToVisit[Next->getIndex()])
440 getRandomPostOrder(Next, ToVisit, PostOrder, RNG); 441 getRandomPostOrder(Next, ToVisit, PostOrder, RNG);
441 } 442 }
442 PostOrder.push_back(Node); 443 PostOrder.push_back(Node);
443 } 444 }
444 } // end of anonymous namespace 445 } // end of anonymous namespace
445 446
446 void Cfg::shuffleNodes() { 447 void Cfg::shuffleNodes() {
447 if (!Ctx->getFlags().shouldReorderBasicBlocks()) 448 if (!Ctx->getFlags().shouldReorderBasicBlocks())
448 return; 449 return;
449 450
450 NodeList ReversedReachable; 451 NodeList ReversedReachable;
451 NodeList Unreachable; 452 NodeList Unreachable;
452 llvm::BitVector ToVisit(Nodes.size(), true); 453 BitVector ToVisit(Nodes.size(), true);
453 // Create Random number generator for function reordering 454 // Create Random number generator for function reordering
454 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(), 455 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(),
455 RPE_BasicBlockReordering, SequenceNumber); 456 RPE_BasicBlockReordering, SequenceNumber);
456 // Traverse from entry node. 457 // Traverse from entry node.
457 getRandomPostOrder(getEntryNode(), ToVisit, ReversedReachable, &RNG); 458 getRandomPostOrder(getEntryNode(), ToVisit, ReversedReachable, &RNG);
458 // Collect the unreachable nodes. 459 // Collect the unreachable nodes.
459 for (CfgNode *Node : Nodes) 460 for (CfgNode *Node : Nodes)
460 if (ToVisit[Node->getIndex()]) 461 if (ToVisit[Node->getIndex()])
461 Unreachable.push_back(Node); 462 Unreachable.push_back(Node);
462 // Copy the layout list to the Nodes. 463 // Copy the layout list to the Nodes.
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 for (CfgNode *Node : Nodes) 807 for (CfgNode *Node : Nodes)
807 Node->livenessLightweight(); 808 Node->livenessLightweight();
808 } 809 }
809 810
810 void Cfg::liveness(LivenessMode Mode) { 811 void Cfg::liveness(LivenessMode Mode) {
811 TimerMarker T(TimerStack::TT_liveness, this); 812 TimerMarker T(TimerStack::TT_liveness, this);
812 Live.reset(new Liveness(this, Mode)); 813 Live.reset(new Liveness(this, Mode));
813 getVMetadata()->init(VMK_Uses); 814 getVMetadata()->init(VMK_Uses);
814 Live->init(); 815 Live->init();
815 // Initialize with all nodes needing to be processed. 816 // Initialize with all nodes needing to be processed.
816 llvm::BitVector NeedToProcess(Nodes.size(), true); 817 BitVector NeedToProcess(Nodes.size(), true);
817 while (NeedToProcess.any()) { 818 while (NeedToProcess.any()) {
818 // Iterate in reverse topological order to speed up convergence. 819 // Iterate in reverse topological order to speed up convergence.
819 for (CfgNode *Node : reverse_range(Nodes)) { 820 for (CfgNode *Node : reverse_range(Nodes)) {
820 if (NeedToProcess[Node->getIndex()]) { 821 if (NeedToProcess[Node->getIndex()]) {
821 NeedToProcess[Node->getIndex()] = false; 822 NeedToProcess[Node->getIndex()] = false;
822 bool Changed = Node->liveness(getLiveness()); 823 bool Changed = Node->liveness(getLiveness());
823 if (Changed) { 824 if (Changed) {
824 // If the beginning-of-block liveness changed since the last 825 // If the beginning-of-block liveness changed since the last
825 // iteration, mark all in-edges as needing to be processed. 826 // iteration, mark all in-edges as needing to be processed.
826 for (CfgNode *Pred : Node->getInEdges()) 827 for (CfgNode *Pred : Node->getInEdges())
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 } 1129 }
1129 } 1130 }
1130 // Print each basic block 1131 // Print each basic block
1131 for (CfgNode *Node : Nodes) 1132 for (CfgNode *Node : Nodes)
1132 Node->dump(this); 1133 Node->dump(this);
1133 if (isVerbose(IceV_Instructions)) 1134 if (isVerbose(IceV_Instructions))
1134 Str << "}\n"; 1135 Str << "}\n";
1135 } 1136 }
1136 1137
1137 } // end of namespace Ice 1138 } // end of namespace Ice
OLDNEW
« src/IceBitVector.h ('K') | « src/IceBitVector.h ('k') | src/IceDefs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698