src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java

Print this page

        

*** 20,35 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.loop; - import static org.graalvm.compiler.graph.Node.newIdentityMap; - import java.util.Collection; - import java.util.Collections; import java.util.LinkedList; - import java.util.Map; import java.util.Queue; import org.graalvm.compiler.core.common.calc.Condition; import org.graalvm.compiler.core.common.cfg.Loop; import org.graalvm.compiler.core.common.type.IntegerStamp; --- 20,31 ----
*** 68,91 **** import org.graalvm.compiler.nodes.calc.SignExtendNode; import org.graalvm.compiler.nodes.calc.SubNode; import org.graalvm.compiler.nodes.calc.ZeroExtendNode; import org.graalvm.compiler.nodes.cfg.Block; import org.graalvm.compiler.nodes.cfg.ControlFlowGraph; ! import org.graalvm.compiler.nodes.debug.ControlFlowAnchorNode; import org.graalvm.compiler.nodes.extended.ValueAnchorNode; import org.graalvm.compiler.nodes.util.GraphUtil; import jdk.vm.ci.code.BytecodeFrame; public class LoopEx { - private final Loop<Block> loop; private LoopFragmentInside inside; private LoopFragmentWhole whole; private CountedLoopInfo counted; private LoopsData data; ! private Map<Node, InductionVariable> ivs; LoopEx(Loop<Block> loop, LoopsData data) { this.loop = loop; this.data = data; } --- 64,88 ---- import org.graalvm.compiler.nodes.calc.SignExtendNode; import org.graalvm.compiler.nodes.calc.SubNode; import org.graalvm.compiler.nodes.calc.ZeroExtendNode; import org.graalvm.compiler.nodes.cfg.Block; import org.graalvm.compiler.nodes.cfg.ControlFlowGraph; ! import org.graalvm.compiler.nodes.debug.ControlFlowAnchored; import org.graalvm.compiler.nodes.extended.ValueAnchorNode; import org.graalvm.compiler.nodes.util.GraphUtil; + import org.graalvm.util.Equivalence; + import org.graalvm.util.EconomicMap; import jdk.vm.ci.code.BytecodeFrame; public class LoopEx { private final Loop<Block> loop; private LoopFragmentInside inside; private LoopFragmentWhole whole; private CountedLoopInfo counted; private LoopsData data; ! private EconomicMap<Node, InductionVariable> ivs; LoopEx(Loop<Block> loop, LoopsData data) { this.loop = loop; this.data = data; }
*** 178,188 **** StructuredGraph graph = loopBegin().graph(); for (BinaryArithmeticNode<?> binary : whole().nodes().filter(BinaryArithmeticNode.class)) { if (!binary.isAssociative()) { continue; } ! BinaryArithmeticNode<?> result = BinaryArithmeticNode.reassociate(binary, invariant, binary.getX(), binary.getY()); if (result != binary) { if (Debug.isLogEnabled()) { Debug.log("%s : Reassociated %s into %s", graph.method().format("%H::%n"), binary, result); } if (!result.isAlive()) { --- 175,185 ---- StructuredGraph graph = loopBegin().graph(); for (BinaryArithmeticNode<?> binary : whole().nodes().filter(BinaryArithmeticNode.class)) { if (!binary.isAssociative()) { continue; } ! ValueNode result = BinaryArithmeticNode.reassociate(binary, invariant, binary.getX(), binary.getY()); if (result != binary) { if (Debug.isLogEnabled()) { Debug.log("%s : Reassociated %s into %s", graph.method().format("%H::%n"), binary, result); } if (!result.isAlive()) {
*** 308,328 **** Block b = work.remove(); if (loop().getExits().contains(b)) { exits.add((LoopExitNode) b.getBeginNode()); } else { blocks.add(b.getBeginNode()); ! for (Block d : b.getDominated()) { if (loop.getBlocks().contains(d)) { work.add(d); } } } } LoopFragment.computeNodes(branchNodes, branch.graph(), blocks, exits); } ! public Map<Node, InductionVariable> getInductionVariables() { if (ivs == null) { ivs = findInductionVariables(this); } return ivs; } --- 305,327 ---- Block b = work.remove(); if (loop().getExits().contains(b)) { exits.add((LoopExitNode) b.getBeginNode()); } else { blocks.add(b.getBeginNode()); ! Block d = b.getDominatedSibling(); ! while (d != null) { if (loop.getBlocks().contains(d)) { work.add(d); } + d = d.getDominatedSibling(); } } } LoopFragment.computeNodes(branchNodes, branch.graph(), blocks, exits); } ! public EconomicMap<Node, InductionVariable> getInductionVariables() { if (ivs == null) { ivs = findInductionVariables(this); } return ivs; }
*** 332,350 **** * which are derived from the basic ones. * * @param loop * @return a map from node to induction variable */ ! private static Map<Node, InductionVariable> findInductionVariables(LoopEx loop) { ! Map<Node, InductionVariable> ivs = newIdentityMap(); Queue<InductionVariable> scanQueue = new LinkedList<>(); LoopBeginNode loopBegin = loop.loopBegin(); AbstractEndNode forwardEnd = loopBegin.forwardEnd(); ! for (PhiNode phi : loopBegin.phis().filter(ValuePhiNode.class)) { ! ValueNode backValue = phi.singleBackValue(); ! if (backValue == PhiNode.MULTIPLE_VALUES) { continue; } ValueNode stride = addSub(loop, backValue, phi); if (stride != null) { BasicInductionVariable biv = new BasicInductionVariable(loop, (ValuePhiNode) phi, phi.valueAt(forwardEnd), stride, (BinaryArithmeticNode<?>) backValue); --- 331,349 ---- * which are derived from the basic ones. * * @param loop * @return a map from node to induction variable */ ! private static EconomicMap<Node, InductionVariable> findInductionVariables(LoopEx loop) { ! EconomicMap<Node, InductionVariable> ivs = EconomicMap.create(Equivalence.IDENTITY); Queue<InductionVariable> scanQueue = new LinkedList<>(); LoopBeginNode loopBegin = loop.loopBegin(); AbstractEndNode forwardEnd = loopBegin.forwardEnd(); ! for (PhiNode phi : loopBegin.valuePhis()) { ! ValueNode backValue = phi.singleBackValueOrThis(); ! if (backValue == phi) { continue; } ValueNode stride = addSub(loop, backValue, phi); if (stride != null) { BasicInductionVariable biv = new BasicInductionVariable(loop, (ValuePhiNode) phi, phi.valueAt(forwardEnd), stride, (BinaryArithmeticNode<?>) backValue);
*** 392,402 **** ivs.put(op, iv); scanQueue.offer(iv); } } } ! return Collections.unmodifiableMap(ivs); } private static ValueNode addSub(LoopEx loop, ValueNode op, ValueNode base) { if (op.stamp() instanceof IntegerStamp && (op instanceof AddNode || op instanceof SubNode)) { BinaryArithmeticNode<?> aritOp = (BinaryArithmeticNode<?>) op; --- 391,401 ---- ivs.put(op, iv); scanQueue.offer(iv); } } } ! return ivs; } private static ValueNode addSub(LoopEx loop, ValueNode op, ValueNode base) { if (op.stamp() instanceof IntegerStamp && (op instanceof AddNode || op instanceof SubNode)) { BinaryArithmeticNode<?> aritOp = (BinaryArithmeticNode<?>) op;
*** 430,451 **** /** * Deletes any nodes created within the scope of this object that have no usages. */ public void deleteUnusedNodes() { if (ivs != null) { ! for (InductionVariable iv : ivs.values()) { iv.deleteUnusedNodes(); } } } /** * @return true if all nodes in the loop can be duplicated. */ public boolean canDuplicateLoop() { for (Node node : inside().nodes()) { ! if (node instanceof ControlFlowAnchorNode) { return false; } if (node instanceof FrameState) { FrameState frameState = (FrameState) node; if (frameState.bci == BytecodeFrame.AFTER_EXCEPTION_BCI || frameState.bci == BytecodeFrame.UNWIND_BCI) { --- 429,450 ---- /** * Deletes any nodes created within the scope of this object that have no usages. */ public void deleteUnusedNodes() { if (ivs != null) { ! for (InductionVariable iv : ivs.getValues()) { iv.deleteUnusedNodes(); } } } /** * @return true if all nodes in the loop can be duplicated. */ public boolean canDuplicateLoop() { for (Node node : inside().nodes()) { ! if (node instanceof ControlFlowAnchored) { return false; } if (node instanceof FrameState) { FrameState frameState = (FrameState) node; if (frameState.bci == BytecodeFrame.AFTER_EXCEPTION_BCI || frameState.bci == BytecodeFrame.UNWIND_BCI) {
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File