# HG changeset patch # User Roland Schatz # Date 1436873797 -7200 # Node ID a7bc10cc711cdfbd93f936f41f7e6c3a813a54c4 # Parent 1cf2b4143f3c3dc43e0bb66fd6b7f8ca922a40e2 Backout e2793adeaa43: CountedLoopInfo: allow using converted init&stride to do the computation using a different integer type. Add regression test. diff -r 1cf2b4143f3c -r a7bc10cc711c graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CountedLoopTest.java --- 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 { diff -r 1cf2b4143f3c -r a7bc10cc711c graal/com.oracle.graal.loop/src/com/oracle/graal/loop/BasicInductionVariable.java --- 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()); } diff -r 1cf2b4143f3c -r a7bc10cc711c graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java --- 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;