OLD | NEW |
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 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 ErrorMessage = Message; | 54 ErrorMessage = Message; |
55 } | 55 } |
56 | 56 |
57 CfgNode *Cfg::makeNode() { | 57 CfgNode *Cfg::makeNode() { |
58 SizeT LabelIndex = Nodes.size(); | 58 SizeT LabelIndex = Nodes.size(); |
59 CfgNode *Node = CfgNode::create(this, LabelIndex); | 59 CfgNode *Node = CfgNode::create(this, LabelIndex); |
60 Nodes.push_back(Node); | 60 Nodes.push_back(Node); |
61 return Node; | 61 return Node; |
62 } | 62 } |
63 | 63 |
| 64 void Cfg::swapNodes(NodeList &NewNodes) { |
| 65 Nodes.swap(NewNodes); |
| 66 for (SizeT I = 0, NumNodes = getNumNodes(); I < NumNodes; ++I) |
| 67 Nodes[I]->resetIndex(I); |
| 68 } |
| 69 |
64 void Cfg::addArg(Variable *Arg) { | 70 void Cfg::addArg(Variable *Arg) { |
65 Arg->setIsArg(); | 71 Arg->setIsArg(); |
66 Args.push_back(Arg); | 72 Args.push_back(Arg); |
67 } | 73 } |
68 | 74 |
69 void Cfg::addImplicitArg(Variable *Arg) { | 75 void Cfg::addImplicitArg(Variable *Arg) { |
70 Arg->setIsImplicitArg(); | 76 Arg->setIsImplicitArg(); |
71 ImplicitArgs.push_back(Arg); | 77 ImplicitArgs.push_back(Arg); |
72 } | 78 } |
73 | 79 |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 ++PredPosition; | 357 ++PredPosition; |
352 Placed.insert(PredPosition, Node); | 358 Placed.insert(PredPosition, Node); |
353 PlaceIndex[Node->getIndex()] = PredPosition; | 359 PlaceIndex[Node->getIndex()] = PredPosition; |
354 } while (0); | 360 } while (0); |
355 | 361 |
356 --PlaceIndex[Node->getIndex()]; | 362 --PlaceIndex[Node->getIndex()]; |
357 assert(*PlaceIndex[Node->getIndex()] == Node); | 363 assert(*PlaceIndex[Node->getIndex()] == Node); |
358 } | 364 } |
359 | 365 |
360 // Reorder Nodes according to the built-up lists. | 366 // Reorder Nodes according to the built-up lists. |
361 SizeT OldSize = Nodes.size(); | 367 NodeList Reordered; |
362 (void)OldSize; | 368 Reordered.reserve(Placed.size() + Unreachable.size()); |
363 Nodes.clear(); | |
364 for (CfgNode *Node : Placed) | 369 for (CfgNode *Node : Placed) |
365 Nodes.push_back(Node); | 370 Reordered.push_back(Node); |
366 for (CfgNode *Node : Unreachable) | 371 for (CfgNode *Node : Unreachable) |
367 Nodes.push_back(Node); | 372 Reordered.push_back(Node); |
368 assert(Nodes.size() == OldSize); | 373 assert(getNumNodes() == Reordered.size()); |
| 374 swapNodes(Reordered); |
369 } | 375 } |
370 | 376 |
371 namespace { | 377 namespace { |
372 void getRandomPostOrder(CfgNode *Node, llvm::BitVector &ToVisit, | 378 void getRandomPostOrder(CfgNode *Node, llvm::BitVector &ToVisit, |
373 Ice::NodeList &PostOrder, | 379 Ice::NodeList &PostOrder, |
374 Ice::RandomNumberGenerator *RNG) { | 380 Ice::RandomNumberGenerator *RNG) { |
375 assert(ToVisit[Node->getIndex()]); | 381 assert(ToVisit[Node->getIndex()]); |
376 ToVisit[Node->getIndex()] = false; | 382 ToVisit[Node->getIndex()] = false; |
377 NodeList Outs = Node->getOutEdges(); | 383 NodeList Outs = Node->getOutEdges(); |
378 Ice::RandomShuffle(Outs.begin(), Outs.end(), | 384 Ice::RandomShuffle(Outs.begin(), Outs.end(), |
(...skipping 14 matching lines...) Expand all Loading... |
393 NodeList Unreachable; | 399 NodeList Unreachable; |
394 llvm::BitVector ToVisit(Nodes.size(), true); | 400 llvm::BitVector ToVisit(Nodes.size(), true); |
395 // Traverse from entry node. | 401 // Traverse from entry node. |
396 getRandomPostOrder(getEntryNode(), ToVisit, ReversedReachable, | 402 getRandomPostOrder(getEntryNode(), ToVisit, ReversedReachable, |
397 &Ctx->getRNG()); | 403 &Ctx->getRNG()); |
398 // Collect the unreachable nodes. | 404 // Collect the unreachable nodes. |
399 for (CfgNode *Node : Nodes) | 405 for (CfgNode *Node : Nodes) |
400 if (ToVisit[Node->getIndex()]) | 406 if (ToVisit[Node->getIndex()]) |
401 Unreachable.push_back(Node); | 407 Unreachable.push_back(Node); |
402 // Copy the layout list to the Nodes. | 408 // Copy the layout list to the Nodes. |
403 SizeT OldSize = Nodes.size(); | 409 NodeList Shuffled; |
404 (void)OldSize; | 410 Shuffled.reserve(ReversedReachable.size() + Unreachable.size()); |
405 Nodes.clear(); | |
406 for (CfgNode *Node : reverse_range(ReversedReachable)) | 411 for (CfgNode *Node : reverse_range(ReversedReachable)) |
407 Nodes.emplace_back(Node); | 412 Shuffled.push_back(Node); |
408 for (CfgNode *Node : Unreachable) { | 413 for (CfgNode *Node : Unreachable) |
409 Nodes.emplace_back(Node); | 414 Shuffled.push_back(Node); |
410 } | 415 assert(Nodes.size() == Shuffled.size()); |
411 assert(Nodes.size() == OldSize); | 416 swapNodes(Shuffled); |
412 | 417 |
413 dump("After basic block shuffling"); | 418 dump("After basic block shuffling"); |
414 } | 419 } |
415 | 420 |
416 void Cfg::doArgLowering() { | 421 void Cfg::doArgLowering() { |
417 TimerMarker T(TimerStack::TT_doArgLowering, this); | 422 TimerMarker T(TimerStack::TT_doArgLowering, this); |
418 getTarget()->lowerArguments(); | 423 getTarget()->lowerArguments(); |
419 } | 424 } |
420 | 425 |
421 void Cfg::doAddressOpt() { | 426 void Cfg::doAddressOpt() { |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 } | 761 } |
757 } | 762 } |
758 // Print each basic block | 763 // Print each basic block |
759 for (CfgNode *Node : Nodes) | 764 for (CfgNode *Node : Nodes) |
760 Node->dump(this); | 765 Node->dump(this); |
761 if (isVerbose(IceV_Instructions)) | 766 if (isVerbose(IceV_Instructions)) |
762 Str << "}\n"; | 767 Str << "}\n"; |
763 } | 768 } |
764 | 769 |
765 } // end of namespace Ice | 770 } // end of namespace Ice |
OLD | NEW |