Mercurial > hg > graal-jvmci-8
changeset 22223: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;