Mercurial > hg > truffle
changeset 19209:1e3b5204776f
LowLevelLowTierPhase: codeEmittingOrder and linearScanOrder to context.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Fri, 06 Feb 2015 19:54:52 +0100 |
parents | 81358265e0e0 |
children | de456294b59a |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/NullCheckOptimizer.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/RedundantMoveElimination.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/phases/LowLevelLowTierPhase.java |
diffstat | 6 files changed, 27 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Fri Feb 06 19:43:08 2015 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Fri Feb 06 19:54:52 2015 +0100 @@ -347,8 +347,8 @@ } } - public static <T extends AbstractBlock<T>> LIRGenerationResult emitLowLevel(Backend backend, TargetDescription target, LIR lir, List<T> codeEmittingOrder, - @SuppressWarnings("unused") List<T> linearScanOrder, LIRGenerationResult lirGenRes, LIRGeneratorTool lirGen) { + public static <T extends AbstractBlock<T>> LIRGenerationResult emitLowLevel(Backend backend, TargetDescription target, LIR lir, List<T> codeEmittingOrder, List<T> linearScanOrder, + LIRGenerationResult lirGenRes, LIRGeneratorTool lirGen) { try (Scope s0 = Debug.scope("HighTier")) { if (ConstantLoadOptimization.Options.ConstantLoadOptimization.getValue()) { try (Scope s = Debug.scope("ConstantLoadOptimization", lir)) { @@ -387,9 +387,10 @@ } try (Scope s = Debug.scope("LowTier")) { - LowLevelLowTierPhase.Context<T> c = new LowLevelLowTierPhase.Context<>(); + LowLevelLowTierPhase.Context<T> c = new LowLevelLowTierPhase.Context<>(codeEmittingOrder, linearScanOrder); new EdgeMoveOptimizer<T>().apply(target, lirGenRes, c); - ControlFlowOptimizer.optimize(lir, codeEmittingOrder); + new ControlFlowOptimizer<T>().apply(target, lirGenRes, c); + if (lirGen.canEliminateRedundantMoves()) { new RedundantMoveElimination<T>().apply(target, lirGenRes, c); }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java Fri Feb 06 19:43:08 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/ControlFlowOptimizer.java Fri Feb 06 19:54:52 2015 +0100 @@ -26,18 +26,23 @@ import java.util.*; +import com.oracle.graal.api.code.*; +import com.oracle.graal.compiler.common.cfg.*; import com.oracle.graal.debug.*; -import com.oracle.graal.compiler.common.cfg.*; +import com.oracle.graal.lir.gen.*; +import com.oracle.graal.lir.phases.*; /** * This class performs basic optimizations on the control flow graph after LIR generation. */ -public final class ControlFlowOptimizer { +public final class ControlFlowOptimizer<B extends AbstractBlock<B>> extends LowLevelLowTierPhase<B> { /** * Performs control flow optimizations on the given LIR graph. */ - public static <B extends AbstractBlock<B>> void optimize(LIR lir, List<B> codeEmittingOrder) { + @Override + protected void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder) { + LIR lir = lirGenRes.getLIR(); new Optimizer<B>(lir).deleteEmptyBlocks(codeEmittingOrder); }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java Fri Feb 06 19:43:08 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java Fri Feb 06 19:54:52 2015 +0100 @@ -51,7 +51,7 @@ public final class EdgeMoveOptimizer<B extends AbstractBlock<B>> extends LowLevelLowTierPhase<B> { @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes) { + protected void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder) { LIR ir = lirGenRes.getLIR(); Optimizer optimizer = new Optimizer(ir);
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/NullCheckOptimizer.java Fri Feb 06 19:43:08 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/NullCheckOptimizer.java Fri Feb 06 19:54:52 2015 +0100 @@ -34,7 +34,7 @@ public final class NullCheckOptimizer<B extends AbstractBlock<B>> extends LowLevelLowTierPhase<B> { @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes) { + protected void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder) { LIR ir = lirGenRes.getLIR(); List<? extends AbstractBlock<?>> blocks = ir.codeEmittingOrder(); NullCheckOptimizer.foldNullChecks(ir, blocks, target.implicitNullCheckLimit);
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/RedundantMoveElimination.java Fri Feb 06 19:43:08 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/RedundantMoveElimination.java Fri Feb 06 19:54:52 2015 +0100 @@ -44,7 +44,7 @@ public final class RedundantMoveElimination<B extends AbstractBlock<B>> extends LowLevelLowTierPhase<B> { @Override - protected void run(TargetDescription target, LIRGenerationResult lirGenRes) { + protected void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder) { Optimization redundantMoveElimination = new Optimization(); redundantMoveElimination.doOptimize(lirGenRes.getLIR(), lirGenRes.getFrameMap()); }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/phases/LowLevelLowTierPhase.java Fri Feb 06 19:43:08 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/phases/LowLevelLowTierPhase.java Fri Feb 06 19:54:52 2015 +0100 @@ -22,6 +22,8 @@ */ package com.oracle.graal.lir.phases; +import java.util.*; + import com.oracle.graal.api.code.*; import com.oracle.graal.compiler.common.cfg.*; import com.oracle.graal.lir.gen.*; @@ -29,13 +31,20 @@ public abstract class LowLevelLowTierPhase<B extends AbstractBlock<B>> extends LowLevelPhase<LowLevelLowTierPhase.Context<B>> { public static final class Context<B extends AbstractBlock<B>> { + final List<B> codeEmittingOrder; + final List<B> linearScanOrder; + + public Context(List<B> codeEmittingOrder, List<B> linearScanOrder) { + this.codeEmittingOrder = codeEmittingOrder; + this.linearScanOrder = linearScanOrder; + } } @Override protected void run(TargetDescription target, LIRGenerationResult lirGenRes, Context<B> context) { - run(target, lirGenRes); + run(target, lirGenRes, context.codeEmittingOrder, context.linearScanOrder); } - protected abstract void run(TargetDescription target, LIRGenerationResult lirGenRes); + protected abstract void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder); }