Skip to content

Commit 99c5360

Browse files
committed
Add LoopUtility.stepLoopIVs
1 parent 50e9d6f commit 99c5360

File tree

1 file changed

+25
-0
lines changed
  • compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/util

1 file changed

+25
-0
lines changed

compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/util/LoopUtility.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,16 @@
2929
import org.graalvm.compiler.graph.Graph.NodeEvent;
3030
import org.graalvm.compiler.graph.Graph.NodeEventScope;
3131
import org.graalvm.compiler.nodes.LoopExitNode;
32+
import org.graalvm.compiler.nodes.NodeView;
3233
import org.graalvm.compiler.nodes.ProxyNode;
3334
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;
3442
import org.graalvm.compiler.nodes.loop.LoopEx;
3543
import org.graalvm.compiler.nodes.loop.LoopsData;
3644
import org.graalvm.compiler.nodes.spi.CoreProviders;
@@ -71,4 +79,21 @@ public static void removeObsoleteProxiesForLoop(LoopEx loop) {
7179
}
7280
}
7381
}
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+
}
7499
}

0 commit comments

Comments
 (0)