|
29 | 29 | import org.graalvm.compiler.graph.Graph.NodeEvent; |
30 | 30 | import org.graalvm.compiler.graph.Graph.NodeEventScope; |
31 | 31 | import org.graalvm.compiler.nodes.LoopExitNode; |
| 32 | +import org.graalvm.compiler.nodes.NodeView; |
32 | 33 | import org.graalvm.compiler.nodes.ProxyNode; |
33 | 34 | import org.graalvm.compiler.nodes.StructuredGraph; |
| 35 | +import org.graalvm.compiler.nodes.ValueNode; |
| 36 | +import org.graalvm.compiler.nodes.ValuePhiNode; |
| 37 | +import org.graalvm.compiler.nodes.calc.AddNode; |
| 38 | +import org.graalvm.compiler.nodes.calc.IntegerConvertNode; |
| 39 | +import org.graalvm.compiler.nodes.calc.MulNode; |
| 40 | +import org.graalvm.compiler.nodes.loop.BasicInductionVariable; |
| 41 | +import org.graalvm.compiler.nodes.loop.InductionVariable; |
34 | 42 | import org.graalvm.compiler.nodes.loop.LoopEx; |
35 | 43 | import org.graalvm.compiler.nodes.loop.LoopsData; |
36 | 44 | import org.graalvm.compiler.nodes.spi.CoreProviders; |
@@ -71,4 +79,21 @@ public static void removeObsoleteProxiesForLoop(LoopEx loop) { |
71 | 79 | } |
72 | 80 | } |
73 | 81 | } |
| 82 | + |
| 83 | + /** |
| 84 | + * Advance all of the loop's induction variables by {@code iterations} strides by modifying the |
| 85 | + * underlying phi's init value. |
| 86 | + */ |
| 87 | + public static void stepLoopIVs(StructuredGraph graph, LoopEx loop, ValueNode iterations) { |
| 88 | + for (InductionVariable iv : loop.getInductionVariables().getValues()) { |
| 89 | + if (!(iv instanceof BasicInductionVariable)) { |
| 90 | + // Only step basic IVs; this will advance derived IVs automatically. |
| 91 | + continue; |
| 92 | + } |
| 93 | + ValuePhiNode phi = ((BasicInductionVariable) iv).valueNode(); |
| 94 | + ValueNode convertedIterations = IntegerConvertNode.convert(iterations, iv.strideNode().stamp(NodeView.DEFAULT), NodeView.DEFAULT); |
| 95 | + ValueNode steppedInit = AddNode.create(phi.valueAt(0), MulNode.create(convertedIterations, iv.strideNode(), NodeView.DEFAULT), NodeView.DEFAULT); |
| 96 | + phi.setValueAt(0, graph.addOrUniqueWithInputs(steppedInit)); |
| 97 | + } |
| 98 | + } |
74 | 99 | } |
0 commit comments