| 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 | 
| 11 // of instruction insertion and in-edge calculation. | 11 // of instruction insertion and in-edge calculation. | 
| 12 // | 12 // | 
| 13 //===----------------------------------------------------------------------===// | 13 //===----------------------------------------------------------------------===// | 
| 14 | 14 | 
| 15 #include "assembler.h" | 15 #include "assembler.h" | 
| 16 #include "IceCfg.h" | 16 #include "IceCfg.h" | 
| 17 #include "IceCfgNode.h" | 17 #include "IceCfgNode.h" | 
| 18 #include "IceInst.h" | 18 #include "IceInst.h" | 
| 19 #include "IceLiveness.h" | 19 #include "IceLiveness.h" | 
| 20 #include "IceOperand.h" | 20 #include "IceOperand.h" | 
| 21 #include "IceTargetLowering.h" | 21 #include "IceTargetLowering.h" | 
| 22 | 22 | 
| 23 namespace Ice { | 23 namespace Ice { | 
| 24 | 24 | 
| 25 CfgNode::CfgNode(Cfg *Func, SizeT LabelNumber) | 25 CfgNode::CfgNode(Cfg *Func, SizeT LabelNumber) | 
| 26     : Func(Func), Number(LabelNumber), NameIndex(-1), HasReturn(false), | 26     : Func(Func), Number(LabelNumber), NameIndex(Cfg::IdentifierIndexInvalid), | 
| 27       NeedsPlacement(false), InstCountEstimate(0) {} | 27       HasReturn(false), NeedsPlacement(false), InstCountEstimate(0) {} | 
| 28 | 28 | 
| 29 // Returns the name the node was created with.  If no name was given, | 29 // Returns the name the node was created with.  If no name was given, | 
| 30 // it synthesizes a (hopefully) unique name. | 30 // it synthesizes a (hopefully) unique name. | 
| 31 IceString CfgNode::getName() const { | 31 IceString CfgNode::getName() const { | 
| 32   if (NameIndex >= 0) | 32   if (NameIndex >= 0) | 
| 33     return Func->getNodeName(NameIndex); | 33     return Func->getIdentifierName(NameIndex); | 
| 34   return "__" + std::to_string(getIndex()); | 34   return "__" + std::to_string(getIndex()); | 
| 35 } | 35 } | 
| 36 | 36 | 
| 37 // Adds an instruction to either the Phi list or the regular | 37 // Adds an instruction to either the Phi list or the regular | 
| 38 // instruction list.  Validates that all Phis are added before all | 38 // instruction list.  Validates that all Phis are added before all | 
| 39 // regular instructions. | 39 // regular instructions. | 
| 40 void CfgNode::appendInst(Inst *Inst) { | 40 void CfgNode::appendInst(Inst *Inst) { | 
| 41   ++InstCountEstimate; | 41   ++InstCountEstimate; | 
| 42   if (InstPhi *Phi = llvm::dyn_cast<InstPhi>(Inst)) { | 42   if (InstPhi *Phi = llvm::dyn_cast<InstPhi>(Inst)) { | 
| 43     if (!Insts.empty()) { | 43     if (!Insts.empty()) { | 
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 430         bool Found = false; | 430         bool Found = false; | 
| 431         // If the target instruction "A=B" is part of a cycle, find | 431         // If the target instruction "A=B" is part of a cycle, find | 
| 432         // the "X=A" assignment in the cycle because it will have to | 432         // the "X=A" assignment in the cycle because it will have to | 
| 433         // be rewritten as "X=tmp". | 433         // be rewritten as "X=tmp". | 
| 434         for (size_t J = 0; !Found && J < NumPhis; ++J) { | 434         for (size_t J = 0; !Found && J < NumPhis; ++J) { | 
| 435           if (Desc[J].Processed) | 435           if (Desc[J].Processed) | 
| 436             continue; | 436             continue; | 
| 437           Operand *OtherSrc = Desc[J].Src; | 437           Operand *OtherSrc = Desc[J].Src; | 
| 438           if (Desc[J].NumPred && sameVarOrReg(Dest, OtherSrc)) { | 438           if (Desc[J].NumPred && sameVarOrReg(Dest, OtherSrc)) { | 
| 439             SizeT VarNum = Func->getNumVariables(); | 439             SizeT VarNum = Func->getNumVariables(); | 
| 440             Variable *Tmp = Func->makeVariable( | 440             Variable *Tmp = Func->makeVariable(OtherSrc->getType()); | 
| 441                 OtherSrc->getType(), "__split_" + std::to_string(VarNum)); | 441             if (ALLOW_DUMP) | 
|  | 442               Tmp->setName(Func, "__split_" + std::to_string(VarNum)); | 
| 442             Assignments.push_back(InstAssign::create(Func, Tmp, OtherSrc)); | 443             Assignments.push_back(InstAssign::create(Func, Tmp, OtherSrc)); | 
| 443             Desc[J].Src = Tmp; | 444             Desc[J].Src = Tmp; | 
| 444             Found = true; | 445             Found = true; | 
| 445           } | 446           } | 
| 446         } | 447         } | 
| 447         assert(Found); | 448         assert(Found); | 
| 448       } | 449       } | 
| 449       // Now that a cycle (if any) has been broken, create the actual | 450       // Now that a cycle (if any) has been broken, create the actual | 
| 450       // assignment. | 451       // assignment. | 
| 451       Assignments.push_back(InstAssign::create(Func, Dest, Src)); | 452       Assignments.push_back(InstAssign::create(Func, Dest, Src)); | 
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 963   } | 964   } | 
| 964   // Dump the live-in variables. | 965   // Dump the live-in variables. | 
| 965   LivenessBV LiveIn; | 966   LivenessBV LiveIn; | 
| 966   if (Liveness) | 967   if (Liveness) | 
| 967     LiveIn = Liveness->getLiveIn(this); | 968     LiveIn = Liveness->getLiveIn(this); | 
| 968   if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveIn.empty()) { | 969   if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveIn.empty()) { | 
| 969     Str << "    // LiveIn:"; | 970     Str << "    // LiveIn:"; | 
| 970     for (SizeT i = 0; i < LiveIn.size(); ++i) { | 971     for (SizeT i = 0; i < LiveIn.size(); ++i) { | 
| 971       if (LiveIn[i]) { | 972       if (LiveIn[i]) { | 
| 972         Variable *Var = Liveness->getVariable(i, this); | 973         Variable *Var = Liveness->getVariable(i, this); | 
| 973         Str << " %" << Var->getName(); | 974         Str << " %" << Var->getName(Func); | 
| 974         if (Func->getContext()->isVerbose(IceV_RegOrigins) && Var->hasReg()) { | 975         if (Func->getContext()->isVerbose(IceV_RegOrigins) && Var->hasReg()) { | 
| 975           Str << ":" << Func->getTarget()->getRegName(Var->getRegNum(), | 976           Str << ":" << Func->getTarget()->getRegName(Var->getRegNum(), | 
| 976                                                       Var->getType()); | 977                                                       Var->getType()); | 
| 977         } | 978         } | 
| 978       } | 979       } | 
| 979     } | 980     } | 
| 980     Str << "\n"; | 981     Str << "\n"; | 
| 981   } | 982   } | 
| 982   // Dump each instruction. | 983   // Dump each instruction. | 
| 983   if (Func->getContext()->isVerbose(IceV_Instructions)) { | 984   if (Func->getContext()->isVerbose(IceV_Instructions)) { | 
| 984     for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) | 985     for (auto I = Phis.begin(), E = Phis.end(); I != E; ++I) | 
| 985       I->dumpDecorated(Func); | 986       I->dumpDecorated(Func); | 
| 986     for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I) | 987     for (auto I = Insts.begin(), E = Insts.end(); I != E; ++I) | 
| 987       I->dumpDecorated(Func); | 988       I->dumpDecorated(Func); | 
| 988   } | 989   } | 
| 989   // Dump the live-out variables. | 990   // Dump the live-out variables. | 
| 990   LivenessBV LiveOut; | 991   LivenessBV LiveOut; | 
| 991   if (Liveness) | 992   if (Liveness) | 
| 992     LiveOut = Liveness->getLiveOut(this); | 993     LiveOut = Liveness->getLiveOut(this); | 
| 993   if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveOut.empty()) { | 994   if (Func->getContext()->isVerbose(IceV_Liveness) && !LiveOut.empty()) { | 
| 994     Str << "    // LiveOut:"; | 995     Str << "    // LiveOut:"; | 
| 995     for (SizeT i = 0; i < LiveOut.size(); ++i) { | 996     for (SizeT i = 0; i < LiveOut.size(); ++i) { | 
| 996       if (LiveOut[i]) { | 997       if (LiveOut[i]) { | 
| 997         Variable *Var = Liveness->getVariable(i, this); | 998         Variable *Var = Liveness->getVariable(i, this); | 
| 998         Str << " %" << Var->getName(); | 999         Str << " %" << Var->getName(Func); | 
| 999         if (Func->getContext()->isVerbose(IceV_RegOrigins) && Var->hasReg()) { | 1000         if (Func->getContext()->isVerbose(IceV_RegOrigins) && Var->hasReg()) { | 
| 1000           Str << ":" << Func->getTarget()->getRegName(Var->getRegNum(), | 1001           Str << ":" << Func->getTarget()->getRegName(Var->getRegNum(), | 
| 1001                                                       Var->getType()); | 1002                                                       Var->getType()); | 
| 1002         } | 1003         } | 
| 1003       } | 1004       } | 
| 1004     } | 1005     } | 
| 1005     Str << "\n"; | 1006     Str << "\n"; | 
| 1006   } | 1007   } | 
| 1007   // Dump list of successor nodes. | 1008   // Dump list of successor nodes. | 
| 1008   if (Func->getContext()->isVerbose(IceV_Succs)) { | 1009   if (Func->getContext()->isVerbose(IceV_Succs)) { | 
| 1009     Str << "    // succs = "; | 1010     Str << "    // succs = "; | 
| 1010     bool First = true; | 1011     bool First = true; | 
| 1011     for (CfgNode *I : OutEdges) { | 1012     for (CfgNode *I : OutEdges) { | 
| 1012       if (!First) | 1013       if (!First) | 
| 1013         Str << ", "; | 1014         Str << ", "; | 
| 1014       First = false; | 1015       First = false; | 
| 1015       Str << "%" << I->getName(); | 1016       Str << "%" << I->getName(); | 
| 1016     } | 1017     } | 
| 1017     Str << "\n"; | 1018     Str << "\n"; | 
| 1018   } | 1019   } | 
| 1019 } | 1020 } | 
| 1020 | 1021 | 
| 1021 } // end of namespace Ice | 1022 } // end of namespace Ice | 
| OLD | NEW | 
|---|