changeset 16226:cc4b4fd5c484

let LoadFieldNode implement Canonicalizable.Unary
author Lukas Stadler <lukas.stadler@oracle.com>
date Wed, 25 Jun 2014 16:55:01 +0200
parents 69ab53db5080
children e34bb128f227
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java
diffstat 2 files changed, 27 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java	Wed Jun 25 16:55:01 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java	Wed Jun 25 16:55:01 2014 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2014, 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
@@ -37,7 +37,7 @@
  * The {@code LoadFieldNode} represents a read of a static or instance field.
  */
 @NodeInfo(nameTemplate = "LoadField#{p#field/s}")
-public final class LoadFieldNode extends AccessFieldNode implements Canonicalizable, VirtualizableRoot {
+public final class LoadFieldNode extends AccessFieldNode implements Canonicalizable.Unary<ValueNode>, VirtualizableRoot {
 
     /**
      * Creates a new LoadFieldNode instance.
@@ -49,6 +49,10 @@
         super(createStamp(field), object, field);
     }
 
+    public ValueNode getValue() {
+        return object();
+    }
+
     private static Stamp createStamp(ResolvedJavaField field) {
         Kind kind = field.getKind();
         if (kind == Kind.Object && field.getType() instanceof ResolvedJavaType) {
@@ -60,22 +64,26 @@
 
     @Override
     public Node canonical(CanonicalizerTool tool) {
-        if (usages().isEmpty() && !isVolatile() && (isStatic() || StampTool.isObjectNonNull(object().stamp()))) {
+        return canonical(tool, getValue());
+    }
+
+    public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) {
+        if (usages().isEmpty() && !isVolatile() && (isStatic() || StampTool.isObjectNonNull(forObject.stamp()))) {
             return null;
         }
         MetaAccessProvider metaAccess = tool.getMetaAccess();
         if (tool.canonicalizeReads() && metaAccess != null) {
-            ConstantNode constant = asConstant(metaAccess);
+            ConstantNode constant = asConstant(metaAccess, forObject);
             if (constant != null) {
                 return constant;
             }
-            PhiNode phi = asPhi(metaAccess);
+            PhiNode phi = asPhi(metaAccess, forObject);
             if (phi != null) {
                 return phi;
             }
         }
-        if (!isStatic() && object().isNullConstant()) {
-            return graph().add(new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.NullCheckException));
+        if (!isStatic() && forObject.isNullConstant()) {
+            return new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.NullCheckException);
         }
         return this;
     }
@@ -83,22 +91,22 @@
     /**
      * Gets a constant value for this load if possible.
      */
-    public ConstantNode asConstant(MetaAccessProvider metaAccess) {
+    public ConstantNode asConstant(MetaAccessProvider metaAccess, ValueNode forObject) {
         Constant constant = null;
         if (isStatic()) {
             constant = field().readConstantValue(null);
-        } else if (object().isConstant() && !object().isNullConstant()) {
-            constant = field().readConstantValue(object().asConstant());
+        } else if (forObject.isConstant() && !forObject.isNullConstant()) {
+            constant = field().readConstantValue(forObject.asConstant());
         }
         if (constant != null) {
-            return ConstantNode.forConstant(constant, metaAccess, graph());
+            return ConstantNode.forConstant(constant, metaAccess);
         }
         return null;
     }
 
-    private PhiNode asPhi(MetaAccessProvider metaAccess) {
-        if (!isStatic() && field.isFinal() && object() instanceof ValuePhiNode && ((ValuePhiNode) object()).values().filter(isNotA(ConstantNode.class)).isEmpty()) {
-            PhiNode phi = (PhiNode) object();
+    private PhiNode asPhi(MetaAccessProvider metaAccess, ValueNode forObject) {
+        if (!isStatic() && field.isFinal() && forObject instanceof ValuePhiNode && ((ValuePhiNode) forObject).values().filter(isNotA(ConstantNode.class)).isEmpty()) {
+            PhiNode phi = (PhiNode) forObject;
             Constant[] constants = new Constant[phi.valueCount()];
             for (int i = 0; i < phi.valueCount(); i++) {
                 Constant constantValue = field().readConstantValue(phi.valueAt(i).asConstant());
@@ -107,11 +115,11 @@
                 }
                 constants[i] = constantValue;
             }
-            PhiNode newPhi = graph().addWithoutUnique(new ValuePhiNode(stamp(), phi.merge()));
+            ConstantNode[] constantNodes = new ConstantNode[phi.valueCount()];
             for (int i = 0; i < phi.valueCount(); i++) {
-                newPhi.addInput(ConstantNode.forConstant(constants[i], metaAccess, graph()));
+                constantNodes[i] = ConstantNode.forConstant(constants[i], metaAccess);
             }
-            return newPhi;
+            return new ValuePhiNode(stamp(), phi.merge(), constantNodes);
         }
         return null;
     }
--- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java	Wed Jun 25 16:55:01 2014 +0200
+++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java	Wed Jun 25 16:55:01 2014 +0200
@@ -134,9 +134,9 @@
      * Fold constant field reads, e.g. enum constants.
      */
     protected void rewriteLoadField(StructuredGraph graph, LoadFieldNode node) {
-        ConstantNode constant = node.asConstant(metaAccess);
+        ConstantNode constant = node.asConstant(metaAccess, node.object());
         if (constant != null) {
-            node.replaceAtUsages(constant);
+            node.replaceAtUsages(graph.unique(constant));
             graph.removeFixed(node);
         }
     }