Mercurial > hg > truffle
changeset 5833:2a9fda4f9f1e
Fix canonicalisation of final reads and factor out read/floating read canonicalization code
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 13 Jul 2012 15:33:02 +0200 |
parents | f489b0c20b56 |
children | 2b786c82e329 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/Access.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java |
diffstat | 5 files changed, 27 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- 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(); }
--- 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; + } }
--- 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; + } }
--- 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); } }
--- 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; } }