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 /// \file | 10 /// \file |
11 /// \brief Implements the CfgNode class, including the complexities of | 11 /// \brief Implements the CfgNode class, including the complexities of |
12 /// instruction insertion and in-edge calculation. | 12 /// instruction insertion and in-edge calculation. |
13 /// | 13 /// |
14 //===----------------------------------------------------------------------===// | 14 //===----------------------------------------------------------------------===// |
15 | 15 |
16 #include "IceCfgNode.h" | 16 #include "IceCfgNode.h" |
17 | 17 |
18 #include "IceAssembler.h" | 18 #include "IceAssembler.h" |
19 #include "IceCfg.h" | 19 #include "IceCfg.h" |
20 #include "IceGlobalInits.h" | 20 #include "IceGlobalInits.h" |
21 #include "IceInst.h" | 21 #include "IceInst.h" |
22 #include "IceInstVarIter.h" | 22 #include "IceInstVarIter.h" |
23 #include "IceLiveness.h" | 23 #include "IceLiveness.h" |
24 #include "IceOperand.h" | 24 #include "IceOperand.h" |
25 #include "IceTargetLowering.h" | 25 #include "IceTargetLowering.h" |
26 | 26 |
27 namespace Ice { | 27 namespace Ice { |
28 | 28 |
29 CfgNode::CfgNode(Cfg *Func, SizeT Number) : Func(Func), Number(Number) { | |
30 if (BuildDefs::dump()) { | |
31 Name = | |
32 NodeString::createWithString(Func, "__" + std::to_string(getIndex())); | |
33 } else { | |
34 Name = NodeString::createWithoutString(Func); | |
35 } | |
36 } | |
37 | |
38 // Adds an instruction to either the Phi list or the regular instruction list. | 29 // Adds an instruction to either the Phi list or the regular instruction list. |
39 // Validates that all Phis are added before all regular instructions. | 30 // Validates that all Phis are added before all regular instructions. |
40 void CfgNode::appendInst(Inst *Instr, bool AllowPhisAnywhere) { | 31 void CfgNode::appendInst(Inst *Instr, bool AllowPhisAnywhere) { |
41 ++InstCountEstimate; | 32 ++InstCountEstimate; |
42 | 33 |
43 if (BuildDefs::wasm()) { | 34 if (BuildDefs::wasm()) { |
44 if (llvm::isa<InstSwitch>(Instr) || llvm::isa<InstBr>(Instr)) { | 35 if (llvm::isa<InstSwitch>(Instr) || llvm::isa<InstBr>(Instr)) { |
45 for (auto *N : Instr->getTerminatorEdges()) { | 36 for (auto *N : Instr->getTerminatorEdges()) { |
46 N->addInEdge(this); | 37 N->addInEdge(this); |
47 addOutEdge(N); | 38 addOutEdge(N); |
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 Str << "Live range errors in the following block:\n"; | 781 Str << "Live range errors in the following block:\n"; |
791 dump(Func); | 782 dump(Func); |
792 } | 783 } |
793 for (auto Start = MapBegin.begin(); | 784 for (auto Start = MapBegin.begin(); |
794 (Start = std::adjacent_find(Start, MapBegin.end(), ComparePair)) != | 785 (Start = std::adjacent_find(Start, MapBegin.end(), ComparePair)) != |
795 MapBegin.end(); | 786 MapBegin.end(); |
796 ++Start) { | 787 ++Start) { |
797 auto Next = Start + 1; | 788 auto Next = Start + 1; |
798 Str << "Duplicate LR begin, block " << getName() << ", instructions " | 789 Str << "Duplicate LR begin, block " << getName() << ", instructions " |
799 << Start->second << " & " << Next->second << ", variable " | 790 << Start->second << " & " << Next->second << ", variable " |
800 << Liveness->getVariable(Start->first, this)->getName(Func) << "\n"; | 791 << Liveness->getVariable(Start->first, this)->getName() << "\n"; |
801 } | 792 } |
802 for (auto Start = MapEnd.begin(); | 793 for (auto Start = MapEnd.begin(); |
803 (Start = std::adjacent_find(Start, MapEnd.end(), ComparePair)) != | 794 (Start = std::adjacent_find(Start, MapEnd.end(), ComparePair)) != |
804 MapEnd.end(); | 795 MapEnd.end(); |
805 ++Start) { | 796 ++Start) { |
806 auto Next = Start + 1; | 797 auto Next = Start + 1; |
807 Str << "Duplicate LR end, block " << getName() << ", instructions " | 798 Str << "Duplicate LR end, block " << getName() << ", instructions " |
808 << Start->second << " & " << Next->second << ", variable " | 799 << Start->second << " & " << Next->second << ", variable " |
809 << Liveness->getVariable(Start->first, this)->getName(Func) << "\n"; | 800 << Liveness->getVariable(Start->first, this)->getName() << "\n"; |
810 } | 801 } |
811 } | 802 } |
812 | 803 |
813 return false; | 804 return false; |
814 } | 805 } |
815 | 806 |
816 // Once basic liveness is complete, compute actual live ranges. It is assumed | 807 // Once basic liveness is complete, compute actual live ranges. It is assumed |
817 // that within a single basic block, a live range begins at most once and ends | 808 // that within a single basic block, a live range begins at most once and ends |
818 // at most once. This is certainly true for pure SSA form. It is also true once | 809 // at most once. This is certainly true for pure SSA form. It is also true once |
819 // phis are lowered, since each assignment to the phi-based temporary is in a | 810 // phis are lowered, since each assignment to the phi-based temporary is in a |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1395 Str << "\n"; | 1386 Str << "\n"; |
1396 } | 1387 } |
1397 // Dump the live-in variables. | 1388 // Dump the live-in variables. |
1398 if (Func->isVerbose(IceV_Liveness)) { | 1389 if (Func->isVerbose(IceV_Liveness)) { |
1399 if (Liveness != nullptr && !Liveness->getLiveIn(this).empty()) { | 1390 if (Liveness != nullptr && !Liveness->getLiveIn(this).empty()) { |
1400 const LivenessBV &LiveIn = Liveness->getLiveIn(this); | 1391 const LivenessBV &LiveIn = Liveness->getLiveIn(this); |
1401 Str << " // LiveIn:"; | 1392 Str << " // LiveIn:"; |
1402 for (SizeT i = 0; i < LiveIn.size(); ++i) { | 1393 for (SizeT i = 0; i < LiveIn.size(); ++i) { |
1403 if (LiveIn[i]) { | 1394 if (LiveIn[i]) { |
1404 Variable *Var = Liveness->getVariable(i, this); | 1395 Variable *Var = Liveness->getVariable(i, this); |
1405 Str << " %" << Var->getName(Func); | 1396 Str << " %" << Var->getName(); |
1406 if (Func->isVerbose(IceV_RegOrigins) && Var->hasReg()) { | 1397 if (Func->isVerbose(IceV_RegOrigins) && Var->hasReg()) { |
1407 Str << ":" | 1398 Str << ":" |
1408 << Func->getTarget()->getRegName(Var->getRegNum(), | 1399 << Func->getTarget()->getRegName(Var->getRegNum(), |
1409 Var->getType()); | 1400 Var->getType()); |
1410 } | 1401 } |
1411 } | 1402 } |
1412 } | 1403 } |
1413 Str << "\n"; | 1404 Str << "\n"; |
1414 } | 1405 } |
1415 } | 1406 } |
1416 // Dump each instruction. | 1407 // Dump each instruction. |
1417 if (Func->isVerbose(IceV_Instructions)) { | 1408 if (Func->isVerbose(IceV_Instructions)) { |
1418 for (const Inst &I : Phis) | 1409 for (const Inst &I : Phis) |
1419 I.dumpDecorated(Func); | 1410 I.dumpDecorated(Func); |
1420 for (const Inst &I : Insts) | 1411 for (const Inst &I : Insts) |
1421 I.dumpDecorated(Func); | 1412 I.dumpDecorated(Func); |
1422 } | 1413 } |
1423 // Dump the live-out variables. | 1414 // Dump the live-out variables. |
1424 if (Func->isVerbose(IceV_Liveness)) { | 1415 if (Func->isVerbose(IceV_Liveness)) { |
1425 if (Liveness != nullptr && !Liveness->getLiveOut(this).empty()) { | 1416 if (Liveness != nullptr && !Liveness->getLiveOut(this).empty()) { |
1426 const LivenessBV &LiveOut = Liveness->getLiveOut(this); | 1417 const LivenessBV &LiveOut = Liveness->getLiveOut(this); |
1427 Str << " // LiveOut:"; | 1418 Str << " // LiveOut:"; |
1428 for (SizeT i = 0; i < LiveOut.size(); ++i) { | 1419 for (SizeT i = 0; i < LiveOut.size(); ++i) { |
1429 if (LiveOut[i]) { | 1420 if (LiveOut[i]) { |
1430 Variable *Var = Liveness->getVariable(i, this); | 1421 Variable *Var = Liveness->getVariable(i, this); |
1431 Str << " %" << Var->getName(Func); | 1422 Str << " %" << Var->getName(); |
1432 if (Func->isVerbose(IceV_RegOrigins) && Var->hasReg()) { | 1423 if (Func->isVerbose(IceV_RegOrigins) && Var->hasReg()) { |
1433 Str << ":" | 1424 Str << ":" |
1434 << Func->getTarget()->getRegName(Var->getRegNum(), | 1425 << Func->getTarget()->getRegName(Var->getRegNum(), |
1435 Var->getType()); | 1426 Var->getType()); |
1436 } | 1427 } |
1437 } | 1428 } |
1438 } | 1429 } |
1439 Str << "\n"; | 1430 Str << "\n"; |
1440 } | 1431 } |
1441 } | 1432 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1474 auto *Instr = InstIntrinsicCall::create( | 1465 auto *Instr = InstIntrinsicCall::create( |
1475 Func, 5, Func->makeVariable(IceType_i64), RMWI64Name, Info->Info); | 1466 Func, 5, Func->makeVariable(IceType_i64), RMWI64Name, Info->Info); |
1476 Instr->addArg(AtomicRMWOp); | 1467 Instr->addArg(AtomicRMWOp); |
1477 Instr->addArg(Counter); | 1468 Instr->addArg(Counter); |
1478 Instr->addArg(One); | 1469 Instr->addArg(One); |
1479 Instr->addArg(OrderAcquireRelease); | 1470 Instr->addArg(OrderAcquireRelease); |
1480 Insts.push_front(Instr); | 1471 Insts.push_front(Instr); |
1481 } | 1472 } |
1482 | 1473 |
1483 } // end of namespace Ice | 1474 } // end of namespace Ice |
OLD | NEW |