| 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 |