Skip to content

Commit a7b33dd

Browse files
gergo-tkrodriguez
authored andcommitted
[GR-42385] Add optional precedingLoop edge to LoopBeginNode
PullRequest: graal/13311
2 parents 70e05b7 + 99c5360 commit a7b33dd

File tree

3 files changed

+38
-1
lines changed
  • compiler/src

3 files changed

+38
-1
lines changed

compiler/src/org.graalvm.compiler.asm.amd64/src/org/graalvm/compiler/asm/amd64/AMD64Assembler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ public static class VexRMOp extends VexRROp {
12631263
public static final VexRMOp VCVTTPD2DQ = new VexRMOp("VCVTTPD2DQ", P_66, M_0F, WIG, 0xE6, VEXOpAssertion.AVX1_AVX512F_VL, EVEXTuple.FVM, W1);
12641264
public static final VexRMOp VCVTTPD2QQ = new VexRMOp("VCVTTPD2QQ", P_66, M_0F, W1, 0x7A, VEXOpAssertion.AVX512DQ_VL, EVEXTuple.FVM, W1);
12651265
public static final VexRMOp VCVTDQ2PD = new VexRMOp("VCVTDQ2PD", P_F3, M_0F, WIG, 0xE6, VEXOpAssertion.AVX1_AVX512F_VL, EVEXTuple.HVM, W0);
1266-
public static final VexRMOp VBROADCASTSS = new VexRMOp("VBROADCASTSS", P_66, M_0F38, W0, 0x18, VEXOpAssertion.AVX1_AVX2_AVX512F_VL, EVEXTuple.FVM, W0);
1266+
public static final VexRMOp VBROADCASTSS = new VexRMOp("VBROADCASTSS", P_66, M_0F38, W0, 0x18, VEXOpAssertion.AVX1_AVX512F_VL, EVEXTuple.FVM, W0);
12671267
public static final VexRMOp VBROADCASTSD = new VexRMOp("VBROADCASTSD", P_66, M_0F38, W0, 0x19, VEXOpAssertion.AVX1_256ONLY_AVX512F_VL, EVEXTuple.FVM, W1);
12681268
public static final VexRMOp VBROADCASTF128 = new VexRMOp("VBROADCASTF128", P_66, M_0F38, W0, 0x1A, VEXOpAssertion.AVX1_256ONLY);
12691269
public static final VexRMOp VPBROADCASTI128 = new VexRMOp("VPBROADCASTI128", P_66, M_0F38, W0, 0x5A, VEXOpAssertion.AVX2_256ONLY);

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
public final class LoopBeginNode extends AbstractMergeNode implements IterableNodeType, LIRLowerable {
5353

5454
public static final NodeClass<LoopBeginNode> TYPE = NodeClass.create(LoopBeginNode.class);
55+
5556
protected double loopOrigFrequency;
5657
protected int nextEndIndex;
5758
protected int unswitches;
@@ -133,6 +134,8 @@ public boolean isProtectedNonOverflowingUnsigned() {
133134

134135
@OptionalInput(InputType.Guard) GuardingNode overflowGuard;
135136

137+
@OptionalInput(InputType.Association) ValueNode precedingLoop;
138+
136139
public static final CounterKey overflowSpeculationTaken = DebugContext.counter("CountedLoops_OverflowSpeculation_Taken");
137140
public static final CounterKey overflowSpeculationNotTaken = DebugContext.counter("CountedLoops_OverflowSpeculation_NotTaken");
138141

@@ -465,6 +468,15 @@ public void setOverflowGuard(GuardingNode overflowGuard) {
465468
this.overflowGuard = overflowGuard;
466469
}
467470

471+
public ValueNode getPrecedingLoop() {
472+
return precedingLoop;
473+
}
474+
475+
public void setPrecedingLoop(ValueNode precedingLoop) {
476+
updateUsages(this.precedingLoop, precedingLoop);
477+
this.precedingLoop = precedingLoop;
478+
}
479+
468480
private static final int NO_INCREMENT = Integer.MIN_VALUE;
469481

470482
/**

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)