// // Helper Methods // private void ComputePostDominators( ) { int len = m_nodes.Length; BitVector t = new BitVector(len); m_postDominance = new BitVector[len]; for (int i = 0; i < len; i++) { BitVector bv = new BitVector(len); if (m_nodes[i].Successors.Length == 0) { // // A basic block with no successors is postdominated just by itself. // bv.Set(i); } else { bv.SetRange(0, len); } m_postDominance[i] = bv; } while (true) { bool fChange = false; for (int i = 0; i < len; i++) { var edges = m_nodes[i].Successors; if (edges.Length != 0) { t.SetRange(0, len); foreach (var edge in edges) { t.AndInPlace(m_postDominance[edge.Successor.SpanningTreeIndex]); } t.Set(i); if (t != m_postDominance[i]) { fChange = true; m_postDominance[i].Assign(t); } } } if (!fChange) { break; } } }