changeset 16160:866438171d1d

infer stamps for BitScanForwardNode and BitScanReverseNode
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 23 Jun 2014 14:13:01 +0200
parents d3f949fbdf30
children 13b2e8c4c720
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java
diffstat 2 files changed, 32 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java	Mon Jun 23 14:11:54 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java	Mon Jun 23 14:13:01 2014 +0200
@@ -24,29 +24,34 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
-import com.oracle.graal.graph.*;
-import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.spi.*;
 
-public class BitScanForwardNode extends UnaryNode implements LIRLowerable, Canonicalizable {
+public class BitScanForwardNode extends UnaryNode implements LIRLowerable {
 
     public BitScanForwardNode(ValueNode value) {
         super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits()), value);
+        assert value.getKind() == Kind.Int || value.getKind() == Kind.Long;
     }
 
     @Override
-    public Node canonical(CanonicalizerTool tool) {
-        if (getValue().isConstant()) {
-            Constant c = getValue().asConstant();
-            if (c.getKind() == Kind.Int) {
-                return ConstantNode.forInt(Integer.numberOfTrailingZeros(c.asInt()), graph());
-            } else if (c.getKind() == Kind.Long) {
-                return ConstantNode.forInt(Long.numberOfTrailingZeros(c.asLong()), graph());
-            }
+    public boolean inferStamp() {
+        IntegerStamp valueStamp = (IntegerStamp) getValue().stamp();
+        int min;
+        int max;
+        long mask = IntegerStamp.defaultMask(valueStamp.getBits());
+        int firstAlwaysSetBit = scan(valueStamp.downMask() & mask);
+        if (firstAlwaysSetBit == -1) {
+            int lastMaybeSetBit = BitScanReverseNode.scan(valueStamp.upMask() & mask);
+            min = -1;
+            max = lastMaybeSetBit;
+        } else {
+            int firstMaybeSetBit = scan(valueStamp.upMask() & mask);
+            min = firstMaybeSetBit;
+            max = firstAlwaysSetBit;
         }
-        return this;
+        return updateStamp(StampFactory.forInteger(Kind.Int, min, max));
     }
 
     @NodeIntrinsic
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java	Mon Jun 23 14:11:54 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java	Mon Jun 23 14:13:01 2014 +0200
@@ -24,29 +24,32 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
-import com.oracle.graal.graph.*;
-import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.spi.*;
 
-public class BitScanReverseNode extends UnaryNode implements LIRLowerable, Canonicalizable {
+public class BitScanReverseNode extends UnaryNode implements LIRLowerable {
 
     public BitScanReverseNode(ValueNode value) {
         super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits()), value);
+        assert value.getKind() == Kind.Int || value.getKind() == Kind.Long;
     }
 
     @Override
-    public Node canonical(CanonicalizerTool tool) {
-        if (getValue().isConstant()) {
-            Constant c = getValue().asConstant();
-            if (c.getKind() == Kind.Int) {
-                return ConstantNode.forInt(31 - Integer.numberOfLeadingZeros(c.asInt()), graph());
-            } else if (c.getKind() == Kind.Long) {
-                return ConstantNode.forInt(63 - Long.numberOfLeadingZeros(c.asLong()), graph());
-            }
+    public boolean inferStamp() {
+        IntegerStamp valueStamp = (IntegerStamp) getValue().stamp();
+        int min;
+        int max;
+        long mask = IntegerStamp.defaultMask(valueStamp.getBits());
+        int lastAlwaysSetBit = scan(valueStamp.downMask() & mask);
+        if (lastAlwaysSetBit == -1) {
+            min = -1;
+        } else {
+            min = lastAlwaysSetBit;
         }
-        return this;
+        int lastMaybeSetBit = scan(valueStamp.upMask() & mask);
+        max = lastMaybeSetBit;
+        return updateStamp(StampFactory.forInteger(Kind.Int, min, max));
     }
 
     @NodeIntrinsic