# HG changeset patch # User Gilles Duboscq # Date 1342186382 -7200 # Node ID 2a9fda4f9f1e7253efd57254e00825fac844566a # Parent f489b0c20b5614f7c591f4c398842139a0abce03 Fix canonicalisation of final reads and factor out read/floating read canonicalization code diff -r f489b0c20b56 -r 2a9fda4f9f1e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java Fri Jul 13 15:31:53 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java Fri Jul 13 15:33:02 2012 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.extended; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; public interface Access { @@ -31,4 +32,6 @@ LocationNode location(); void setNullCheck(boolean check); + + Node node(); } diff -r f489b0c20b56 -r 2a9fda4f9f1e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Fri Jul 13 15:31:53 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Fri Jul 13 15:33:02 2012 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.nodes.extended; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; @@ -52,4 +53,9 @@ this.object = object; this.location = location; } + + @Override + public Node node() { + return this; + } } diff -r f489b0c20b56 -r 2a9fda4f9f1e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Fri Jul 13 15:31:53 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Fri Jul 13 15:33:02 2012 +0200 @@ -24,6 +24,7 @@ import java.util.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.type.*; @@ -67,4 +68,9 @@ this.object = object; this.location = location; } + + @Override + public Node node() { + return this; + } } diff -r f489b0c20b56 -r 2a9fda4f9f1e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Fri Jul 13 15:31:53 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Fri Jul 13 15:33:02 2012 +0200 @@ -24,7 +24,6 @@ import java.util.*; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; @@ -59,18 +58,6 @@ @Override public ValueNode canonical(CanonicalizerTool tool) { - MetaAccessProvider runtime = tool.runtime(); - if (runtime != null && object() != null && object().isConstant() && object().kind() == Kind.Object) { - if (this.location() == LocationNode.FINAL_LOCATION && location().getClass() == LocationNode.class) { - Object value = object().asConstant().asObject(); - long displacement = location().displacement(); - Kind kind = location().kind(); - Constant constant = kind.readUnsafeConstant(value, displacement); - if (constant != null) { - return ConstantNode.forConstant(constant, runtime, graph()); - } - } - } - return this; + return ReadNode.canonicalizeRead(this, tool); } } diff -r f489b0c20b56 -r 2a9fda4f9f1e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Fri Jul 13 15:31:53 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Fri Jul 13 15:33:02 2012 +0200 @@ -42,18 +42,22 @@ @Override public ValueNode canonical(CanonicalizerTool tool) { + return canonicalizeRead(this, tool); + } + + public static ValueNode canonicalizeRead(Access read, CanonicalizerTool tool) { MetaAccessProvider runtime = tool.runtime(); - if (runtime != null && object() != null && object().isConstant() && object().kind() == Kind.Object) { - if (location() == LocationNode.FINAL_LOCATION && location().getClass() == LocationNode.class) { - Object value = object().asConstant().asObject(); - long displacement = location().displacement(); - Kind kind = location().kind(); + if (runtime != null && read.object() != null && read.object().isConstant() && read.object().kind() == Kind.Object) { + if (read.location().locationIdentity() == LocationNode.FINAL_LOCATION && read.location().getClass() == LocationNode.class) { + Object value = read.object().asConstant().asObject(); + long displacement = read.location().displacement(); + Kind kind = read.location().kind(); Constant constant = kind.readUnsafeConstant(value, displacement); if (constant != null) { - return ConstantNode.forConstant(constant, runtime, graph()); + return ConstantNode.forConstant(constant, runtime, read.node().graph()); } } } - return this; + return (ValueNode) read; } }