changeset 23105:ffeb971349e1

detect min/max constructs in ConditionalNode
author Lukas Stadler <lukas.stadler@oracle.com>
date Fri, 27 Nov 2015 16:46:14 +0100
parents 0ee453f11459
children fd3b0d8cf1f7
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java
diffstat 1 files changed, 29 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java	Fri Nov 27 11:03:45 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java	Fri Nov 27 16:46:14 2015 +0100
@@ -27,6 +27,8 @@
 
 import com.oracle.graal.compiler.common.calc.Condition;
 import com.oracle.graal.compiler.common.type.IntegerStamp;
+import com.oracle.graal.compiler.common.type.Stamp;
+import com.oracle.graal.compiler.common.type.StampFactory;
 import com.oracle.graal.graph.NodeClass;
 import com.oracle.graal.graph.spi.Canonicalizable;
 import com.oracle.graal.graph.spi.CanonicalizerTool;
@@ -83,7 +85,33 @@
 
     @Override
     public boolean inferStamp() {
-        return updateStamp(trueValue.stamp().meet(falseValue.stamp()));
+        Stamp valueStamp = trueValue.stamp().meet(falseValue.stamp());
+        if (condition instanceof IntegerLessThanNode) {
+            IntegerLessThanNode lessThan = (IntegerLessThanNode) condition;
+            if (lessThan.getX() == trueValue && lessThan.getY() == falseValue) {
+                // this encodes a min operation
+                JavaConstant constant = lessThan.getX().asJavaConstant();
+                if (constant == null) {
+                    constant = lessThan.getY().asJavaConstant();
+                }
+                if (constant != null) {
+                    IntegerStamp bounds = StampFactory.forInteger(constant.getJavaKind(), constant.getJavaKind().getMinValue(), constant.asLong());
+                    valueStamp = valueStamp.join(bounds);
+                }
+            } else if (lessThan.getX() == falseValue && lessThan.getY() == trueValue) {
+                // this encodes a max operation
+                JavaConstant constant = lessThan.getX().asJavaConstant();
+                if (constant == null) {
+                    constant = lessThan.getY().asJavaConstant();
+                }
+                if (constant != null) {
+                    IntegerStamp bounds = StampFactory.forInteger(constant.getJavaKind(), constant.asLong(), constant.getJavaKind().getMaxValue());
+                    valueStamp = valueStamp.join(bounds);
+                }
+            }
+
+        }
+        return updateStamp(valueStamp);
     }
 
     public ValueNode trueValue() {