# HG changeset patch # User Gilles Duboscq # Date 1358343375 -3600 # Node ID 8461d937ac18e7b9e652256c68705610b7839a97 # Parent 1f4ec05ba412ecf3c389e610123b4509ec707852 Better for Load/Read stamps for non-stack kinds Better stamps for Xors diff -r 1f4ec05ba412 -r 8461d937ac18 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Jan 16 14:33:29 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Jan 16 14:36:15 2013 +0100 @@ -26,6 +26,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "^") public final class XorNode extends LogicNode implements Canonicalizable, LIRLowerable { @@ -35,6 +36,11 @@ } @Override + public boolean inferStamp() { + return updateStamp(StampTool.xor(x().integerStamp(), y().integerStamp())); + } + + @Override public ValueNode canonical(CanonicalizerTool tool) { if (x() == y()) { return ConstantNode.forIntegerKind(kind(), 0, graph()); diff -r 1f4ec05ba412 -r 8461d937ac18 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 Jan 16 14:33:29 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Wed Jan 16 14:36:15 2013 +0100 @@ -38,11 +38,11 @@ super(object, location, stamp); } - public ReadNode(ValueNode object, int displacement, Object locationIdentity, Kind kind) { + private ReadNode(ValueNode object, int displacement, Object locationIdentity, Kind kind) { super(object, object.graph().add(new LocationNode(locationIdentity, kind, displacement)), StampFactory.forKind(kind)); } - public ReadNode(ValueNode object, ValueNode location) { + private ReadNode(ValueNode object, ValueNode location) { // Used by node intrinsics. Since the initial value for location is a parameter, i.e., a LocalNode, the // constructor cannot use the declared type LocationNode this(object, location, StampFactory.forNodeIntrinsic()); diff -r 1f4ec05ba412 -r 8461d937ac18 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java Wed Jan 16 14:33:29 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java Wed Jan 16 14:36:15 2013 +0100 @@ -38,7 +38,7 @@ private final long mask; public IntegerStamp(Kind kind) { - this(kind, kind.getMinValue(), kind.getMaxValue(), defaultMask(kind)); + this(kind.getStackKind(), kind.getMinValue(), kind.getMaxValue(), defaultMask(kind)); } public IntegerStamp(Kind kind, long lowerBound, long upperBound, long mask) { diff -r 1f4ec05ba412 -r 8461d937ac18 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java Wed Jan 16 14:33:29 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java Wed Jan 16 14:36:15 2013 +0100 @@ -64,8 +64,8 @@ } public static Stamp forKind(Kind kind) { - assert stampCache[kind.getStackKind().ordinal()] != null : "unexpected forKind(" + kind + ")"; - return stampCache[kind.getStackKind().ordinal()]; + assert stampCache[kind.ordinal()] != null : "unexpected forKind(" + kind + ")"; + return stampCache[kind.ordinal()]; } public static Stamp forVoid() { diff -r 1f4ec05ba412 -r 8461d937ac18 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java Wed Jan 16 14:33:29 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java Wed Jan 16 14:36:15 2013 +0100 @@ -130,6 +130,12 @@ return stampForMask(kind, mask); } + public static Stamp xor(IntegerStamp stamp1, IntegerStamp stamp2) { + Kind kind = stamp1.kind(); + long mask = stamp1.mask() | stamp2.mask(); + return stampForMask(kind, mask); + } + public static Stamp unsignedRightShift(IntegerStamp value, IntegerStamp shift) { Kind kind = value.kind(); if (shift.lowerBound() == shift.upperBound()) {