changeset 5357:a250ca83684e

extended canonicalization so that a caller can specify a CiConstant value is an immutable object or array
author Doug Simon <doug.simon@oracle.com>
date Fri, 04 May 2012 16:52:58 +0200
parents 37055c1c549a
children 8b5ef24da264
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/types/PropagateTypeCachePhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java
diffstat 5 files changed, 32 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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);
+        }
     }
 }
--- 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);
--- 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);
     }
 
--- 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);
 }