diff --git a/core/src/main/java/org/teavm/common/IrreducibleGraphSplitter.java b/core/src/main/java/org/teavm/common/IrreducibleGraphSplitter.java index 14755fb2d..07732b6c3 100644 --- a/core/src/main/java/org/teavm/common/IrreducibleGraphSplitter.java +++ b/core/src/main/java/org/teavm/common/IrreducibleGraphSplitter.java @@ -310,6 +310,9 @@ class IrreducibleGraphSplitter { } copyMap[node] = copyIndex; int realNodeCount = realNodes[node].size(); + if (node == top) { + realNodeCount -= realNodesCopies.length; + } subgraphRealNodes[copyIndex] = Arrays.copyOfRange(realNodesCopies, realNodeCopiesIndex, realNodeCopiesIndex + realNodeCount); realNodeCopiesIndex += realNodeCount; diff --git a/core/src/test/java/org/teavm/common/GraphTest.java b/core/src/test/java/org/teavm/common/GraphTest.java index 734558ff8..55d1a4a6d 100644 --- a/core/src/test/java/org/teavm/common/GraphTest.java +++ b/core/src/test/java/org/teavm/common/GraphTest.java @@ -326,6 +326,55 @@ public class GraphTest { assertFalse("Should be reducible", GraphUtils.isIrreducible(result)); assertTrue("Should be equivalent", isEquivalent(backend, graph)); } + + @Test + public void irreducibleGraphSplit7() { + var builder = new GraphBuilder(); + addEdges(builder, 0, 35); + addEdges(builder, 1, 28); + addEdges(builder, 2, 25); + addEdges(builder, 3, 2, 15); + addEdges(builder, 4, 27); + addEdges(builder, 5, 13, 14); + addEdges(builder, 6, 8, 31); + addEdges(builder, 7, 11, 12); + addEdges(builder, 9, 10, 33); + addEdges(builder, 11, 27); + addEdges(builder, 12, 5); + addEdges(builder, 13, 26); + addEdges(builder, 14, 3); + addEdges(builder, 15, 23); + addEdges(builder, 16, 2, 24); + addEdges(builder, 17, 22); + addEdges(builder, 18, 23); + addEdges(builder, 19, 21, 34); + addEdges(builder, 20, 22); + addEdges(builder, 22, 18, 19); + addEdges(builder, 23, 16, 17); + addEdges(builder, 24); + addEdges(builder, 25, 1, 38); + addEdges(builder, 26, 4, 29); + addEdges(builder, 27, 6, 30); + addEdges(builder, 28, 36, 37); + addEdges(builder, 29, 3); + addEdges(builder, 30, 5); + addEdges(builder, 31, 7); + addEdges(builder, 32, 7); + addEdges(builder, 33, 7); + addEdges(builder, 34, 20); + addEdges(builder, 35, 9, 32); + + var graph = builder.build(); + var backend = new DefaultGraphSplittingBackend(graph); + var weights = new int[graph.size()]; + Arrays.fill(weights, 1); + GraphUtils.splitIrreducibleGraph(graph, weights, backend); + var result = backend.getGraph(); + + assertTrue("Should be irreducible", GraphUtils.isIrreducible(graph)); + assertFalse("Should be reducible", GraphUtils.isIrreducible(result)); + assertTrue("Should be equivalent", isEquivalent(backend, graph)); + } private static void addEdges(GraphBuilder builder, int from, int... to) { for (int target : to) {