Index: src/IceLiveness.h |
diff --git a/src/IceLiveness.h b/src/IceLiveness.h |
index f6af0e1033100b2ab1bd17af0364b1d640b348b5..a542f3ea3d98e252562dc3ed181a992561474d2c 100644 |
--- a/src/IceLiveness.h |
+++ b/src/IceLiveness.h |
@@ -32,9 +32,14 @@ class LivenessNode { |
// LivenessNode &operator=(const LivenessNode &) = delete; |
public: |
- LivenessNode() : NumLocals(0) {} |
+ LivenessNode() : NumLocals(0), NumNonDeadPhis(0) {} |
// NumLocals is the number of Variables local to this block. |
SizeT NumLocals; |
+ // NumNonDeadPhis tracks the number of Phi instructions that |
+ // Inst::liveness() identified as tentatively live. If |
+ // NumNonDeadPhis changes from the last liveness pass, then liveness |
+ // has not yet converged. |
+ SizeT NumNonDeadPhis; |
// LiveToVarMap maps a liveness bitvector index to a Variable. This |
// is generally just for printing/dumping. The index should be less |
// than NumLocals + Liveness::NumGlobals. |
@@ -66,20 +71,36 @@ public: |
SizeT getNumVarsInNode(const CfgNode *Node) const { |
return NumGlobals + Nodes[Node->getIndex()].NumLocals; |
} |
+ SizeT &getNumNonDeadPhis(const CfgNode *Node) { |
+ return Nodes[Node->getIndex()].NumNonDeadPhis; |
+ } |
LivenessBV &getLiveIn(const CfgNode *Node) { |
- return Nodes[Node->getIndex()].LiveIn; |
+ SizeT Index = Node->getIndex(); |
+ resize(Index); |
+ return Nodes[Index].LiveIn; |
} |
LivenessBV &getLiveOut(const CfgNode *Node) { |
- return Nodes[Node->getIndex()].LiveOut; |
+ SizeT Index = Node->getIndex(); |
+ resize(Index); |
+ return Nodes[Index].LiveOut; |
} |
LiveBeginEndMap *getLiveBegin(const CfgNode *Node) { |
- return &Nodes[Node->getIndex()].LiveBegin; |
+ SizeT Index = Node->getIndex(); |
+ resize(Index); |
+ return &Nodes[Index].LiveBegin; |
} |
LiveBeginEndMap *getLiveEnd(const CfgNode *Node) { |
- return &Nodes[Node->getIndex()].LiveEnd; |
+ SizeT Index = Node->getIndex(); |
+ resize(Index); |
+ return &Nodes[Index].LiveEnd; |
} |
private: |
+ // Resize Nodes so that Nodes[Index] is valid. |
+ void resize(SizeT Index) { |
+ if (Index >= Nodes.size()) |
+ Nodes.resize(Index + 1); |
+ } |
Cfg *Func; |
LivenessMode Mode; |
SizeT NumGlobals; |