# HG changeset patch # User Gilles Duboscq # Date 1340357755 -7200 # Node ID 7482f7d084550e54ac518e71ea49a884bd75ee99 # Parent 87fc13b592587f3d3f2fbae481050c868bf80b63 Don't try to fold conditions when there is no runtime available Provide a runtime when doing full unrolling diff -r 87fc13b59258 -r 7482f7d08455 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 Fri Jun 22 11:35:11 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Fri Jun 22 11:35:55 2012 +0200 @@ -153,7 +153,7 @@ plan.runPhases(PhasePosition.HIGH_LEVEL, graph); if (GraalOptions.FullUnroll) { - new LoopFullUnrollPhase().apply(graph); + new LoopFullUnrollPhase(runtime).apply(graph); } if (GraalOptions.EscapeAnalysis && !plan.isPhaseDisabled(EscapeAnalysisPhase.class)) { diff -r 87fc13b59258 -r 7482f7d08455 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java Fri Jun 22 11:35:11 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java Fri Jun 22 11:35:55 2012 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.compiler.loop; +import com.oracle.graal.api.code.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.nodes.*; @@ -43,14 +44,14 @@ loop.inside().duplicate().insertBefore(loop); } - public static void fullUnroll(LoopEx loop) { + public static void fullUnroll(LoopEx loop, CodeCacheProvider runtime) { //assert loop.isCounted(); //TODO (gd) strenghten : counted with known trip count LoopBeginNode loopBegin = loop.loopBegin(); StructuredGraph graph = (StructuredGraph) loopBegin.graph(); while (!loopBegin.isDeleted()) { int mark = graph.getMark(); peel(loop); - new CanonicalizerPhase(null, null, null, mark, null).apply(graph); + new CanonicalizerPhase(null, runtime, null, mark, null).apply(graph); } } diff -r 87fc13b59258 -r 7482f7d08455 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Fri Jun 22 11:35:11 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Fri Jun 22 11:35:55 2012 +0200 @@ -23,11 +23,17 @@ package com.oracle.graal.compiler.phases; import com.oracle.graal.compiler.loop.*; +import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.nodes.*; public class LoopFullUnrollPhase extends Phase { + private final ExtendedRiRuntime runtime; + + public LoopFullUnrollPhase(ExtendedRiRuntime runtime) { + this.runtime = runtime; + } @Override protected void run(StructuredGraph graph) { @@ -40,7 +46,7 @@ for (final LoopEx loop : dataCounted.countedLoops()) { if (LoopPolicies.shouldFullUnroll(loop)) { Debug.log("FullUnroll %s", loop); - LoopTransformations.fullUnroll(loop); + LoopTransformations.fullUnroll(loop, runtime); Debug.dump(graph, "After fullUnroll %s", loop); peeled = true; break; diff -r 87fc13b59258 -r 7482f7d08455 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Fri Jun 22 11:35:11 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Fri Jun 22 11:35:55 2012 +0200 @@ -84,7 +84,7 @@ Constant trueConstant = conditionalNode.trueValue().asConstant(); Constant falseConstant = conditionalNode.falseValue().asConstant(); - if (falseConstant != null && trueConstant != null) { + if (falseConstant != null && trueConstant != null && runtime != null) { Boolean trueResult = cond.foldCondition(trueConstant, constant, runtime, unorderedIsTrue()); Boolean falseResult = cond.foldCondition(falseConstant, constant, runtime, unorderedIsTrue()); @@ -114,7 +114,7 @@ } public ValueNode canonical(CanonicalizerTool tool) { - if (x().isConstant() && y().isConstant()) { + if (x().isConstant() && y().isConstant() && tool.runtime() != null) { return ConstantNode.forBoolean(condition().foldCondition(x().asConstant(), y().asConstant(), tool.runtime(), unorderedIsTrue()), graph()); } if (x().isConstant()) { diff -r 87fc13b59258 -r 7482f7d08455 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java Fri Jun 22 11:35:11 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/Condition.java Fri Jun 22 11:35:55 2012 +0200 @@ -259,7 +259,7 @@ * @param unorderedIsTrue true if an undecided float comparison should result in "true" * @return true if the comparison is known to be true, false if the comparison is known to be false */ - public boolean foldCondition(Constant lt, Constant rt, CodeCacheProvider runtime, boolean unorderedIsTrue) { + public boolean foldCondition(Constant lt, Constant rt, MetaAccessProvider runtime, boolean unorderedIsTrue) { switch (lt.kind) { case Boolean: case Byte: diff -r 87fc13b59258 -r 7482f7d08455 graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java Fri Jun 22 11:35:11 2012 +0200 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/SnippetTemplate.java Fri Jun 22 11:35:55 2012 +0200 @@ -270,7 +270,7 @@ if (loopBegin != null) { LoopEx loop = new LoopsData(snippetCopy).loop(loopBegin); int mark = snippetCopy.getMark(); - LoopTransformations.fullUnroll(loop); + LoopTransformations.fullUnroll(loop, runtime); new CanonicalizerPhase(null, runtime, null, mark, null).apply(snippetCopy); } FixedNode explodeLoopNext = explodeLoop.next();