示例#1
0
        public bool Dominates( BasicBlock b )
        {
            if (b == this)
                return true;

            BasicBlock dom = b.ImmediateDominator;
            while( dom != null )
            {
                if (dom == this)
                    return true;
                dom = dom.ImmediateDominator;
            }
            return false;
        }
示例#2
0
 public Loop( BasicBlock header, IEnumerable<BasicBlock> blocks )
 {
     m_Header = header;
     m_Blocks = new List<BasicBlock>(blocks);
     Parent = null;
     DesiredIterations = 1;
 }
示例#3
0
 public void AddSuccessor(BasicBlock bl)
 {
     m_Successors.Add(bl);
 }
示例#4
0
 public void AddPredecessor(BasicBlock bl)
 {
     m_Predecessors.Add(bl);
 }
示例#5
0
        public static List<BasicBlock> BuildBasicBlocks(List<IInstruction> ops)
        {
            // collect set of branch targets
            HashSet<IInstruction> BranchTargets = new HashSet<IInstruction>();
            foreach( IInstruction op in ops )
            {
                if( op is IJumpInstruction )
                {
                    IJumpInstruction it = op as IJumpInstruction;
                    BranchTargets.Add( it.Target );
                }
                else if( op is IBranchInstruction )
                {
                    IBranchInstruction it = op as IBranchInstruction;
                    BranchTargets.Add( it.IfTarget );
                    BranchTargets.Add( it.ElseTarget );
                }
            }

            // walk instruction list and split off blocks at branches or branch targets
            List<BasicBlock> Blocks = new List<BasicBlock>();
            int nInstructions = ops.Count;
            int i = 0;
            do
            {
                BasicBlock block = new BasicBlock();
                Blocks.Add(block);

                do
                {
                    IInstruction op = ops[i++];
                    block.AddInstruction(op);
                    op.Block = block;

                    // stop if we just added a branch/jump op
                    if (op is IJumpInstruction || op is IBranchInstruction)
                        break;

                    // stop if next instruction is a branch target
                    if (i<nInstructions && BranchTargets.Contains(ops[i]))
                        break;

                } while (i < nInstructions);

            } while (i < nInstructions);

            // construct CFG edges
            for( int b=0; b<Blocks.Count; b++ )
            {
                IInstruction op = Blocks[b].LastInstruction;
                if (op is IBranchInstruction)
                {
                    IBranchInstruction branch = op as IBranchInstruction;
                    if (branch.IfTarget != null)
                    {
                        branch.Block.AddSuccessor(branch.IfTarget.Block);
                        branch.IfTarget.Block.AddPredecessor(branch.Block);
                    }
                    if (branch.ElseTarget != null)
                    {
                        branch.Block.AddSuccessor(branch.ElseTarget.Block);
                        branch.ElseTarget.Block.AddPredecessor(branch.Block);
                    }
                }
                else if (op is IJumpInstruction)
                {
                    // unconditional branch or jump, add target as one and only successor
                    IJumpInstruction jmp = op as IJumpInstruction;
                    if (jmp.Target != null)
                    {
                        jmp.Block.AddSuccessor(jmp.Target.Block);
                        jmp.Target.Block.AddPredecessor(jmp.Block);
                    }
                }
                else if ( b < Blocks.Count-1 )
                {
                    // Block ends in something other than a branch or jump
                    //  add next block as successor
                    Blocks[b].AddSuccessor(Blocks[b + 1]);
                    Blocks[b + 1].AddPredecessor(Blocks[b]);
                }
            }

            return Blocks;
        }
示例#6
0
 public void AddPredecessor(BasicBlock bl)
 {
     m_Predecessors.Add(bl);
 }
示例#7
0
 public void AddSuccessor(BasicBlock bl)
 {
     m_Successors.Add(bl);
 }