# HG changeset patch # User Lukas Stadler # Date 1336652665 -7200 # Node ID 31ec401eb5922e00c4278bb5752e84b825866c67 # Parent 4485e0edd1af42f5d1a610ce34f514f26237f1b8# Parent c7f92c6246ba0d4d00b8076f6e1d7bc276c10f76 Merge diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu May 10 00:36:12 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu May 10 14:24:25 2012 +0200 @@ -172,6 +172,9 @@ new LoweringPhase(runtime).apply(graph); new CanonicalizerPhase(target, runtime, assumptions, true, null).apply(graph); + if (GraalOptions.CullFrameStates) { + new CullFrameStatesPhase().apply(graph); + } if (GraalOptions.Lower) { new FloatingReadPhase().apply(graph); if (GraalOptions.OptGVN) { diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java Thu May 10 00:36:12 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java Thu May 10 14:24:25 2012 +0200 @@ -164,6 +164,7 @@ // Code generator settings public static boolean PropagateTypes = ____; + public static boolean CullFrameStates = true; public static boolean UseProfilingInformation = true; static boolean RemoveNeverExecutedCode = true; static boolean UseExceptionProbability = true; diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CullFrameStatesPhase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CullFrameStatesPhase.java Thu May 10 14:24:25 2012 +0200 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.compiler.phases; + +import java.util.*; + +import com.oracle.graal.compiler.graph.*; +import com.oracle.graal.debug.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.util.*; + +/** + * This phase culls unused FrameStates from the graph. + * It does a post order iteration over the graph, and + */ +public class CullFrameStatesPhase extends Phase { + + private static final DebugMetric metricFrameStatesCulled = Debug.metric("FrameStatesCulled"); + private static final DebugMetric metricMergesTraversed = Debug.metric("MergesTraversed"); + + @Override + protected void run(StructuredGraph graph) { + new CullFrameStates(graph.start(), new State(null)).apply(); + } + + public static class State implements MergeableState { + + private FrameState lastFrameState; + + public State(FrameState lastFrameState) { + this.lastFrameState = lastFrameState; + } + + @Override + public boolean merge(MergeNode merge, List withStates) { + FrameState stateAfter = merge.stateAfter(); + if (merge instanceof LoopBeginNode) { + if (stateAfter != null) { + lastFrameState = stateAfter; + } + return true; + } + metricMergesTraversed.increment(); + if (stateAfter != null) { + for (State other : withStates) { + if (other.lastFrameState != lastFrameState) { + lastFrameState = stateAfter; + return true; + } + } + metricFrameStatesCulled.increment(); + merge.setStateAfter(null); + if (stateAfter.usages().isEmpty()) { + GraphUtil.killWithUnusedFloatingInputs(stateAfter); + } + } + return true; + } + + @Override + public void loopBegin(LoopBeginNode loopBegin) { + } + + @Override + public void loopEnds(LoopBeginNode loopBegin, List loopEndStates) { + } + + @Override + public void afterSplit(FixedNode node) { + } + + @Override + public State clone() { + return new State(lastFrameState); + } + } + + public static class CullFrameStates extends PostOrderNodeIterator { + + public CullFrameStates(FixedNode start, State initialState) { + super(start, initialState); + } + + @Override + protected void node(FixedNode node) { + if (node instanceof StateSplit) { + FrameState stateAfter = ((StateSplit) node).stateAfter(); + if (stateAfter != null) { + state.lastFrameState = stateAfter; + } + } + } + } + +} diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Thu May 10 00:36:12 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Thu May 10 14:24:25 2012 +0200 @@ -209,6 +209,9 @@ if (GraalOptions.Intrinsify) { new IntrinsificationPhase(runtime).apply(newGraph); } + if (GraalOptions.CullFrameStates) { + new CullFrameStatesPhase().apply(newGraph); + } if (GraalOptions.CacheGraphs && cache != null) { cache.put(newGraph); } diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Thu May 10 00:36:12 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Thu May 10 14:24:25 2012 +0200 @@ -60,6 +60,20 @@ return x(); } } + // canonicalize expressions like "(a + 1) + 2" + if (x() instanceof IntegerAddNode) { + IntegerAddNode other = (IntegerAddNode) x(); + if (other.y().isConstant()) { + ConstantNode sum; + if (kind() == CiKind.Int) { + sum = ConstantNode.forInt(y().asConstant().asInt() + other.y().asConstant().asInt(), graph()); + } else { + assert kind() == CiKind.Long; + sum = ConstantNode.forLong(y().asConstant().asLong() + other.y().asConstant().asLong(), graph()); + } + return graph().unique(new IntegerAddNode(kind(), other.x(), sum)); + } + } } return this; } diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Thu May 10 00:36:12 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Thu May 10 14:24:25 2012 +0200 @@ -57,6 +57,20 @@ if (c > 0 && CiUtil.isPowerOf2(c)) { return graph().unique(new LeftShiftNode(kind(), x(), ConstantNode.forInt(CiUtil.log2(c), graph()))); } + // canonicalize expressions like "(a * 1) * 2" + if (x() instanceof IntegerMulNode) { + IntegerMulNode other = (IntegerMulNode) x(); + if (other.y().isConstant()) { + ConstantNode sum; + if (kind() == CiKind.Int) { + sum = ConstantNode.forInt(y().asConstant().asInt() * other.y().asConstant().asInt(), graph()); + } else { + assert kind() == CiKind.Long; + sum = ConstantNode.forLong(y().asConstant().asLong() * other.y().asConstant().asLong(), graph()); + } + return graph().unique(new IntegerMulNode(kind(), other.x(), sum)); + } + } } return this; } diff -r 4485e0edd1af -r 31ec401eb592 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Thu May 10 00:36:12 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Thu May 10 14:24:25 2012 +0200 @@ -25,12 +25,12 @@ import java.lang.reflect.*; import java.util.*; -import com.oracle.max.cri.ci.*; -import com.oracle.max.cri.ri.*; import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.max.cri.ci.*; +import com.oracle.max.cri.ri.*; /** * The base class of all instructions that access fields. @@ -102,6 +102,15 @@ } @Override + public String toString(Verbosity verbosity) { + if (verbosity == Verbosity.Name) { + return super.toString(verbosity) + "#" + field.name(); + } else { + return super.toString(verbosity); + } + } + + @Override public boolean verify() { assertTrue(object != null, "Access object can not be null"); return super.verify();