Mercurial > hg > graal-compiler
changeset 3112:607c6500c22e
Added immediate gvn for LocationNode instances.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Tue, 28 Jun 2011 15:28:30 +0200 |
parents | 46fe56f202a4 |
children | 0dfaf5733c63 |
files | graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java |
diffstat | 3 files changed, 21 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java Tue Jun 28 14:17:06 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java Tue Jun 28 15:28:30 2011 +0200 @@ -36,7 +36,12 @@ private CiKind valueKind; private Object locationIdentity; - public LocationNode(Object identity, CiKind kind, int displacement, Graph graph) { + public static LocationNode create(Object identity, CiKind kind, int displacement, Graph graph) { + LocationNode result = new LocationNode(identity, kind, displacement, graph); + return graph.ideal(result); + } + + private LocationNode(Object identity, CiKind kind, int displacement, Graph graph) { super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); this.displacement = displacement; this.valueKind = kind; @@ -73,7 +78,17 @@ return locationIdentity; } - public boolean same(LocationNode location) { - return valueKind == location.valueKind && displacement == location.displacement; + @Override + public boolean valueEqual(Node i) { + if (i instanceof LocationNode) { + LocationNode locationNode = (LocationNode) i; + return locationNode.locationIdentity == locationIdentity && locationNode.displacement == displacement; + } + return false; + } + + @Override + public int valueNumber() { + return locationIdentity.hashCode() + displacement; } }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java Tue Jun 28 14:17:06 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java Tue Jun 28 15:28:30 2011 +0200 @@ -38,7 +38,7 @@ Node memoryInput = n.inputs().variablePart().get(0); if (memoryInput instanceof WriteNode) { WriteNode other = (WriteNode) memoryInput; - if (other.object() == n.object() && other.location().same(n.location())) { + if (other.object() == n.object() && other.location() == n.location()) { if (GraalOptions.TraceReadElimination) { TTY.println("Eliminated memory read " + n + "and replaced with node " + other.value()); }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Tue Jun 28 14:17:06 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Tue Jun 28 15:28:30 2011 +0200 @@ -251,7 +251,7 @@ Graph graph = field.graph(); int displacement = ((HotSpotField) field.field()).offset(); assert field.kind != CiKind.Illegal; - ReadNode memoryRead = new ReadNode(field.field().kind().stackKind(), field.object(), new LocationNode(field.field(), field.field().kind(), displacement, graph), graph); + ReadNode memoryRead = new ReadNode(field.field().kind().stackKind(), field.object(), LocationNode.create(field.field(), field.field().kind(), displacement, graph), graph); memoryRead.setGuard((GuardNode) tool.createGuard(new IsNonNull(field.object(), graph))); memoryRead.setNext(field.next()); field.replaceAndDelete(memoryRead); @@ -262,7 +262,7 @@ } Graph graph = field.graph(); int displacement = ((HotSpotField) field.field()).offset(); - WriteNode memoryWrite = new WriteNode(CiKind.Illegal, field.object(), field.value(), new LocationNode(field.field(), field.field().kind(), displacement, graph), graph); + WriteNode memoryWrite = new WriteNode(CiKind.Illegal, field.object(), field.value(), LocationNode.create(field.field(), field.field().kind(), displacement, graph), graph); memoryWrite.setGuard((GuardNode) tool.createGuard(new IsNonNull(field.object(), graph))); memoryWrite.setStateAfter(field.stateAfter()); memoryWrite.setNext(field.next());