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