# HG changeset patch # User Lukas Stadler # Date 1399034905 -7200 # Node ID 9fa849f665cc0bfafe70c1f2210af7f2b3f39526 # Parent 1f4d56a1fdef12b6c9988e80c3a4f9cf863c548d cleanup phase within PartialEscapePhase diff -r 1f4d56a1fdef -r 9fa849f665cc graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EATestBase.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EATestBase.java Fri May 02 14:47:25 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EATestBase.java Fri May 02 14:48:25 2014 +0200 @@ -127,7 +127,7 @@ /** * Runs Escape Analysis on the given snippet and makes sure that no allocations remain in the * graph. - * + * * @param snippet the name of the method whose graph should be processed * @param expectedConstantResult if this is non-null, the resulting graph needs to have the * given constant return value @@ -157,7 +157,7 @@ new InliningPhase(new CanonicalizerPhase(true)).apply(graph, context); new DeadCodeEliminationPhase().apply(graph); new CanonicalizerPhase(true).apply(graph, context); - new PartialEscapePhase(iterativeEscapeAnalysis, false, new CanonicalizerPhase(true)).apply(graph, context); + new PartialEscapePhase(iterativeEscapeAnalysis, false, new CanonicalizerPhase(true), null).apply(graph, context); returnNodes = graph.getNodes(ReturnNode.class).snapshot(); } catch (Throwable e) { throw Debug.handle(e); diff -r 1f4d56a1fdef -r 9fa849f665cc graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java Fri May 02 14:47:25 2014 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java Fri May 02 14:48:25 2014 +0200 @@ -247,6 +247,6 @@ Assumptions assumptions = new Assumptions(false); HighTierContext context = new HighTierContext(getProviders(), assumptions, null, getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); new InliningPhase(new CanonicalizerPhase(true)).apply(graph, context); - new PartialEscapePhase(false, true, new CanonicalizerPhase(true)).apply(graph, context); + new PartialEscapePhase(false, true, new CanonicalizerPhase(true), null).apply(graph, context); } } diff -r 1f4d56a1fdef -r 9fa849f665cc graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java Fri May 02 14:47:25 2014 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java Fri May 02 14:48:25 2014 +0200 @@ -24,6 +24,8 @@ import static com.oracle.graal.debug.Debug.*; +import java.util.*; + import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; import com.oracle.graal.graph.*; @@ -46,7 +48,7 @@ } private final int maxIterations; - private final CanonicalizerPhase canonicalizer; + protected final CanonicalizerPhase canonicalizer; public EffectsPhase(int maxIterations, CanonicalizerPhase canonicalizer) { this.maxIterations = maxIterations; @@ -85,19 +87,24 @@ new DeadCodeEliminationPhase().apply(graph); + Set changedNodes = listener.getChangedNodes(); for (Node node : graph.getNodes()) { if (node instanceof Simplifiable) { - listener.getChangedNodes().add(node); + changedNodes.add(node); } } - if (canonicalizer != null) { - canonicalizer.applyIncremental(graph, context, listener.getChangedNodes()); - } + postIteration(graph, context, changedNodes); } changed = true; } return changed; } + protected void postIteration(final StructuredGraph graph, final PhaseContextT context, Set changedNodes) { + if (canonicalizer != null) { + canonicalizer.applyIncremental(graph, context, changedNodes); + } + } + protected abstract Closure createEffectsClosure(PhaseContextT context, SchedulePhase schedule); } diff -r 1f4d56a1fdef -r 9fa849f665cc graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapePhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapePhase.java Fri May 02 14:47:25 2014 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapePhase.java Fri May 02 14:48:25 2014 +0200 @@ -34,6 +34,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.options.*; +import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.graph.*; import com.oracle.graal.phases.schedule.*; @@ -42,7 +43,6 @@ public class PartialEscapePhase extends EffectsPhase { static class Options { - //@formatter:off @Option(help = "") public static final OptionValue OptEarlyReadElimination = new OptionValue<>(true); @@ -50,14 +50,28 @@ } private final boolean readElimination; + private final BasePhase cleanupPhase; public PartialEscapePhase(boolean iterative, CanonicalizerPhase canonicalizer) { - this(iterative, OptEarlyReadElimination.getValue(), canonicalizer); + this(iterative, OptEarlyReadElimination.getValue(), canonicalizer, null); + } + + public PartialEscapePhase(boolean iterative, CanonicalizerPhase canonicalizer, BasePhase cleanupPhase) { + this(iterative, OptEarlyReadElimination.getValue(), canonicalizer, cleanupPhase); } - public PartialEscapePhase(boolean iterative, boolean readElimination, CanonicalizerPhase canonicalizer) { + public PartialEscapePhase(boolean iterative, boolean readElimination, CanonicalizerPhase canonicalizer, BasePhase cleanupPhase) { super(iterative ? EscapeAnalysisIterations.getValue() : 1, canonicalizer); this.readElimination = readElimination; + this.cleanupPhase = cleanupPhase; + } + + @Override + protected void postIteration(StructuredGraph graph, PhaseContext context, Set changedNodes) { + super.postIteration(graph, context, changedNodes); + if (cleanupPhase != null) { + cleanupPhase.apply(graph, context); + } } @Override