/*
* 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.lang.reflect.Constructor;
import org.jikesrvm.compilers.opt.DefUse;
import org.jikesrvm.compilers.opt.ExpressionFolding;
import org.jikesrvm.compilers.opt.OptOptions;
import org.jikesrvm.compilers.opt.Simple;
import org.jikesrvm.compilers.opt.controlflow.DominanceFrontier;
import org.jikesrvm.compilers.opt.controlflow.DominatorsPhase;
import org.jikesrvm.compilers.opt.driver.CompilerPhase;
import org.jikesrvm.compilers.opt.driver.OptimizationPlanAtomicElement;
import org.jikesrvm.compilers.opt.driver.OptimizationPlanCompositeElement;
import org.jikesrvm.compilers.opt.driver.OptimizationPlanElement;
import org.jikesrvm.compilers.opt.ir.IR;
/**
* This phase puts the IR in SSA form and performs a set of simple
* optimizations to clean up.
*/
public final class SSATuneUp extends OptimizationPlanCompositeElement {
/**
* Build this phase as a composite of others.
*/
public SSATuneUp() {
super("SSA Tune Up", new OptimizationPlanElement[]{
// 1. Set up IR state to control SSA translation as needed
new OptimizationPlanAtomicElement(new TuneUpPreparation()),
// 2. Get the desired SSA form
new OptimizationPlanAtomicElement(new EnterSSA()),
// 3. Perform simple optimizations
new OptimizationPlanAtomicElement(new Simple(1, true, true, false, false)),
// 4. Perform expression simplification
new OptimizationPlanAtomicElement(new FoldingDriver())});
}
@Override
public boolean shouldPerform(OptOptions options) {
return options.SSA;
}
/**
* This class drives expression folding.
*/
private static class FoldingDriver extends CompilerPhase {
/**
* Return this instance of this phase. This phase contains no
* per-compilation instance fields.
* @param ir not used
* @return this
*/
@Override
public CompilerPhase newExecution(IR ir) {
return this;
}
@Override
public final boolean shouldPerform(OptOptions options) {
return options.SSA && options.SSA_EXPRESSION_FOLDING;
}
@Override
public final String getName() {
return "SSA Expression Folding";
}
/**
* Execute expression folding.
*/
@Override
public final void perform(IR ir) {
DefUse.computeDU(ir);
ExpressionFolding.perform(ir);
}
}
/**
* This class sets up the IR state prior to entering SSA.
*/
public static class TuneUpPreparation extends CompilerPhase {
/**
* Compiler phases necessary to re-build dominators and dominance
* frontier
*/
private final CompilerPhase dominators, frontier;
public TuneUpPreparation() {
dominators = new DominatorsPhase(true);
frontier = new DominanceFrontier();
}
/**
* Constructor for this compiler phase
*/
private static final Constructor<CompilerPhase> constructor =
getCompilerPhaseConstructor(TuneUpPreparation.class);
/**
* Get a constructor object for this compiler phase
* @return compiler phase constructor
*/
@Override
public Constructor<CompilerPhase> getClassConstructor() {
return constructor;
}
@Override
public final boolean shouldPerform(OptOptions options) {
return options.SSA;
}
@Override
public final String getName() {
return "SSA Tune UpPreparation";
}
/**
* register in the IR the SSA properties we need for simple scalar
* optimizations
*/
@Override
public final void perform(IR ir) {
ir.desiredSSAOptions = new SSAOptions();
ir.desiredSSAOptions.setScalarsOnly(true);
ir.desiredSSAOptions.setBackwards(false);
ir.desiredSSAOptions.setInsertUsePhis(false);
if (!ir.HIRInfo.dominatorsAreComputed) {
dominators.perform(ir);
frontier.perform(ir);
}
}
}
}