Mercurial > hg > truffle
changeset 19750:b8cab8ce9827
Add succeeding stamp inference for integer test node.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Tue, 10 Mar 2015 15:20:13 +0100 |
parents | 7568501597c2 |
children | 34fd3a18f211 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java |
diffstat | 1 files changed, 26 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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