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 */ 013package org.jikesrvm.compilers.opt.controlflow; 014 015import org.jikesrvm.compilers.opt.dfsolver.DF_LatticeCell; 016import org.jikesrvm.compilers.opt.dfsolver.DF_Operator; 017import org.jikesrvm.compilers.opt.ir.BasicBlock; 018import org.jikesrvm.compilers.opt.ir.IR; 019import org.jikesrvm.util.BitVector; 020 021/** 022 * This class implements the MEET operation for the 023 * dataflow equations for the dominator calculation. 024 */ 025class DominatorOperator extends DF_Operator { 026 /** 027 * A singleton instance of this class. 028 */ 029 static final DominatorOperator MEET = new DominatorOperator(); 030 031 /** 032 * Evaluate an equation with the MEET operation 033 * @param operands the lhs(operands[0]) and rhs(operands[1]) 034 * of the equation. 035 * @return {@code true} if the value of the lhs changes. {@code false} otherwise 036 */ 037 @Override 038 public boolean evaluate(DF_LatticeCell[] operands) { 039 DominatorCell lhs = (DominatorCell) operands[0]; 040 IR ir = lhs.ir; 041 BasicBlock bb = lhs.block; 042 BitVector oldSet = lhs.dominators.dup(); 043 BitVector newDominators = new BitVector(ir.getMaxBasicBlockNumber() + 1); 044 if (operands.length > 1) { 045 if (operands[1] != null) { 046 newDominators.or(((DominatorCell) operands[1]).dominators); 047 } 048 } 049 for (int i = 2; i < operands.length; i++) { 050 newDominators.and(((DominatorCell) operands[i]).dominators); 051 } 052 newDominators.set(bb.getNumber()); 053 lhs.dominators = newDominators; 054 return !lhs.dominators.equals(oldSet); 055 } 056 057 /** 058 * Return a String representation of the operator 059 * @return "MEET" 060 */ 061 @Override 062 public String toString() { 063 return "MEET"; 064 } 065}