# HG changeset patch # User Doug Simon # Date 1336143178 -7200 # Node ID a250ca83684e3ea207a19f8b269d67775f5fb2f1 # Parent 37055c1c549ad02fd441dff3d147024534c6ea86 extended canonicalization so that a caller can specify a CiConstant value is an immutable object or array diff -r 37055c1c549a -r a250ca83684e 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 May 04 16:38:38 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Fri May 04 16:52:58 2012 +0200 @@ -170,7 +170,7 @@ graph.mark(); new LoweringPhase(runtime).apply(graph); - new CanonicalizerPhase(target, runtime, true, assumptions).apply(graph); + new CanonicalizerPhase(target, runtime, assumptions, true, null).apply(graph); if (GraalOptions.Lower) { new FloatingReadPhase().apply(graph); diff -r 37055c1c549a -r a250ca83684e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java Fri May 04 16:38:38 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java Fri May 04 16:52:58 2012 +0200 @@ -41,16 +41,18 @@ private final CiTarget target; private final CiAssumptions assumptions; private final RiRuntime runtime; + private final IsImmutablePredicate immutabilityPredicate; public CanonicalizerPhase(CiTarget target, RiRuntime runtime, CiAssumptions assumptions) { - this(target, runtime, false, assumptions); + this(target, runtime, assumptions, false, null); } - public CanonicalizerPhase(CiTarget target, RiRuntime runtime, boolean newNodes, CiAssumptions assumptions) { + public CanonicalizerPhase(CiTarget target, RiRuntime runtime, CiAssumptions assumptions, boolean newNodes, IsImmutablePredicate immutabilityPredicate) { this.newNodes = newNodes; this.target = target; this.assumptions = assumptions; this.runtime = runtime; + this.immutabilityPredicate = immutabilityPredicate; } @Override @@ -60,12 +62,20 @@ nodeWorkList.addAll(graph.getNewNodes()); } - canonicalize(graph, nodeWorkList, runtime, target, assumptions); + canonicalize(graph, nodeWorkList, runtime, target, assumptions, immutabilityPredicate); } - public static void canonicalize(StructuredGraph graph, NodeWorkList nodeWorkList, RiRuntime runtime, CiTarget target, CiAssumptions assumptions) { + public interface IsImmutablePredicate { + /** + * Determines if a given constant is an object/array whose current + * fields/elements will never change. + */ + boolean apply(CiConstant constant); + } + + public static void canonicalize(StructuredGraph graph, NodeWorkList nodeWorkList, RiRuntime runtime, CiTarget target, CiAssumptions assumptions, IsImmutablePredicate immutabilityPredicate) { graph.trackInputChange(nodeWorkList); - Tool tool = new Tool(nodeWorkList, runtime, target, assumptions); + Tool tool = new Tool(nodeWorkList, runtime, target, assumptions, immutabilityPredicate); for (Node node : nodeWorkList) { METRIC_PROCESSED_NODES.increment(); if (node instanceof Canonicalizable) { @@ -146,12 +156,14 @@ private final RiRuntime runtime; private final CiTarget target; private final CiAssumptions assumptions; + private final IsImmutablePredicate immutabilityPredicate; - public Tool(NodeWorkList nodeWorkList, RiRuntime runtime, CiTarget target, CiAssumptions assumptions) { + public Tool(NodeWorkList nodeWorkList, RiRuntime runtime, CiTarget target, CiAssumptions assumptions, IsImmutablePredicate immutabilityPredicate) { this.nodeWorkList = nodeWorkList; this.runtime = runtime; this.target = target; this.assumptions = assumptions; + this.immutabilityPredicate = immutabilityPredicate; } @Override @@ -185,5 +197,10 @@ public void addToWorkList(Node node) { nodeWorkList.add(node); } + + @Override + public boolean isImmutable(CiConstant objectConstant) { + return immutabilityPredicate != null && immutabilityPredicate.apply(objectConstant); + } } } diff -r 37055c1c549a -r a250ca83684e 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 Fri May 04 16:38:38 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Fri May 04 16:52:58 2012 +0200 @@ -108,7 +108,7 @@ // get the new nodes here, the canonicalizer phase will reset the mark newNodes = graph.getNewNodes(); if (GraalOptions.OptCanonicalizer) { - new CanonicalizerPhase(target, runtime, true, assumptions).apply(graph); + new CanonicalizerPhase(target, runtime, assumptions, true, null).apply(graph); } // if (GraalOptions.Intrinsify) { // new IntrinsificationPhase(runtime).apply(graph); diff -r 37055c1c549a -r a250ca83684e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/types/PropagateTypeCachePhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/types/PropagateTypeCachePhase.java Fri May 04 16:38:38 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/types/PropagateTypeCachePhase.java Fri May 04 16:52:58 2012 +0200 @@ -124,7 +124,7 @@ // out.println(graph.method() + ": " + changes + " changes"); } - CanonicalizerPhase.canonicalize(graph, changedNodes, runtime, target, assumptions); + CanonicalizerPhase.canonicalize(graph, changedNodes, runtime, target, assumptions, null); // outputGraph(graph); } diff -r 37055c1c549a -r a250ca83684e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java Fri May 04 16:38:38 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java Fri May 04 16:52:58 2012 +0200 @@ -30,4 +30,10 @@ CiTarget target(); CiAssumptions assumptions(); RiRuntime runtime(); + + /** + * Determines if a given constant is an object/array whose current + * fields/elements will never change. + */ + boolean isImmutable(CiConstant objectConstant); }