Example #1
0
        //
        // 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;
                }
            }
        }