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 }