001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.compilers.opt.controlflow;
014    
015    import java.util.Enumeration;
016    
017    import org.jikesrvm.compilers.opt.dfsolver.DF_AbstractCell;
018    import org.jikesrvm.compilers.opt.ir.BasicBlock;
019    import org.jikesrvm.compilers.opt.ir.IR;
020    import org.jikesrvm.util.BitVector;
021    
022    /**
023     * DominatorCell represents a set of basic blocks, used in
024     * the dataflow calculation
025     */
026    class DominatorCell extends DF_AbstractCell {
027    
028      /**
029       * Pointer to the governing IR.
030       */
031      final IR ir;
032      /**
033       * The basic block corresponding to this lattice cell.
034       */
035      final BasicBlock block;
036      /**
037       * Bit set representation of the dominators for this basic block.
038       */
039      BitVector dominators;
040      /**
041       * A guess of the upper bound on the number of out edges for most basic
042       * blocks.
043       */
044      private static final int CAPACITY = 5;
045    
046      /**
047       * Make a bit set for a basic block
048       * @param bb the basic block
049       * @param ir the governing IR
050       */
051      public DominatorCell(BasicBlock bb, IR ir) {
052        super(CAPACITY);
053        block = bb;
054        dominators = new BitVector(ir.getMaxBasicBlockNumber() + 1);
055        this.ir = ir;
056      }
057    
058      /**
059       * Return a String representation of this cell.
060       * @return a String representation of this cell.
061       */
062      @Override
063      public String toString() {
064        return block + ":" + dominators;
065      }
066    
067      /**
068       * Include a single basic block in this set.
069       * @param bb the basic block
070       */
071      public void addSingleBlock(BasicBlock bb) {
072        dominators.set(bb.getNumber());
073      }
074    
075      /**
076       * Include all basic blocks in this set.
077       * <p> TODO: make this more efficient.
078       * @param ir the governing ir
079       */
080      public void setTOP(IR ir) {
081        for (Enumeration<BasicBlock> e = ir.getBasicBlocks(); e.hasMoreElements();) {
082          BasicBlock b = e.nextElement();
083          dominators.set(b.getNumber());
084        }
085      }
086    }