changeset 16159:d3f949fbdf30

infer stamps for BitCountNode
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 23 Jun 2014 14:11:54 +0200
parents d8aa3ea65d39
children 866438171d1d
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java
diffstat 1 files changed, 13 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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