src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java Fri Jul 7 09:31:13 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java Fri Jul 7 09:31:13 2017
*** 20,42 ****
--- 20,43 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.loop;
import java.util.Collections;
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.StructuredGraph.GuardsStage;
! 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;
+ import org.graalvm.util.EconomicSet;
public class LoopFragmentWhole extends LoopFragment {
public LoopFragmentWhole(LoopEx loop) {
super(loop);
*** 63,78 ****
--- 64,75 ----
@Override
public NodeBitMap nodes() {
if (nodes == null) {
Loop<Block> loop = loop().loop();
if (loop.getHeader().getBeginNode().graph().getGuardsStage() == GuardsStage.AFTER_FSA) {
nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(loop.getBlocks()), Collections.emptyList());
} else {
nodes = LoopFragment.computeNodes(graph(), LoopFragment.toHirBlocks(loop.getBlocks()), LoopFragment.toHirExits(loop.getExits()));
}
}
return nodes;
}
@Override
protected ValueNode prim(ValueNode b) {
*** 111,120 ****
--- 108,155 ----
@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
}
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopFragmentWhole.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File