# HG changeset patch # User Gilles Duboscq # Date 1342650437 -7200 # Node ID 16c3284c94cdb15bd127ba3ee82c9e21bd99bfce # Parent 911315a3e642a5ba31df288c29619c7724869d70 Try an iterative version of CheckCastElimination + Canonicalization diff -r 911315a3e642 -r 16c3284c94cd 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 Wed Jul 18 13:49:51 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Jul 19 00:27:17 2012 +0200 @@ -140,12 +140,8 @@ new PropagateTypeCachePhase(target, runtime, assumptions).apply(graph); } - if (GraalOptions.CheckCastElimination) { - new CheckCastEliminationPhase().apply(graph); - } - - if (GraalOptions.OptCanonicalizer) { - new CanonicalizerPhase(target, runtime, assumptions).apply(graph); + if (GraalOptions.CheckCastElimination && GraalOptions.OptCanonicalizer) { + new IterativeCheckCastEliminationPhase(target, runtime, assumptions).apply(graph); } } @@ -199,11 +195,8 @@ } new RemoveValueProxyPhase().apply(graph); - if (GraalOptions.CheckCastElimination) { - new CheckCastEliminationPhase().apply(graph); - } - if (GraalOptions.OptCanonicalizer) { - new CanonicalizerPhase(target, runtime, assumptions).apply(graph); + if (GraalOptions.CheckCastElimination && GraalOptions.OptCanonicalizer) { + new IterativeCheckCastEliminationPhase(target, runtime, assumptions).apply(graph); } plan.runPhases(PhasePosition.MID_LEVEL, graph); diff -r 911315a3e642 -r 16c3284c94cd graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CheckCastEliminationPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CheckCastEliminationPhase.java Wed Jul 18 13:49:51 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CheckCastEliminationPhase.java Thu Jul 19 00:27:17 2012 +0200 @@ -47,10 +47,12 @@ private static final DebugMetric metricGuardsReplaced = Debug.metric("GuardsReplaced"); private StructuredGraph graph; + private boolean graphModified; @Override protected void run(StructuredGraph inputGraph) { graph = inputGraph; + graphModified = false; new EliminateCheckCasts(graph.start(), new State()).apply(); } @@ -305,6 +307,7 @@ BooleanNode condition = guard.condition(); ValueNode existingGuards = guard.negated() ? state.falseConditions.get(condition) : state.trueConditions.get(condition); if (existingGuards != null) { + graphModified = true; guard.replaceAtUsages(existingGuards); GraphUtil.killWithUnusedFloatingInputs(guard); metricGuardsReplaced.increment(); @@ -318,6 +321,7 @@ removeCheck = true; } if (removeCheck) { + graphModified = true; metricNullCheckGuardRemoved.increment(); } } @@ -342,6 +346,7 @@ piNode = graph.unique(new PiNode(checkCast.object(), lastBegin, nonNull ? StampFactory.declaredNonNull(type) : StampFactory.declared(type))); checkCast.replaceAtUsages(piNode); graph.removeFixed(checkCast); + graphModified = true; metricCheckCastRemoved.increment(); } } else if (node instanceof IfNode) { @@ -382,6 +387,7 @@ } } if (replaceWith != null) { + graphModified = true; ifNode.setCompare(replaceWith); if (compare.usages().isEmpty()) { GraphUtil.killWithUnusedFloatingInputs(compare); @@ -391,4 +397,8 @@ } } + public boolean wasGraphModfied() { + return graphModified; + } + } diff -r 911315a3e642 -r 16c3284c94cd graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/IterativeCheckCastEliminationPhase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/IterativeCheckCastEliminationPhase.java Thu Jul 19 00:27:17 2012 +0200 @@ -0,0 +1,55 @@ +/* + * 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 com.oracle.graal.api.code.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; + + +public class IterativeCheckCastEliminationPhase extends Phase { + private final TargetDescription target; + private final GraalCodeCacheProvider runtime; + private final Assumptions assumptions; + + public IterativeCheckCastEliminationPhase(TargetDescription target, GraalCodeCacheProvider runtime, Assumptions assumptions) { + this.target = target; + // TODO Auto-generated constructor stub + this.runtime = runtime; + this.assumptions = assumptions; + } + + @Override + protected void run(StructuredGraph graph) { + CheckCastEliminationPhase eliminate = new CheckCastEliminationPhase(); + CanonicalizerPhase canon = new CanonicalizerPhase(target, runtime, assumptions); + while (true) { + eliminate.apply(graph); + if (!eliminate.wasGraphModfied()) { + break; + } + canon.apply(graph); + } + } + +}