# HG changeset patch # User Thomas Wuerthinger # Date 1425997213 -3600 # Node ID b8cab8ce9827188c89a20e69f6476a187259b2af # Parent 7568501597c2eefa291e5c4a13c0ad42828bd035 Add succeeding stamp inference for integer test node. diff -r 7568501597c2 -r b8cab8ce9827 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java Tue Mar 10 15:19:57 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java Tue Mar 10 15:20:13 2015 +0100 @@ -62,12 +62,37 @@ @Override public Stamp getSucceedingStampForX(boolean negated) { + Stamp xStampGeneric = this.getX().stamp(); + Stamp yStampGeneric = this.getY().stamp(); + return getSucceedingStamp(negated, xStampGeneric, yStampGeneric); + } + + private static Stamp getSucceedingStamp(boolean negated, Stamp xStampGeneric, Stamp otherStampGeneric) { + if (xStampGeneric instanceof IntegerStamp && otherStampGeneric instanceof IntegerStamp) { + IntegerStamp xStamp = (IntegerStamp) xStampGeneric; + IntegerStamp otherStamp = (IntegerStamp) otherStampGeneric; + if (negated) { + if (Long.bitCount(otherStamp.upMask()) == 1) { + long newDownMask = xStamp.downMask() | otherStamp.upMask(); + if (xStamp.downMask() != newDownMask) { + return IntegerStamp.stampForMask(xStamp.getBits(), newDownMask, xStamp.upMask()).join(xStamp); + } + } + } else { + long restrictedUpMask = ((~otherStamp.downMask()) & xStamp.upMask()); + if (xStamp.upMask() != restrictedUpMask) { + return IntegerStamp.stampForMask(xStamp.getBits(), xStamp.downMask(), restrictedUpMask).join(xStamp); + } + } + } return null; } @Override public Stamp getSucceedingStampForY(boolean negated) { - return null; + Stamp xStampGeneric = this.getX().stamp(); + Stamp yStampGeneric = this.getY().stamp(); + return getSucceedingStamp(negated, yStampGeneric, xStampGeneric); } @Override