< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java
Print this page
*** 22,43 ****
*/
package org.graalvm.compiler.loop;
- import jdk.internal.vm.compiler.collections.EconomicSet;
import org.graalvm.compiler.core.common.cfg.Loop;
- import org.graalvm.compiler.debug.DebugContext;
import org.graalvm.compiler.graph.Graph;
import org.graalvm.compiler.graph.Graph.DuplicationReplacement;
import org.graalvm.compiler.graph.Node;
import org.graalvm.compiler.graph.NodeBitMap;
import org.graalvm.compiler.nodes.EndNode;
import org.graalvm.compiler.nodes.FixedNode;
import org.graalvm.compiler.nodes.LoopBeginNode;
- import org.graalvm.compiler.nodes.LoopExitNode;
- import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.cfg.Block;
public class LoopFragmentWhole extends LoopFragment {
--- 22,39 ----
*** 66,76 ****
@Override
public NodeBitMap nodes() {
if (nodes == null) {
Loop<Block> loop = loop().loop();
! nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(loop.getBlocks()), LoopFragment.toHirExits(loop.getExits()));
}
return nodes;
}
@Override
--- 62,72 ----
@Override
public NodeBitMap nodes() {
if (nodes == null) {
Loop<Block> loop = loop().loop();
! nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(loop.getBlocks()), LoopFragment.toHirBlocks(loop.getLoopExits()));
}
return nodes;
}
@Override
*** 106,155 ****
}
return loop().entryPoint();
}
@Override
- protected void finishDuplication() {
- // TODO (gd) ?
- }
-
- void cleanupLoopExits() {
- LoopBeginNode loopBegin = original().loop().loopBegin();
- assert nodes == null || nodes.contains(loopBegin);
- StructuredGraph graph = loopBegin.graph();
- if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) {
- // After FrameStateAssignment ControlFlowGraph treats loop exits differently which means
- // that the LoopExitNodes can be in a block which post dominates the true loop exit. For
- // cloning to work right they must agree.
- EconomicSet<LoopExitNode> exits = EconomicSet.create();
- for (Block exitBlock : original().loop().loop().getExits()) {
- LoopExitNode exitNode = exitBlock.getLoopExit();
- if (exitNode == null) {
- exitNode = graph.add(new LoopExitNode(loopBegin));
- graph.addAfterFixed(exitBlock.getBeginNode(), exitNode);
- if (nodes != null) {
- nodes.mark(exitNode);
- }
- graph.getDebug().dump(DebugContext.VERBOSE_LEVEL, graph, "Adjusting loop exit node for %s", loopBegin);
- }
- exits.add(exitNode);
- }
- for (LoopExitNode exitNode : loopBegin.loopExits()) {
- if (!exits.contains(exitNode)) {
- if (nodes != null) {
- nodes.clear(exitNode);
- }
- graph.removeFixed(exitNode);
- }
- }
- }
-
- }
-
- @Override
protected void beforeDuplication() {
! cleanupLoopExits();
}
@Override
public void insertBefore(LoopEx loop) {
// TODO Auto-generated method stub
--- 102,113 ----
}
return loop().entryPoint();
}
@Override
protected void beforeDuplication() {
! // nothing to do
}
@Override
public void insertBefore(LoopEx loop) {
// TODO Auto-generated method stub
< prev index next >