/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.compilers.opt.ssa;
import java.util.Enumeration;
import org.jikesrvm.compilers.opt.ir.Binary;
import org.jikesrvm.compilers.opt.ir.IR;
import org.jikesrvm.compilers.opt.ir.Instruction;
import org.jikesrvm.compilers.opt.ir.operand.Operand;
import static org.jikesrvm.compilers.opt.ir.Operators.INT_ADD;
import static org.jikesrvm.compilers.opt.ir.Operators.INT_SUB;
import static org.jikesrvm.compilers.opt.ir.Operators.LONG_ADD;
import static org.jikesrvm.compilers.opt.ir.Operators.LONG_SUB;
import static org.jikesrvm.compilers.opt.ir.Operators.REF_ADD;
import static org.jikesrvm.compilers.opt.ir.Operators.REF_SUB;
/**
* This class implements index equivalence via global value numbering
* and 'uniformly generated expressions'. See EURO-PAR 01 paper for
* more details.
*/
class UniformlyGeneratedGVN {
static final boolean DEBUG = false;
/**
* Compute Index Equivalence with uniformly generated global value
* numbers.
*
* <p> PRECONDITIONS: SSA form, register lists computed, SSA bit
* computed.
*
* <p> POSTCONDITION: ir.HIRInfo.uniformlyGeneratedValueNumbers
* holds results of the analysis. Does not modify the IR in any other way.
*
* @param ir the governing IR
*/
public static void perform(IR ir) {
// create 'standard' global value numbers.
GlobalValueNumberState gvn = null;
gvn = new GlobalValueNumberState(ir);
// Merge classes related by a constant
for (Enumeration<Instruction> e = ir.forwardInstrEnumerator(); e.hasMoreElements();) {
Instruction s = e.nextElement();
// Check if s is a fixed-point add/subtract instruction with
// a constant second operand
if (s.operator() == INT_ADD ||
s.operator() == LONG_ADD ||
s.operator() == REF_ADD ||
s.operator() == REF_SUB ||
s.operator() == INT_SUB ||
s.operator() == LONG_SUB) {
Operand val2 = Binary.getVal2(s);
if (val2.isConstant()) {
Operand lhs = Binary.getResult(s);
Operand rhs = Binary.getVal1(s);
gvn.mergeClasses(gvn.valueGraph.getVertex(lhs), gvn.valueGraph.getVertex(rhs));
}
}
}
if (DEBUG) {
System.out.println("@@@@ START OF INDEX EQUIVALENCE VALUE NUMBERS FOR " + ir.method + " @@@@");
gvn.printValueNumbers();
System.out.println("@@@@ END OF INDEX EQUIVALENCE VALUE NUMBERS FOR " + ir.method + " @@@@");
}
ir.HIRInfo.uniformlyGeneratedValueNumbers = gvn;
}
}