# HG changeset patch # User Roland Schatz # Date 1366619406 -7200 # Node ID f78437ffb8d362bfe08ef30710db22c1d9f448d4 # Parent b6629b739a551c75ddd88ea3e172e32d69b39df8 Restructure class hierarchy of LocationNode. diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Apr 22 10:30:06 2013 +0200 @@ -507,7 +507,7 @@ if (n instanceof ArrayLengthNode) { ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n; ValueNode array = arrayLengthNode.array(); - ReadNode arrayLengthRead = graph.add(new ReadNode(array, LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Int, config.arrayLengthOffset, graph), StampFactory.positiveInt())); + ReadNode arrayLengthRead = graph.add(new ReadNode(array, ConstantLocationNode.create(LocationNode.FINAL_LOCATION, Kind.Int, config.arrayLengthOffset, graph), StampFactory.positiveInt())); arrayLengthRead.dependencies().add(tool.createNullCheckGuard(array)); graph.replaceFixedWithFixed(arrayLengthNode, arrayLengthRead); } else if (n instanceof Invoke) { @@ -533,8 +533,9 @@ // as HotSpot does not guarantee they are final values. assert vtableEntryOffset > 0; LoadHubNode hub = graph.add(new LoadHubNode(receiver, wordKind)); - ReadNode metaspaceMethod = graph.add(new ReadNode(hub, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, vtableEntryOffset, graph), StampFactory.forKind(wordKind()))); - ReadNode compiledEntry = graph.add(new ReadNode(metaspaceMethod, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, config.methodCompiledEntryOffset, graph), + ReadNode metaspaceMethod = graph.add(new ReadNode(hub, ConstantLocationNode.create(LocationNode.ANY_LOCATION, wordKind, vtableEntryOffset, graph), + StampFactory.forKind(wordKind()))); + ReadNode compiledEntry = graph.add(new ReadNode(metaspaceMethod, ConstantLocationNode.create(LocationNode.ANY_LOCATION, wordKind, config.methodCompiledEntryOffset, graph), StampFactory.forKind(wordKind()))); loweredCallTarget = graph.add(new HotSpotIndirectCallTargetNode(metaspaceMethod, compiledEntry, parameters, invoke.asNode().stamp(), signature, callTarget.targetMethod(), @@ -558,7 +559,7 @@ HotSpotResolvedJavaField field = (HotSpotResolvedJavaField) loadField.field(); ValueNode object = loadField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : loadField.object(); assert loadField.kind() != Kind.Illegal; - ReadNode memoryRead = graph.add(new ReadNode(object, LocationNode.create(field, field.getKind(), field.offset(), graph), loadField.stamp())); + ReadNode memoryRead = graph.add(new ReadNode(object, ConstantLocationNode.create(field, field.getKind(), field.offset(), graph), loadField.stamp())); memoryRead.dependencies().add(tool.createNullCheckGuard(object)); graph.replaceFixedWithFixed(loadField, memoryRead); @@ -573,7 +574,7 @@ StoreFieldNode storeField = (StoreFieldNode) n; HotSpotResolvedJavaField field = (HotSpotResolvedJavaField) storeField.field(); ValueNode object = storeField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : storeField.object(); - LocationNode location = LocationNode.create(field, field.getKind(), field.offset(), graph); + LocationNode location = ConstantLocationNode.create(field, field.getKind(), field.offset(), graph); WriteBarrierType barrierType = getFieldStoreBarrierType(storeField); WriteNode memoryWrite = graph.add(new WriteNode(object, storeField.value(), location, barrierType)); memoryWrite.dependencies().add(tool.createNullCheckGuard(object)); @@ -621,7 +622,7 @@ } } else { LoadHubNode arrayClass = graph.add(new LoadHubNode(array, wordKind)); - LocationNode location = LocationNode.create(LocationNode.FINAL_LOCATION, wordKind, config.arrayClassElementOffset, graph); + LocationNode location = ConstantLocationNode.create(LocationNode.FINAL_LOCATION, wordKind, config.arrayClassElementOffset, graph); FloatingReadNode arrayElementKlass = graph.unique(new FloatingReadNode(arrayClass, location, null, StampFactory.forKind(wordKind()))); CheckCastDynamicNode checkcast = graph.add(new CheckCastDynamicNode(arrayElementKlass, value)); graph.addBeforeFixed(storeIndexed, checkcast); @@ -656,7 +657,7 @@ } else if (n instanceof LoadHubNode) { LoadHubNode loadHub = (LoadHubNode) n; assert loadHub.kind() == wordKind; - LocationNode location = LocationNode.create(LocationNode.FINAL_LOCATION, wordKind, config.hubOffset, graph); + LocationNode location = ConstantLocationNode.create(LocationNode.FINAL_LOCATION, wordKind, config.hubOffset, graph); ValueNode object = loadHub.object(); assert !object.isConstant() || object.asConstant().isNull(); ValueNode guard = tool.createNullCheckGuard(object); diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -49,7 +49,7 @@ @Override public void generate(LIRGeneratorTool gen) { - Value addr = getLocation().generateLea(gen, getObject()); + Value addr = getLocation().generateLea(gen, gen.operand(getObject())); gen.setResult(this, addr); } } diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2011, 2012, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.extended; + +import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; + +/** + * Location node that has a constant displacement. Can represent addresses of the form [base + disp] + * where base is a node and disp is a constant. + */ +@NodeInfo(nameTemplate = "Loc {p#locationIdentity/s}") +public class ConstantLocationNode extends LocationNode { + + private final int displacement; + + public int displacement() { + return displacement; + } + + public static ConstantLocationNode create(Object identity, Kind kind, int displacement, Graph graph) { + return graph.unique(new ConstantLocationNode(identity, kind, displacement)); + } + + protected ConstantLocationNode(Object identity, Kind kind, int displacement) { + super(identity, kind); + this.displacement = displacement; + } + + @Override + public Value generateLea(LIRGeneratorTool gen, Value base) { + return gen.emitLea(base, displacement(), Value.ILLEGAL, 0); + } + + @Override + public Value generateLoad(LIRGeneratorTool gen, Value base, DeoptimizingNode deopting) { + return gen.emitLoad(getValueKind(), base, displacement(), Value.ILLEGAL, 0, deopting); + } + + @Override + public void generateStore(LIRGeneratorTool gen, Value base, Value value, DeoptimizingNode deopting) { + gen.emitStore(getValueKind(), base, displacement(), Value.ILLEGAL, 0, value, deopting); + } +} diff -r b6629b739a55 -r f78437ffb8d3 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 Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -53,7 +53,7 @@ @Override public void generate(LIRGeneratorTool gen) { - gen.setResult(this, location().generateLoad(gen, object(), this)); + gen.setResult(this, location().generateLoad(gen, gen.operand(object()), this)); } @Override diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -28,13 +28,15 @@ import com.oracle.graal.nodes.spi.*; /** - * Extension of a {@linkplain LocationNode location} to include a scaled index. Can represent - * locations in the form of [base + index * scale + disp] where base and index are nodes and scale - * and disp are integer constants. + * Location node that has a displacement and a scaled index. Can represent locations in the form of + * [base + index * scale + disp] where base and index are nodes and scale and disp are integer + * constants. */ +@NodeInfo(nameTemplate = "IdxLoc {p#locationIdentity/s}") public final class IndexedLocationNode extends LocationNode implements Canonicalizable { @Input private ValueNode index; + private final int displacement; private final int indexScaling; /** @@ -44,10 +46,6 @@ return index; } - public static Object getArrayLocation(Kind elementKind) { - return elementKind; - } - /** * @return Constant that is used to scale the index. */ @@ -60,8 +58,9 @@ } private IndexedLocationNode(Object identity, Kind kind, ValueNode index, int displacement, int indexScaling) { - super(identity, kind, displacement); + super(identity, kind); this.index = index; + this.displacement = displacement; this.indexScaling = indexScaling; } @@ -71,27 +70,27 @@ if (constantIndex != null) { long constantIndexLong = constantIndex.asLong(); constantIndexLong *= indexScaling; - constantIndexLong += displacement(); + constantIndexLong += displacement; int constantIndexInt = (int) constantIndexLong; if (constantIndexLong == constantIndexInt) { - return LocationNode.create(locationIdentity(), getValueKind(), constantIndexInt, graph()); + return ConstantLocationNode.create(locationIdentity(), getValueKind(), constantIndexInt, graph()); } } return this; } @Override - public Value generateLea(LIRGeneratorTool gen, ValueNode base) { - return gen.emitLea(gen.operand(base), displacement(), gen.operand(index()), indexScaling()); + public Value generateLea(LIRGeneratorTool gen, Value base) { + return gen.emitLea(base, displacement, gen.operand(index()), indexScaling()); } @Override - public Value generateLoad(LIRGeneratorTool gen, ValueNode base, DeoptimizingNode deopting) { - return gen.emitLoad(getValueKind(), gen.operand(base), displacement(), gen.operand(index()), indexScaling(), deopting); + public Value generateLoad(LIRGeneratorTool gen, Value base, DeoptimizingNode deopting) { + return gen.emitLoad(getValueKind(), base, displacement, gen.operand(index()), indexScaling(), deopting); } @Override - public void generateStore(LIRGeneratorTool gen, ValueNode base, ValueNode value, DeoptimizingNode deopting) { - gen.emitStore(getValueKind(), gen.operand(base), displacement(), gen.operand(index()), indexScaling(), gen.operand(value), deopting); + public void generateStore(LIRGeneratorTool gen, Value base, Value value, DeoptimizingNode deopting) { + gen.emitStore(getValueKind(), base, displacement, gen.operand(index()), indexScaling(), value, deopting); } } diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.graph.Node.ValueNumberable; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; @@ -31,20 +30,18 @@ import com.oracle.graal.nodes.type.*; /** - * A location for a memory access in terms of the kind of value accessed and how to access it. The - * base version can represent addresses of the form [base + disp] where base is a node and disp is a - * constant. + * A location for a memory access in terms of the kind of value accessed and how to access it. + * All locations have the form [base + location], where base is a node and location is defined + * by subclasses of the {@link LocationNode}. */ -@NodeInfo(nameTemplate = "Loc {p#locationIdentity/s}") -public class LocationNode extends FloatingNode implements LIRLowerable, ValueNumberable { +public abstract class LocationNode extends FloatingNode implements LIRLowerable, ValueNumberable { - private int displacement; private Kind valueKind; private Object locationIdentity; /** * Creates a new unique location identity for read and write operations. - * + * * @param name the name of the new location identity, for debugging purposes * @return the new location identity */ @@ -74,18 +71,9 @@ return elementKind; } - public int displacement() { - return displacement; - } - - public static LocationNode create(Object identity, Kind kind, int displacement, Graph graph) { - return graph.unique(new LocationNode(identity, kind, displacement)); - } - - protected LocationNode(Object identity, Kind kind, int displacement) { + protected LocationNode(Object identity, Kind kind) { super(StampFactory.extension()); assert kind != Kind.Illegal && kind != Kind.Void; - this.displacement = displacement; this.valueKind = kind; this.locationIdentity = identity; } @@ -103,15 +91,9 @@ // nothing to do... } - public Value generateLea(LIRGeneratorTool gen, ValueNode base) { - return gen.emitLea(gen.operand(base), displacement(), Value.ILLEGAL, 0); - } + public abstract Value generateLea(LIRGeneratorTool gen, Value base); - public Value generateLoad(LIRGeneratorTool gen, ValueNode base, DeoptimizingNode deopting) { - return gen.emitLoad(getValueKind(), gen.operand(base), displacement(), Value.ILLEGAL, 0, deopting); - } + public abstract Value generateLoad(LIRGeneratorTool gen, Value base, DeoptimizingNode deopting); - public void generateStore(LIRGeneratorTool gen, ValueNode base, ValueNode value, DeoptimizingNode deopting) { - gen.emitStore(getValueKind(), gen.operand(base), displacement(), Value.ILLEGAL, 0, gen.operand(value), deopting); - } + public abstract void generateStore(LIRGeneratorTool gen, Value base, Value value, DeoptimizingNode deopting); } diff -r b6629b739a55 -r f78437ffb8d3 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 Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -44,7 +44,7 @@ } private ReadNode(ValueNode object, int displacement, Object locationIdentity, Kind kind) { - super(object, object.graph().add(new LocationNode(locationIdentity, kind, displacement)), StampFactory.forKind(kind)); + super(object, ConstantLocationNode.create(locationIdentity, kind, displacement, object.graph()), StampFactory.forKind(kind)); } private ReadNode(ValueNode object, ValueNode location, ValueNode dependency) { @@ -57,7 +57,7 @@ @Override public void generate(LIRGeneratorTool gen) { - gen.setResult(this, location().generateLoad(gen, object(), this)); + gen.setResult(this, location().generateLoad(gen, gen.operand(object()), this)); } @Override @@ -73,8 +73,8 @@ public static ValueNode canonicalizeRead(ValueNode read, LocationNode location, ValueNode object, CanonicalizerTool tool) { MetaAccessProvider runtime = tool.runtime(); if (runtime != null && object != null && object.isConstant()) { - if (location.locationIdentity() == LocationNode.FINAL_LOCATION && location.getClass() == LocationNode.class) { - long displacement = location.displacement(); + if (location.locationIdentity() == LocationNode.FINAL_LOCATION && location instanceof ConstantLocationNode) { + long displacement = ((ConstantLocationNode) location).displacement(); Kind kind = location.getValueKind(); if (object.kind() == Kind.Object) { Object base = object.asConstant().asObject(); diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Mon Apr 22 10:30:06 2013 +0200 @@ -84,7 +84,7 @@ @Override public void generate(LIRGeneratorTool gen) { - location().generateStore(gen, object(), value(), this); + location().generateStore(gen, gen.operand(object()), gen.operand(value()), this); } @NodeIntrinsic diff -r b6629b739a55 -r f78437ffb8d3 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Mon Apr 22 09:54:57 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Mon Apr 22 10:30:06 2013 +0200 @@ -218,6 +218,10 @@ } private boolean isImplicitNullCheck(LocationNode location) { - return !(location instanceof IndexedLocationNode) && location.displacement() < target.implicitNullCheckLimit; + if (location instanceof ConstantLocationNode) { + return ((ConstantLocationNode) location).displacement() < target.implicitNullCheckLimit; + } else { + return false; + } } }