changeset 19747:39de568cbb02

Reintroduce CustomCanonicalizer
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 10 Mar 2015 15:09:26 +0100
parents c217db06182a
children 37969636e6f8
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java
diffstat 1 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Mar 10 15:08:56 2015 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Tue Mar 10 15:09:26 2015 +0100
@@ -51,8 +51,25 @@
 
     private boolean canonicalizeReads = true;
     private boolean simplify = true;
+    private final CustomCanonicalizer customCanonicalizer;
+
+    public abstract static class CustomCanonicalizer {
+
+        public Node canonicalize(Node node) {
+            return node;
+        }
+
+        @SuppressWarnings("unused")
+        public void simplify(Node node, SimplifierTool tool) {
+        }
+    }
 
     public CanonicalizerPhase() {
+        this(null);
+    }
+
+    public CanonicalizerPhase(CustomCanonicalizer customCanonicalizer) {
+        this.customCanonicalizer = customCanonicalizer;
     }
 
     public void disableReadCanonicalization() {
@@ -227,6 +244,14 @@
         }
 
         public boolean tryCanonicalize(final Node node, NodeClass<?> nodeClass) {
+            if (customCanonicalizer != null) {
+                Node canonical = customCanonicalizer.canonicalize(node);
+                if (performReplacement(node, canonical)) {
+                    return true;
+                } else {
+                    customCanonicalizer.simplify(node, tool);
+                }
+            }
             if (nodeClass.isCanonicalizable()) {
                 METRIC_CANONICALIZATION_CONSIDERED_NODES.increment();
                 try (Scope s = Debug.scope("CanonicalizeNode", node)) {
@@ -397,4 +422,8 @@
             }
         }
     }
+
+    public boolean getCanonicalizeReads() {
+        return canonicalizeReads;
+    }
 }