# HG changeset patch # User Thomas Wuerthinger # Date 1309267710 -7200 # Node ID 607c6500c22e823703a2e74345ccab57bb3b6f4c # Parent 46fe56f202a4db5b9dc2a7c2096d66259c4987e9 Added immediate gvn for LocationNode instances. diff -r 46fe56f202a4 -r 607c6500c22e graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java --- 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; } } diff -r 46fe56f202a4 -r 607c6500c22e graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java --- 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()); } diff -r 46fe56f202a4 -r 607c6500c22e graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java --- 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());