--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java 2017-03-20 17:40:13.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java 2017-03-20 17:40:13.000000000 -0700 @@ -22,12 +22,8 @@ */ 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; @@ -70,20 +66,21 @@ 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.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 loop; private LoopFragmentInside inside; private LoopFragmentWhole whole; private CountedLoopInfo counted; private LoopsData data; - private Map ivs; + private EconomicMap ivs; LoopEx(Loop loop, LoopsData data) { this.loop = loop; @@ -180,7 +177,7 @@ if (!binary.isAssociative()) { continue; } - BinaryArithmeticNode result = BinaryArithmeticNode.reassociate(binary, invariant, binary.getX(), binary.getY()); + 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); @@ -310,17 +307,19 @@ exits.add((LoopExitNode) b.getBeginNode()); } else { blocks.add(b.getBeginNode()); - for (Block d : b.getDominated()) { + 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 Map getInductionVariables() { + public EconomicMap getInductionVariables() { if (ivs == null) { ivs = findInductionVariables(this); } @@ -334,15 +333,15 @@ * @param loop * @return a map from node to induction variable */ - private static Map findInductionVariables(LoopEx loop) { - Map ivs = newIdentityMap(); + private static EconomicMap findInductionVariables(LoopEx loop) { + EconomicMap ivs = EconomicMap.create(Equivalence.IDENTITY); Queue 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) { + for (PhiNode phi : loopBegin.valuePhis()) { + ValueNode backValue = phi.singleBackValueOrThis(); + if (backValue == phi) { continue; } ValueNode stride = addSub(loop, backValue, phi); @@ -394,7 +393,7 @@ } } } - return Collections.unmodifiableMap(ivs); + return ivs; } private static ValueNode addSub(LoopEx loop, ValueNode op, ValueNode base) { @@ -432,7 +431,7 @@ */ public void deleteUnusedNodes() { if (ivs != null) { - for (InductionVariable iv : ivs.values()) { + for (InductionVariable iv : ivs.getValues()) { iv.deleteUnusedNodes(); } } @@ -443,7 +442,7 @@ */ public boolean canDuplicateLoop() { for (Node node : inside().nodes()) { - if (node instanceof ControlFlowAnchorNode) { + if (node instanceof ControlFlowAnchored) { return false; } if (node instanceof FrameState) {