changeset 22101:e2793adeaa43

CountedLoopInfo: allow using converted init&stride to do the computation using a different integer type
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Thu, 25 Jun 2015 16:00:08 +0200
parents e039ecc24fea
children 4918409846d8
files graal/com.oracle.graal.loop/src/com/oracle/graal/loop/BasicInductionVariable.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java
diffstat 2 files changed, 14 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/BasicInductionVariable.java	Fri Jun 26 15:24:26 2015 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/BasicInductionVariable.java	Thu Jun 25 16:00:08 2015 +0200
@@ -133,17 +133,14 @@
             stride = IntegerConvertNode.convert(stride, stamp, graph());
             initNode = IntegerConvertNode.convert(initNode, stamp, graph());
         }
-        ValueNode maxTripCount = loop.counted().maxTripCountNode(assumePositiveTripCount);
-        if (!maxTripCount.stamp().isCompatible(stamp)) {
-            maxTripCount = IntegerConvertNode.convert(maxTripCount, stamp, graph());
-        }
+        ValueNode maxTripCount = loop.counted().maxTripCountNode(assumePositiveTripCount, stride, initNode);
         return add(graph, mul(graph, stride, sub(graph, maxTripCount, ConstantNode.forIntegerStamp(stamp, 1, graph))), initNode);
     }
 
     @Override
     public ValueNode exitValueNode() {
         Stamp stamp = phi.stamp();
-        ValueNode maxTripCount = loop.counted().maxTripCountNode(false);
+        ValueNode maxTripCount = loop.counted().maxTripCountNode();
         if (!maxTripCount.stamp().isCompatible(stamp)) {
             maxTripCount = IntegerConvertNode.convert(maxTripCount, stamp, graph());
         }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Fri Jun 26 15:24:26 2015 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Thu Jun 25 16:00:08 2015 +0200
@@ -49,13 +49,12 @@
     }
 
     public ValueNode maxTripCountNode() {
-        return maxTripCountNode(false);
+        return maxTripCountNode(false, iv.strideNode(), iv.initNode());
     }
 
-    public ValueNode maxTripCountNode(boolean assumePositive) {
+    public ValueNode maxTripCountNode(boolean assumePositive, ValueNode strideNode, ValueNode initNode) {
         StructuredGraph graph = iv.valueNode().graph();
-        Stamp stamp = iv.valueNode().stamp();
-        ValueNode range = sub(graph, end, iv.initNode());
+        Stamp stamp = strideNode.stamp();
 
         ValueNode oneDirection;
         if (iv.direction() == Direction.Up) {
@@ -64,12 +63,19 @@
             assert iv.direction() == Direction.Down;
             oneDirection = ConstantNode.forIntegerStamp(stamp, -1, graph);
         }
+        ValueNode endNode;
+        if (!end.stamp().isCompatible(stamp)) {
+            endNode = IntegerConvertNode.convert(end, stamp, graph);
+        } else {
+            endNode = end;
+        }
+        ValueNode range = sub(graph, endNode, initNode);
         if (oneOff) {
             range = add(graph, range, oneDirection);
         }
         // round-away-from-zero divison: (range + stride -/+ 1) / stride
-        ValueNode denominator = add(graph, sub(graph, range, oneDirection), iv.strideNode());
-        ValueNode div = divBefore(graph, loop.entryPoint(), denominator, iv.strideNode());
+        ValueNode denominator = add(graph, sub(graph, range, oneDirection), strideNode);
+        ValueNode div = divBefore(graph, loop.entryPoint(), denominator, strideNode);
 
         if (assumePositive) {
             return div;