# HG changeset patch # User Lukas Stadler # Date 1403525514 -7200 # Node ID d3f949fbdf3074ec6cd2fa666e445966e7317b58 # Parent d8aa3ea65d392e5b3e1bbdb6b45aeac1df7248a7 infer stamps for BitCountNode diff -r d8aa3ea65d39 -r d3f949fbdf30 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Mon Jun 23 14:11:54 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Mon Jun 23 14:11:54 2014 +0200 @@ -34,6 +34,19 @@ public BitCountNode(ValueNode value) { super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits()), value); + assert value.getKind() == Kind.Int || value.getKind() == Kind.Long; + } + + @Override + public boolean inferStamp() { + int min = 0; + int max = 0; + IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + for (int i = 0; i < valueStamp.getBits(); i++) { + min += (valueStamp.downMask() & (1L << i)) == 0 ? 0 : 1; + max += (valueStamp.upMask() & (1L << i)) == 0 ? 0 : 1; + } + return updateStamp(StampFactory.forInteger(Kind.Int, min, max)); } @Override