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 |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
452 PhiDescList Desc; | 452 PhiDescList Desc; |
453 | 453 |
454 for (Inst &I : Phis) { | 454 for (Inst &I : Phis) { |
455 auto *Phi = llvm::dyn_cast<InstPhi>(&I); | 455 auto *Phi = llvm::dyn_cast<InstPhi>(&I); |
456 if (!Phi->isDeleted()) { | 456 if (!Phi->isDeleted()) { |
457 Variable *Dest = Phi->getDest(); | 457 Variable *Dest = Phi->getDest(); |
458 Desc.emplace_back(Phi, Dest); | 458 Desc.emplace_back(Phi, Dest); |
459 // Undo the effect of the phi instruction on this node's live-in set by | 459 // Undo the effect of the phi instruction on this node's live-in set by |
460 // marking the phi dest variable as live on entry. | 460 // marking the phi dest variable as live on entry. |
461 SizeT VarNum = Func->getLiveness()->getLiveIndex(Dest->getIndex()); | 461 SizeT VarNum = Func->getLiveness()->getLiveIndex(Dest->getIndex()); |
462 assert(!Func->getLiveness()->getLiveIn(this)[VarNum]); | 462 if (Func->getLiveness()->getLiveIn(this).size() >= VarNum) { |
Jim Stichnoth
2016/07/29 17:04:06
Shouldn't the '>=' be '>' ?
In any case, I think
manasijm
2016/08/01 22:20:03
Done.
| |
463 Func->getLiveness()->getLiveIn(this)[VarNum] = true; | 463 assert(!Func->getLiveness()->getLiveIn(this)[VarNum]); |
464 Func->getLiveness()->getLiveIn(this)[VarNum] = true; | |
465 } | |
464 Phi->setDeleted(); | 466 Phi->setDeleted(); |
465 } | 467 } |
466 } | 468 } |
467 if (Desc.empty()) | 469 if (Desc.empty()) |
468 return; | 470 return; |
469 | 471 |
470 TargetLowering *Target = Func->getTarget(); | 472 TargetLowering *Target = Func->getTarget(); |
471 SizeT InEdgeIndex = 0; | 473 SizeT InEdgeIndex = 0; |
472 for (CfgNode *Pred : InEdges) { | 474 for (CfgNode *Pred : InEdges) { |
473 CfgNode *Split = splitIncomingEdge(Pred, InEdgeIndex++); | 475 CfgNode *Split = splitIncomingEdge(Pred, InEdgeIndex++); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
860 // live range begins and ends in this block. If i1<i2, then i1's live range | 862 // live range begins and ends in this block. If i1<i2, then i1's live range |
861 // begins at instruction IBB->second and extends through the end of the | 863 // begins at instruction IBB->second and extends through the end of the |
862 // block. If i1>i2, then i2's live range begins at the first instruction of | 864 // block. If i1>i2, then i2's live range begins at the first instruction of |
863 // the block and ends at IEB->second. In any case, we choose the lesser of | 865 // the block and ends at IEB->second. In any case, we choose the lesser of |
864 // i1 and i2 and proceed accordingly. | 866 // i1 and i2 and proceed accordingly. |
865 InstNumberT LB = i == i1 ? IBB->second : FirstInstNum; | 867 InstNumberT LB = i == i1 ? IBB->second : FirstInstNum; |
866 InstNumberT LE = i == i2 ? IEB->second : LastInstNum + 1; | 868 InstNumberT LE = i == i2 ? IEB->second : LastInstNum + 1; |
867 | 869 |
868 Variable *Var = Liveness->getVariable(i, this); | 870 Variable *Var = Liveness->getVariable(i, this); |
869 if (LB > LE) { | 871 if (LB > LE) { |
870 Var->addLiveRange(FirstInstNum, LE); | 872 Var->addLiveRange(FirstInstNum, LE, this); |
871 Var->addLiveRange(LB, LastInstNum + 1); | 873 Var->addLiveRange(LB, LastInstNum + 1, this); |
872 // Assert that Var is a global variable by checking that its liveness | 874 // Assert that Var is a global variable by checking that its liveness |
873 // index is less than the number of globals. This ensures that the | 875 // index is less than the number of globals. This ensures that the |
874 // LiveInAndOut[] access is valid. | 876 // LiveInAndOut[] access is valid. |
875 assert(i < Liveness->getNumGlobalVars()); | 877 assert(i < Liveness->getNumGlobalVars()); |
876 LiveInAndOut[i] = false; | 878 LiveInAndOut[i] = false; |
877 } else { | 879 } else { |
878 Var->addLiveRange(LB, LE); | 880 Var->addLiveRange(LB, LE, this); |
879 } | 881 } |
880 if (i == i1) | 882 if (i == i1) |
881 ++IBB; | 883 ++IBB; |
882 if (i == i2) | 884 if (i == i2) |
883 ++IEB; | 885 ++IEB; |
884 } | 886 } |
885 // Process the variables that are live across the entire block. | 887 // Process the variables that are live across the entire block. |
886 for (int i = LiveInAndOut.find_first(); i != -1; | 888 for (int i = LiveInAndOut.find_first(); i != -1; |
887 i = LiveInAndOut.find_next(i)) { | 889 i = LiveInAndOut.find_next(i)) { |
888 Variable *Var = Liveness->getVariable(i, this); | 890 Variable *Var = Liveness->getVariable(i, this); |
889 if (Liveness->getRangeMask(Var->getIndex())) | 891 if (Liveness->getRangeMask(Var->getIndex())) |
890 Var->addLiveRange(FirstInstNum, LastInstNum + 1); | 892 Var->addLiveRange(FirstInstNum, LastInstNum + 1, this); |
891 } | 893 } |
892 } | 894 } |
893 | 895 |
894 // If this node contains only deleted instructions, and ends in an | 896 // If this node contains only deleted instructions, and ends in an |
895 // unconditional branch, contract the node by repointing all its in-edges to | 897 // unconditional branch, contract the node by repointing all its in-edges to |
896 // its successor. | 898 // its successor. |
897 void CfgNode::contractIfEmpty() { | 899 void CfgNode::contractIfEmpty() { |
898 if (InEdges.empty()) | 900 if (InEdges.empty()) |
899 return; | 901 return; |
900 Inst *Branch = nullptr; | 902 Inst *Branch = nullptr; |
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1634 UnusedOperand = TopLevelBoolOp->getSrc(0); | 1636 UnusedOperand = TopLevelBoolOp->getSrc(0); |
1635 assert(UnusedOperand); | 1637 assert(UnusedOperand); |
1636 | 1638 |
1637 Br->replaceSource(0, UnusedOperand); // Index 0 has the condition of the Br | 1639 Br->replaceSource(0, UnusedOperand); // Index 0 has the condition of the Br |
1638 | 1640 |
1639 TopLevelBoolOp->setDeleted(); | 1641 TopLevelBoolOp->setDeleted(); |
1640 return NewNode; | 1642 return NewNode; |
1641 } | 1643 } |
1642 | 1644 |
1643 } // end of namespace Ice | 1645 } // end of namespace Ice |
OLD | NEW |