Mercurial > hg > truffle
changeset 7489:8461d937ac18
Better for Load/Read stamps for non-stack kinds
Better stamps for Xors
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 16 Jan 2013 14:36:15 +0100 |
parents | 1f4ec05ba412 |
children | 4c474119df1c |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java |
diffstat | 5 files changed, 17 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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());
--- 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());
--- 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) {
--- 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() {
--- 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()) {