changeset 22225:a7bc10cc711c

Backout e2793adeaa43: CountedLoopInfo: allow using converted init&stride to do the computation using a different integer type. Add regression test.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 14 Jul 2015 13:36:37 +0200
parents 1cf2b4143f3c
children 3c622007e098
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java 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 3 files changed, 27 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java	Mon Jul 13 18:33:44 2015 +0200
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java	Tue Jul 14 13:36:37 2015 +0200
@@ -189,6 +189,22 @@
         test("decrementEqSnippet", 256, 0, 3);
     }
 
+    public static Result twoVariablesSnippet() {
+        Result ret = new Result();
+        int j = 0;
+        for (int i = 0; i < 1024; i++) {
+            j += 5;
+            ret.extremum = get(InductionVariable::extremumNode, j);
+        }
+        ret.exitValue = get(InductionVariable::exitValueNode, j);
+        return ret;
+    }
+
+    @Test
+    public void testTwoVariables() {
+        test("twoVariablesSnippet");
+    }
+
     @NodeInfo
     private static class IVPropertyNode extends FloatingNode implements LIRLowerable {
 
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/BasicInductionVariable.java	Mon Jul 13 18:33:44 2015 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/BasicInductionVariable.java	Tue Jul 14 13:36:37 2015 +0200
@@ -133,14 +133,17 @@
             stride = IntegerConvertNode.convert(stride, stamp, graph());
             initNode = IntegerConvertNode.convert(initNode, stamp, graph());
         }
-        ValueNode maxTripCount = loop.counted().maxTripCountNode(assumePositiveTripCount, stride, initNode);
+        ValueNode maxTripCount = loop.counted().maxTripCountNode(assumePositiveTripCount);
+        if (!maxTripCount.stamp().isCompatible(stamp)) {
+            maxTripCount = IntegerConvertNode.convert(maxTripCount, stamp, graph());
+        }
         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();
+        ValueNode maxTripCount = loop.counted().maxTripCountNode(false);
         if (!maxTripCount.stamp().isCompatible(stamp)) {
             maxTripCount = IntegerConvertNode.convert(maxTripCount, stamp, graph());
         }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Mon Jul 13 18:33:44 2015 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Tue Jul 14 13:36:37 2015 +0200
@@ -49,12 +49,13 @@
     }
 
     public ValueNode maxTripCountNode() {
-        return maxTripCountNode(false, iv.strideNode(), iv.initNode());
+        return maxTripCountNode(false);
     }
 
-    public ValueNode maxTripCountNode(boolean assumePositive, ValueNode strideNode, ValueNode initNode) {
+    public ValueNode maxTripCountNode(boolean assumePositive) {
         StructuredGraph graph = iv.valueNode().graph();
-        Stamp stamp = strideNode.stamp();
+        Stamp stamp = iv.valueNode().stamp();
+        ValueNode range = sub(graph, end, iv.initNode());
 
         ValueNode oneDirection;
         if (iv.direction() == Direction.Up) {
@@ -63,19 +64,12 @@
             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), strideNode);
-        ValueNode div = divBefore(graph, loop.entryPoint(), denominator, strideNode);
+        ValueNode denominator = add(graph, sub(graph, range, oneDirection), iv.strideNode());
+        ValueNode div = divBefore(graph, loop.entryPoint(), denominator, iv.strideNode());
 
         if (assumePositive) {
             return div;