OLD | NEW |
1 //===- subzero/src/IceCfgNode.cpp - Basic block (node) implementation -----===// | 1 //===- subzero/src/IceCfgNode.cpp - Basic block (node) 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 CfgNode class, including the complexities | 10 // This file implements the CfgNode class, including the complexities |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 CfgNode::CfgNode(Cfg *Func, SizeT LabelNumber, IceString Name) | 24 CfgNode::CfgNode(Cfg *Func, SizeT LabelNumber, IceString Name) |
25 : Func(Func), Number(LabelNumber), Name(Name), HasReturn(false), | 25 : Func(Func), Number(LabelNumber), Name(Name), HasReturn(false), |
26 InstCountEstimate(0) {} | 26 InstCountEstimate(0) {} |
27 | 27 |
28 // Returns the name the node was created with. If no name was given, | 28 // Returns the name the node was created with. If no name was given, |
29 // it synthesizes a (hopefully) unique name. | 29 // it synthesizes a (hopefully) unique name. |
30 IceString CfgNode::getName() const { | 30 IceString CfgNode::getName() const { |
31 if (!Name.empty()) | 31 if (!Name.empty()) |
32 return Name; | 32 return Name; |
33 char buf[30]; | 33 return "__" + std::to_string(getIndex()); |
34 snprintf(buf, llvm::array_lengthof(buf), "__%u", getIndex()); | |
35 return buf; | |
36 } | 34 } |
37 | 35 |
38 // Adds an instruction to either the Phi list or the regular | 36 // Adds an instruction to either the Phi list or the regular |
39 // instruction list. Validates that all Phis are added before all | 37 // instruction list. Validates that all Phis are added before all |
40 // regular instructions. | 38 // regular instructions. |
41 void CfgNode::appendInst(Inst *Inst) { | 39 void CfgNode::appendInst(Inst *Inst) { |
42 ++InstCountEstimate; | 40 ++InstCountEstimate; |
43 if (InstPhi *Phi = llvm::dyn_cast<InstPhi>(Inst)) { | 41 if (InstPhi *Phi = llvm::dyn_cast<InstPhi>(Inst)) { |
44 if (!Insts.empty()) { | 42 if (!Insts.empty()) { |
45 Func->setError("Phi instruction added to the middle of a block"); | 43 Func->setError("Phi instruction added to the middle of a block"); |
(...skipping 12 matching lines...) Expand all Loading... |
58 // overlap with the range of any other block. | 56 // overlap with the range of any other block. |
59 void CfgNode::renumberInstructions() { | 57 void CfgNode::renumberInstructions() { |
60 InstNumberT FirstNumber = Func->getNextInstNumber(); | 58 InstNumberT FirstNumber = Func->getNextInstNumber(); |
61 for (InstPhi *I : Phis) | 59 for (InstPhi *I : Phis) |
62 I->renumber(Func); | 60 I->renumber(Func); |
63 for (Inst *I : Insts) | 61 for (Inst *I : Insts) |
64 I->renumber(Func); | 62 I->renumber(Func); |
65 InstCountEstimate = Func->getNextInstNumber() - FirstNumber; | 63 InstCountEstimate = Func->getNextInstNumber() - FirstNumber; |
66 } | 64 } |
67 | 65 |
68 // When a node is created, the OutEdges are immediately knows, but the | 66 // When a node is created, the OutEdges are immediately known, but the |
69 // InEdges have to be built up incrementally. After the CFG has been | 67 // InEdges have to be built up incrementally. After the CFG has been |
70 // constructed, the computePredecessors() pass finalizes it by | 68 // constructed, the computePredecessors() pass finalizes it by |
71 // creating the InEdges list. | 69 // creating the InEdges list. |
72 void CfgNode::computePredecessors() { | 70 void CfgNode::computePredecessors() { |
73 OutEdges = (*Insts.rbegin())->getTerminatorEdges(); | 71 OutEdges = (*Insts.rbegin())->getTerminatorEdges(); |
74 for (CfgNode *Succ : OutEdges) | 72 for (CfgNode *Succ : OutEdges) |
75 Succ->InEdges.push_back(this); | 73 Succ->InEdges.push_back(this); |
76 } | 74 } |
77 | 75 |
78 // This does part 1 of Phi lowering, by creating a new dest variable | 76 // This does part 1 of Phi lowering, by creating a new dest variable |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 Str << "\n"; | 548 Str << "\n"; |
551 } | 549 } |
552 // Dump the live-in variables. | 550 // Dump the live-in variables. |
553 LivenessBV LiveIn; | 551 LivenessBV LiveIn; |
554 if (Liveness) | 552 if (Liveness) |
555 LiveIn = Liveness->getLiveIn(this); | 553 LiveIn = Liveness->getLiveIn(this); |
556 if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveIn.empty()) { | 554 if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveIn.empty()) { |
557 Str << " // LiveIn:"; | 555 Str << " // LiveIn:"; |
558 for (SizeT i = 0; i < LiveIn.size(); ++i) { | 556 for (SizeT i = 0; i < LiveIn.size(); ++i) { |
559 if (LiveIn[i]) { | 557 if (LiveIn[i]) { |
560 Str << " %" << Liveness->getVariable(i, this)->getName(); | 558 Variable *Var = Liveness->getVariable(i, this); |
| 559 Str << " %" << Var->getName(); |
| 560 if (Func->getContext()->isVerbose(IceV_RegOrigins) && Var->hasReg()) { |
| 561 Str << ":" << Func->getTarget()->getRegName(Var->getRegNum(), |
| 562 Var->getType()); |
| 563 } |
561 } | 564 } |
562 } | 565 } |
563 Str << "\n"; | 566 Str << "\n"; |
564 } | 567 } |
565 // Dump each instruction. | 568 // Dump each instruction. |
566 if (Func->getContext()->isVerbose(IceV_Instructions)) { | 569 if (Func->getContext()->isVerbose(IceV_Instructions)) { |
567 for (InstPhi *I : Phis) | 570 for (InstPhi *I : Phis) |
568 I->dumpDecorated(Func); | 571 I->dumpDecorated(Func); |
569 for (Inst *I : Insts) | 572 for (Inst *I : Insts) |
570 I->dumpDecorated(Func); | 573 I->dumpDecorated(Func); |
571 } | 574 } |
572 // Dump the live-out variables. | 575 // Dump the live-out variables. |
573 LivenessBV LiveOut; | 576 LivenessBV LiveOut; |
574 if (Liveness) | 577 if (Liveness) |
575 LiveOut = Liveness->getLiveOut(this); | 578 LiveOut = Liveness->getLiveOut(this); |
576 if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveOut.empty()) { | 579 if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveOut.empty()) { |
577 Str << " // LiveOut:"; | 580 Str << " // LiveOut:"; |
578 for (SizeT i = 0; i < LiveOut.size(); ++i) { | 581 for (SizeT i = 0; i < LiveOut.size(); ++i) { |
579 if (LiveOut[i]) { | 582 if (LiveOut[i]) { |
580 Str << " %" << Liveness->getVariable(i, this)->getName(); | 583 Variable *Var = Liveness->getVariable(i, this); |
| 584 Str << " %" << Var->getName(); |
| 585 if (Func->getContext()->isVerbose(IceV_RegOrigins) && Var->hasReg()) { |
| 586 Str << ":" << Func->getTarget()->getRegName(Var->getRegNum(), |
| 587 Var->getType()); |
| 588 } |
581 } | 589 } |
582 } | 590 } |
583 Str << "\n"; | 591 Str << "\n"; |
584 } | 592 } |
585 // Dump list of successor nodes. | 593 // Dump list of successor nodes. |
586 if (Func->getContext()->isVerbose(IceV_Succs)) { | 594 if (Func->getContext()->isVerbose(IceV_Succs)) { |
587 Str << " // succs = "; | 595 Str << " // succs = "; |
588 bool First = true; | 596 bool First = true; |
589 for (CfgNode *I : OutEdges) { | 597 for (CfgNode *I : OutEdges) { |
590 if (!First) | 598 if (!First) |
591 Str << ", "; | 599 Str << ", "; |
592 First = false; | 600 First = false; |
593 Str << "%" << I->getName(); | 601 Str << "%" << I->getName(); |
594 } | 602 } |
595 Str << "\n"; | 603 Str << "\n"; |
596 } | 604 } |
597 } | 605 } |
598 | 606 |
599 } // end of namespace Ice | 607 } // end of namespace Ice |
OLD | NEW |