# HG changeset patch # User Lukas Stadler # Date 1331741662 -3600 # Node ID 01ffb0fc9aecac03579bc657026de3c62dd7b627 # Parent 47e317d6c71db392fe5e19b2512fef13bd8a9ca6 propagate stamps while lowering diff -r 47e317d6c71d -r 01ffb0fc9aec graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/FloatingReadPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/FloatingReadPhase.java Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/FloatingReadPhase.java Wed Mar 14 17:14:22 2012 +0100 @@ -145,9 +145,9 @@ Debug.log("Register read to node %s.", readNode); FloatingReadNode floatingRead; if (readNode.location().locationIdentity() == LocationNode.FINAL_LOCATION) { - floatingRead = graph.unique(new FloatingReadNode(readNode.kind(), readNode.object(), readNode.guard(), readNode.location())); + floatingRead = graph.unique(new FloatingReadNode(readNode.object(), readNode.guard(), readNode.location(), readNode.stamp())); } else { - floatingRead = graph.unique(new FloatingReadNode(readNode.kind(), readNode.object(), readNode.guard(), readNode.location(), getLocationForRead(readNode))); + floatingRead = graph.unique(new FloatingReadNode(readNode.object(), readNode.guard(), readNode.location(), readNode.stamp(), getLocationForRead(readNode))); } graph.replaceFixedWithFloating(readNode, floatingRead); } diff -r 47e317d6c71d -r 01ffb0fc9aec graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotRuntime.java Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotRuntime.java Wed Mar 14 17:14:22 2012 +0100 @@ -25,17 +25,9 @@ import java.lang.reflect.*; import java.util.*; -import com.oracle.max.cri.ci.*; -import com.oracle.max.cri.ci.CiTargetMethod.Call; -import com.oracle.max.cri.ci.CiTargetMethod.DataPatch; -import com.oracle.max.cri.ci.CiTargetMethod.Safepoint; -import com.oracle.max.cri.ci.CiUtil.RefMapFormatter; -import com.oracle.max.cri.ri.*; -import com.oracle.max.cri.ri.RiType.Representation; -import com.oracle.max.criutils.*; import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; -import com.oracle.graal.compiler.phases.PhasePlan.*; +import com.oracle.graal.compiler.phases.PhasePlan.PhasePosition; import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; @@ -46,7 +38,16 @@ import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.type.*; import com.oracle.graal.snippets.nodes.*; +import com.oracle.max.cri.ci.*; +import com.oracle.max.cri.ci.CiTargetMethod.Call; +import com.oracle.max.cri.ci.CiTargetMethod.DataPatch; +import com.oracle.max.cri.ci.CiTargetMethod.Safepoint; +import com.oracle.max.cri.ci.CiUtil.RefMapFormatter; +import com.oracle.max.cri.ri.*; +import com.oracle.max.cri.ri.RiType.Representation; +import com.oracle.max.criutils.*; /** * CRI runtime implementation for the HotSpot VM. @@ -217,7 +218,7 @@ if (n instanceof ArrayLengthNode) { ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n; - SafeReadNode safeReadArrayLength = safeReadArrayLength(arrayLengthNode.graph(), arrayLengthNode.array()); + SafeReadNode safeReadArrayLength = safeReadArrayLength(arrayLengthNode.graph(), arrayLengthNode.array(), arrayLengthNode.stamp()); graph.replaceFixedWithFixed(arrayLengthNode, safeReadArrayLength); safeReadArrayLength.lower(tool); } else if (n instanceof LoadFieldNode) { @@ -227,7 +228,7 @@ } int displacement = ((HotSpotField) field.field()).offset(); assert field.kind() != CiKind.Illegal; - ReadNode memoryRead = graph.add(new ReadNode(field.field().kind(true).stackKind(), field.object(), LocationNode.create(field.field(), field.field().kind(true), displacement, graph))); + ReadNode memoryRead = graph.add(new ReadNode(field.object(), LocationNode.create(field.field(), field.field().kind(true), displacement, graph), field.stamp())); memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(field.object(), false)))); graph.replaceFixedWithFixed(field, memoryRead); } else if (n instanceof StoreFieldNode) { @@ -250,7 +251,7 @@ CiKind elementKind = loadIndexed.elementKind(); LocationNode arrayLocation = createArrayLocation(graph, elementKind, loadIndexed.index()); - ReadNode memoryRead = graph.add(new ReadNode(elementKind.stackKind(), loadIndexed.array(), arrayLocation)); + ReadNode memoryRead = graph.add(new ReadNode(loadIndexed.array(), arrayLocation, loadIndexed.stamp())); memoryRead.setGuard(boundsCheck); graph.replaceFixedWithFixed(loadIndexed, memoryRead); } else if (n instanceof StoreIndexedNode) { @@ -277,10 +278,10 @@ AnchorNode anchor = graph.add(new AnchorNode()); graph.addBeforeFixed(storeIndexed, anchor); GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(array, false))); - ReadNode arrayClass = graph.add(new ReadNode(CiKind.Object, array, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.hubOffset, graph))); + ReadNode arrayClass = graph.add(new ReadNode(array, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.hubOffset, graph), StampFactory.objectNonNull())); arrayClass.setGuard(guard); graph.addBeforeFixed(storeIndexed, arrayClass); - ReadNode arrayElementKlass = graph.add(new ReadNode(CiKind.Object, arrayClass, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.arrayClassElementOffset, graph))); + ReadNode arrayElementKlass = graph.add(new ReadNode(arrayClass, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.arrayClassElementOffset, graph), StampFactory.objectNonNull())); value = graph.unique(new CheckCastNode(anchor, arrayElementKlass, null, value)); } } @@ -298,7 +299,7 @@ assert load.kind() != CiKind.Illegal; IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, load.loadKind(), load.displacement(), load.offset(), graph); location.setIndexScalingEnabled(false); - ReadNode memoryRead = graph.add(new ReadNode(load.kind(), load.object(), location)); + ReadNode memoryRead = graph.add(new ReadNode(load.object(), location, load.stamp())); memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(load.object(), false)))); graph.replaceFixedWithFixed(load, memoryRead); } else if (n instanceof UnsafeStoreNode) { @@ -316,7 +317,7 @@ } else if (n instanceof ReadHubNode) { ReadHubNode objectClassNode = (ReadHubNode) n; LocationNode location = LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.hubOffset, graph); - ReadNode memoryRead = graph.add(new ReadNode(CiKind.Object, objectClassNode.object(), location)); + ReadNode memoryRead = graph.add(new ReadNode(objectClassNode.object(), location, StampFactory.objectNonNull())); memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(objectClassNode.object(), false)))); graph.replaceFixed(objectClassNode, memoryRead); } @@ -348,7 +349,7 @@ StructuredGraph graph = new StructuredGraph(); LocalNode receiver = graph.unique(new LocalNode(CiKind.Object, 0)); SafeReadNode klassOop = safeReadHub(graph, receiver); - ReadNode result = graph.add(new ReadNode(CiKind.Object, klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.classMirrorOffset, graph))); + ReadNode result = graph.add(new ReadNode(klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.classMirrorOffset, graph), StampFactory.objectNonNull())); ReturnNode ret = graph.add(new ReturnNode(result)); graph.start().setNext(klassOop); klassOop.setNext(ret); @@ -358,10 +359,10 @@ if (fullName.equals("getModifiers()I")) { StructuredGraph graph = new StructuredGraph(); LocalNode receiver = graph.unique(new LocalNode(CiKind.Object, 0)); - SafeReadNode klassOop = safeRead(graph, CiKind.Object, receiver, config.klassOopOffset); + SafeReadNode klassOop = safeRead(graph, CiKind.Object, receiver, config.klassOopOffset, StampFactory.objectNonNull()); graph.start().setNext(klassOop); - // TODO (thomaswue): Care about primitive classes! Crashes for primitive classes at the moment (klassOop == null) - ReadNode result = graph.add(new ReadNode(CiKind.Int, klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Int, config.klassModifierFlagsOffset, graph))); + // TODO(thomaswue): Care about primitive classes! Crashes for primitive classes at the moment (klassOop == null) + ReadNode result = graph.add(new ReadNode(klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Int, config.klassModifierFlagsOffset, graph), StampFactory.forKind(CiKind.Int))); ReturnNode ret = graph.add(new ReturnNode(result)); klassOop.setNext(ret); return graph; @@ -378,15 +379,15 @@ } private SafeReadNode safeReadHub(Graph graph, ValueNode value) { - return safeRead(graph, CiKind.Object, value, config.hubOffset); + return safeRead(graph, CiKind.Object, value, config.hubOffset, StampFactory.objectNonNull()); } - private SafeReadNode safeReadArrayLength(Graph graph, ValueNode value) { - return safeRead(graph, CiKind.Int, value, config.arrayLengthOffset); + private SafeReadNode safeReadArrayLength(Graph graph, ValueNode value, Stamp stamp) { + return safeRead(graph, CiKind.Int, value, config.arrayLengthOffset, stamp); } - private static SafeReadNode safeRead(Graph graph, CiKind kind, ValueNode value, int offset) { - return graph.add(new SafeReadNode(kind, value, LocationNode.create(LocationNode.FINAL_LOCATION, kind, offset, graph))); + private static SafeReadNode safeRead(Graph graph, CiKind kind, ValueNode value, int offset, Stamp stamp) { + return graph.add(new SafeReadNode(kind, value, LocationNode.create(LocationNode.FINAL_LOCATION, kind, offset, graph), stamp)); } public RiResolvedType getType(Class clazz) { diff -r 47e317d6c71d -r 01ffb0fc9aec 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 Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AccessNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.max.cri.ci.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; @@ -58,8 +57,8 @@ this.nullCheck = check; } - public AccessNode(CiKind kind, ValueNode object, LocationNode location) { - super(StampFactory.forKind(kind)); + public AccessNode(ValueNode object, LocationNode location, Stamp stamp) { + super(stamp); this.object = object; this.location = location; } diff -r 47e317d6c71d -r 01ffb0fc9aec 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 Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -22,7 +22,7 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.max.cri.ci.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.type.*; @@ -59,8 +59,8 @@ this.nullCheck = check; } - public FloatingAccessNode(CiKind kind, ValueNode object, GuardNode guard, LocationNode location) { - super(StampFactory.forKind(kind)); + public FloatingAccessNode(ValueNode object, GuardNode guard, LocationNode location, Stamp stamp) { + super(stamp); this.object = object; this.guard = guard; this.location = location; diff -r 47e317d6c71d -r 01ffb0fc9aec 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 Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -27,6 +27,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public final class FloatingReadNode extends FloatingAccessNode implements Node.IterableNodeType, LIRLowerable, Canonicalizable { @@ -37,8 +38,8 @@ return dependencies; } - public FloatingReadNode(CiKind kind, ValueNode object, GuardNode guard, LocationNode location, Node... dependencies) { - super(kind, object, guard, location); + public FloatingReadNode(ValueNode object, GuardNode guard, LocationNode location, Stamp stamp, Node... dependencies) { + super(object, guard, location, stamp); this.dependencies = new NodeInputList<>(this, dependencies); } diff -r 47e317d6c71d -r 01ffb0fc9aec 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 Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -27,12 +27,13 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public final class ReadNode extends AccessNode implements Node.IterableNodeType, LIRLowerable, Canonicalizable { - public ReadNode(CiKind kind, ValueNode object, LocationNode location) { - super(kind, object, location); + public ReadNode(ValueNode object, LocationNode location, Stamp stamp) { + super(object, location, stamp); } @Override diff -r 47e317d6c71d -r 01ffb0fc9aec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeAccessNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeAccessNode.java Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeAccessNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -32,8 +32,8 @@ @Input private ValueNode object; @Input private LocationNode location; - public SafeAccessNode(CiKind kind, ValueNode object, LocationNode location) { - super(StampFactory.forKind(kind)); + public SafeAccessNode(CiKind kind, ValueNode object, LocationNode location, Stamp stamp) { + super(stamp); this.object = object; this.location = location; } diff -r 47e317d6c71d -r 01ffb0fc9aec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -27,12 +27,13 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public class SafeReadNode extends SafeAccessNode implements Lowerable { - public SafeReadNode(CiKind kind, ValueNode object, LocationNode location) { - super(kind, object, location); + public SafeReadNode(CiKind kind, ValueNode object, LocationNode location, Stamp stamp) { + super(kind, object, location, stamp); assert object != null && location != null; } @@ -40,7 +41,7 @@ public void lower(CiLoweringTool tool) { StructuredGraph graph = (StructuredGraph) graph(); GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false))); - ReadNode read = graph.add(new ReadNode(kind(), object(), location())); + ReadNode read = graph.add(new ReadNode(object(), location(), stamp())); read.setGuard(guard); graph.replaceFixedWithFixed(this, read); diff -r 47e317d6c71d -r 01ffb0fc9aec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -27,6 +27,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public class SafeWriteNode extends SafeAccessNode implements Lowerable{ @@ -34,7 +35,7 @@ @Input private ValueNode value; public SafeWriteNode(ValueNode object, ValueNode value, LocationNode location) { - super(CiKind.Void, object, location); + super(CiKind.Void, object, location, StampFactory.forKind(CiKind.Void)); this.value = value; } diff -r 47e317d6c71d -r 01ffb0fc9aec 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 Wed Mar 14 17:08:06 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Wed Mar 14 17:14:22 2012 +0100 @@ -25,6 +25,7 @@ import com.oracle.max.cri.ci.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public final class WriteNode extends AccessNode implements LIRLowerable { @@ -35,7 +36,7 @@ } public WriteNode(ValueNode object, ValueNode value, LocationNode location) { - super(CiKind.Void, object, location); + super(object, location, StampFactory.forKind(CiKind.Void)); this.value = value; }