annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java @ 21554:b1530a6cce8c

renamed com.oracle.graal.[debug|options|hotspotvmconfig]* modules to com.oracle.jvmci.[debug|options|hotspotvmconfig]* modules (JBS:GRAAL-53)
author Doug Simon <doug.simon@oracle.com>
date Tue, 26 May 2015 23:21:15 +0200
parents 93c50cefb9e8
children 48c1ebd24120
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
4 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
8 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
13 * accompanied this code).
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
14 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
18 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
21 * questions.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
22 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.nodes;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
24
21543
93c50cefb9e8 moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21379
diff changeset
25 import static com.oracle.jvmci.common.JVMCIError.*;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
26
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
27 import java.util.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
28
21001
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
29 import com.oracle.graal.api.code.*;
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
30 import com.oracle.graal.api.meta.*;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
31 import com.oracle.graal.compiler.common.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.compiler.common.util.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.graph.*;
21554
b1530a6cce8c renamed com.oracle.graal.[debug|options|hotspotvmconfig]* modules to com.oracle.jvmci.[debug|options|hotspotvmconfig]* modules (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21543
diff changeset
34 import com.oracle.jvmci.debug.*;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
35
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
36 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
37 * Decoder for {@link EncodedGraph encoded graphs} produced by {@link GraphEncoder}. Support for
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
38 * loop explosion during decoding is built into this class, because it requires many interactions
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
39 * with the decoding process. Subclasses can provide canonicalization and simplification of nodes
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
40 * during decoding, as well as method inlining during decoding.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
41 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
42 public class GraphDecoder {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
43
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
44 public enum LoopExplosionKind {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
45 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
46 * No loop explosion.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
47 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
48 NONE,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
49 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
50 * Fully unroll all loops. The loops must have a known finite number of iterations. If a
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
51 * loop has multiple loop ends, they are merged so that the subsequent loop iteration is
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
52 * processed only once. For example, a loop with 4 iterations and 2 loop ends leads to
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
53 * 1+1+1+1 = 4 copies of the loop body. The merge can introduce phi functions.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
54 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
55 FULL_UNROLL,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
56 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
57 * Fully explode all loops. The loops must have a known finite number of iterations. If a
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
58 * loop has multiple loop ends, they are not merged so that subsequent loop iterations are
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
59 * processed multiple times. For example, a loop with 4 iterations and 2 loop ends leads to
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
60 * 1+2+4+8 = 15 copies of the loop body.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
61 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
62 FULL_EXPLODE,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
63 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
64 * like {@link #FULL_EXPLODE}, but copies of the loop body that have the exact same state
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
65 * are merged. This reduces the number of copies necessary, but can introduce loops again.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
66 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
67 MERGE_EXPLODE
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
68 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
69
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
70 /** Decoding state maintained for each encoded graph. */
21001
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
71 protected class MethodScope {
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
72 /** The target graph where decoded nodes are added to. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
73 public final StructuredGraph graph;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
74 /** The encode graph that is decoded. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
75 public final EncodedGraph encodedGraph;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
76 /** Access to the encoded graph. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
77 public final TypeReader reader;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
78 /** The kind of loop explosion to be performed during decoding. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
79 public final LoopExplosionKind loopExplosion;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
80
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
81 /** All return nodes encountered during decoding. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
82 public final List<ReturnNode> returnNodes;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
83 /** The exception unwind node encountered during decoding, or null. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
84 public UnwindNode unwindNode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
85
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
86 protected MethodScope(StructuredGraph graph, EncodedGraph encodedGraph, LoopExplosionKind loopExplosion) {
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
87 this.graph = graph;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
88 this.encodedGraph = encodedGraph;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
89 this.loopExplosion = loopExplosion;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
90 this.returnNodes = new ArrayList<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
91
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
92 if (encodedGraph != null) {
21001
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
93 reader = UnsafeArrayTypeReader.create(encodedGraph.getEncoding(), encodedGraph.getStartOffset(), architecture.supportsUnalignedMemoryAccess());
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
94 if (encodedGraph.nodeStartOffsets == null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
95 int nodeCount = reader.getUVInt();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
96 long[] nodeStartOffsets = new long[nodeCount];
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
97 for (int i = 0; i < nodeCount; i++) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
98 nodeStartOffsets[i] = encodedGraph.getStartOffset() - reader.getUV();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
99 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
100 encodedGraph.nodeStartOffsets = nodeStartOffsets;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
101 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
102 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
103 reader = null;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
104 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
105 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
106 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
107
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
108 /** Decoding state maintained for each loop in the encoded graph. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
109 protected static class LoopScope {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
110 public final LoopScope outer;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
111 public final int loopDepth;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
112 public final int loopIteration;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
113 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
114 * Upcoming loop iterations during loop explosions that have not been processed yet. Only
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
115 * used when {@link MethodScope#loopExplosion} is not {@link LoopExplosionKind#NONE}.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
116 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
117 public Deque<LoopScope> nextIterations;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
118 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
119 * Information about already processed loop iterations for state merging during loop
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
120 * explosion. Only used when {@link MethodScope#loopExplosion} is
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
121 * {@link LoopExplosionKind#MERGE_EXPLODE}.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
122 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
123 public final Map<LoopExplosionState, LoopExplosionState> iterationStates;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
124 public final int loopBeginOrderId;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
125 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
126 * The worklist of fixed nodes to process. Since we already the correct processing order
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
127 * from the orderId, we just set the orderId bit in the bitset when a node is ready for
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
128 * processing. The lowest set bit is the next node to process.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
129 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
130 public final BitSet nodesToProcess;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
131 /** Nodes that have been created, indexed by the orderId. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
132 public final Node[] createdNodes;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
133 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
134 * Nodes that have been created in outer loop scopes and existed before starting to process
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
135 * this loop, indexed by the orderId.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
136 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
137 public final Node[] initialCreatedNodes;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
138
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
139 protected LoopScope(MethodScope methodScope) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
140 this.outer = null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
141 this.nextIterations = null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
142 this.loopDepth = 0;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
143 this.loopIteration = 0;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
144 this.iterationStates = null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
145 this.loopBeginOrderId = -1;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
146
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
147 int nodeCount = methodScope.encodedGraph.nodeStartOffsets.length;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
148 this.nodesToProcess = new BitSet(nodeCount);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
149 this.initialCreatedNodes = new Node[nodeCount];
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
150 this.createdNodes = new Node[nodeCount];
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
151 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
152
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
153 protected LoopScope(LoopScope outer, int loopDepth, int loopIteration, int loopBeginOrderId, Node[] initialCreatedNodes, Deque<LoopScope> nextIterations,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
154 Map<LoopExplosionState, LoopExplosionState> iterationStates) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
155 this.outer = outer;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
156 this.loopDepth = loopDepth;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
157 this.loopIteration = loopIteration;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
158 this.nextIterations = nextIterations;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
159 this.iterationStates = iterationStates;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
160 this.loopBeginOrderId = loopBeginOrderId;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
161 this.nodesToProcess = new BitSet(initialCreatedNodes.length);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
162 this.initialCreatedNodes = initialCreatedNodes;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
163 this.createdNodes = Arrays.copyOf(initialCreatedNodes, initialCreatedNodes.length);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
164 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
165
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
166 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
167 public String toString() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
168 return loopDepth + "," + loopIteration + (loopBeginOrderId == -1 ? "" : "#" + loopBeginOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
169 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
170 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
171
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
172 protected static class LoopExplosionState {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
173 public final FrameState state;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
174 public final MergeNode merge;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
175 public final int hashCode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
176
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
177 protected LoopExplosionState(FrameState state, MergeNode merge) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
178 this.state = state;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
179 this.merge = merge;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
180
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
181 int h = 0;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
182 for (ValueNode value : state.values()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
183 if (value == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
184 h = h * 31 + 1234;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
185 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
186 h = h * 31 + value.hashCode();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
187 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
188 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
189 this.hashCode = h;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
190 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
191
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
192 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
193 public boolean equals(Object obj) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
194 if (!(obj instanceof LoopExplosionState)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
195 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
196 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
197
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
198 FrameState otherState = ((LoopExplosionState) obj).state;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
199 FrameState thisState = state;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
200 assert thisState.outerFrameState() == otherState.outerFrameState();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
201
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
202 Iterator<ValueNode> thisIter = thisState.values().iterator();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
203 Iterator<ValueNode> otherIter = otherState.values().iterator();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
204 while (thisIter.hasNext() && otherIter.hasNext()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
205 ValueNode thisValue = thisIter.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
206 ValueNode otherValue = otherIter.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
207 if (thisValue != otherValue) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
208 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
209 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
210 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
211 return thisIter.hasNext() == otherIter.hasNext();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
212 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
213
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
214 @Override
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
215 public int hashCode() {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
216 return hashCode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
217 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
218 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
219
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
220 /**
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
221 * Additional information encoded for {@link Invoke} nodes to allow method inlining without
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
222 * decoding the frame state and successors beforehand.
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
223 */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
224 protected static class InvokeData {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
225 public final Invoke invoke;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
226 public final ResolvedJavaType contextType;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
227 public final int invokeOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
228 public final int callTargetOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
229 public final int stateAfterOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
230 public final int nextOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
231
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
232 public final int nextNextOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
233 public final int exceptionOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
234 public final int exceptionStateOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
235 public final int exceptionNextOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
236
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
237 protected InvokeData(Invoke invoke, ResolvedJavaType contextType, int invokeOrderId, int callTargetOrderId, int stateAfterOrderId, int nextOrderId, int nextNextOrderId, int exceptionOrderId,
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
238 int exceptionStateOrderId, int exceptionNextOrderId) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
239 this.invoke = invoke;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
240 this.contextType = contextType;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
241 this.invokeOrderId = invokeOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
242 this.callTargetOrderId = callTargetOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
243 this.stateAfterOrderId = stateAfterOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
244 this.nextOrderId = nextOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
245 this.nextNextOrderId = nextNextOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
246 this.exceptionOrderId = exceptionOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
247 this.exceptionStateOrderId = exceptionStateOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
248 this.exceptionNextOrderId = exceptionNextOrderId;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
249 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
250 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
251
21001
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
252 protected final Architecture architecture;
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
253
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
254 public GraphDecoder(Architecture architecture) {
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
255 this.architecture = architecture;
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
256 }
acc86d08e1cc Support Sparc without the need of a temporary ByteBuffer for every memory access
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20985
diff changeset
257
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
258 public final void decode(StructuredGraph graph, EncodedGraph encodedGraph) {
21075
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
259 try (Debug.Scope scope = Debug.scope("GraphDecoder", graph)) {
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
260 MethodScope methodScope = new MethodScope(graph, encodedGraph, LoopExplosionKind.NONE);
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
261 decode(methodScope, null);
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
262 cleanupGraph(methodScope, null);
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
263 methodScope.graph.verify();
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
264 } catch (Throwable ex) {
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
265 Debug.handle(ex);
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
266 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
267 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
268
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
269 protected final void decode(MethodScope methodScope, FixedWithNextNode startNode) {
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
270 Graph.Mark start = methodScope.graph.getMark();
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
271 LoopScope loopScope = new LoopScope(methodScope);
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
272 FixedNode firstNode;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
273 if (startNode != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
274 firstNode = makeStubNode(methodScope, loopScope, GraphEncoder.FIRST_NODE_ORDER_ID);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
275 startNode.setNext(firstNode);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
276 loopScope.nodesToProcess.set(GraphEncoder.FIRST_NODE_ORDER_ID);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
277 } else {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
278 firstNode = methodScope.graph.start();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
279 registerNode(loopScope, GraphEncoder.START_NODE_ORDER_ID, firstNode, false, false);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
280 loopScope.nodesToProcess.set(GraphEncoder.START_NODE_ORDER_ID);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
281 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
282
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
283 while (loopScope != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
284 while (!loopScope.nodesToProcess.isEmpty()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
285 loopScope = processNextNode(methodScope, loopScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
286 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
287
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
288 if (loopScope.nextIterations != null && !loopScope.nextIterations.isEmpty()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
289 /* Loop explosion: process the loop iteration. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
290 assert loopScope.nextIterations.peekFirst().loopIteration == loopScope.loopIteration + 1;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
291 loopScope = loopScope.nextIterations.removeFirst();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
292 } else {
21075
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
293 propagateCreatedNodes(loopScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
294 loopScope = loopScope.outer;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
295 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
296 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
297
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
298 if (methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE) {
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
299 /*
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
300 * The startNode can get deleted during graph cleanup, so we use its predecessor (if
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
301 * available) as the starting point for loop detection.
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
302 */
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
303 FixedNode detectLoopsStart = startNode.predecessor() != null ? (FixedNode) startNode.predecessor() : startNode;
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
304 cleanupGraph(methodScope, start);
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
305 detectLoops(methodScope.graph, detectLoopsStart);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
306 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
307 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
308
21075
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
309 private static void propagateCreatedNodes(LoopScope loopScope) {
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
310 if (loopScope.outer == null) {
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
311 return;
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
312 }
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
313
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
314 /* Register nodes that were created while decoding the loop to the outside scope. */
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
315 for (int i = 0; i < loopScope.createdNodes.length; i++) {
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
316 if (loopScope.outer.createdNodes[i] == null) {
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
317 loopScope.outer.createdNodes[i] = loopScope.createdNodes[i];
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
318 }
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
319 }
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
320 }
d094ea7e0433 Move PEGraphDecoder from truffle to graal project; factor out SimplifyingGraphDecoder that performs just canonicalization but not method inlining; fix bugs
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21001
diff changeset
321
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
322 protected LoopScope processNextNode(MethodScope methodScope, LoopScope loopScope) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
323 int nodeOrderId = loopScope.nodesToProcess.nextSetBit(0);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
324 loopScope.nodesToProcess.clear(nodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
325
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
326 FixedNode node = (FixedNode) lookupNode(loopScope, nodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
327 if (node.isDeleted()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
328 return loopScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
329 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
330
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
331 if ((node instanceof MergeNode || (node instanceof LoopBeginNode && (methodScope.loopExplosion == LoopExplosionKind.FULL_UNROLL || methodScope.loopExplosion == LoopExplosionKind.FULL_EXPLODE))) &&
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
332 ((AbstractMergeNode) node).forwardEndCount() == 1) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
333 AbstractMergeNode merge = (AbstractMergeNode) node;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
334 EndNode singleEnd = merge.forwardEndAt(0);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
335 FixedNode next = makeStubNode(methodScope, loopScope, nodeOrderId + GraphEncoder.BEGIN_NEXT_ORDER_ID_OFFSET);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
336 singleEnd.replaceAtPredecessor(next);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
337
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
338 merge.safeDelete();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
339 singleEnd.safeDelete();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
340 return loopScope;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
341 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
342
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
343 LoopScope successorAddScope = loopScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
344 boolean updatePredecessors = true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
345 if (node instanceof LoopExitNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
346 successorAddScope = loopScope.outer;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
347 updatePredecessors = methodScope.loopExplosion == LoopExplosionKind.NONE;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
348 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
349
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
350 methodScope.reader.setByteIndex(methodScope.encodedGraph.nodeStartOffsets[nodeOrderId]);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
351 int typeId = methodScope.reader.getUVInt();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
352 assert node.getNodeClass() == methodScope.encodedGraph.getNodeClasses()[typeId];
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
353 readProperties(methodScope, node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
354 makeSuccessorStubs(methodScope, successorAddScope, node, updatePredecessors);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
355 makeInputNodes(methodScope, loopScope, node, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
356
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
357 LoopScope resultScope = loopScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
358 if (node instanceof LoopBeginNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
359 if (methodScope.loopExplosion != LoopExplosionKind.NONE) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
360 handleLoopExplosionBegin(methodScope, loopScope, (LoopBeginNode) node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
361 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
362
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
363 } else if (node instanceof LoopExitNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
364 if (methodScope.loopExplosion != LoopExplosionKind.NONE) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
365 handleLoopExplosionProxyNodes(methodScope, loopScope, (LoopExitNode) node, nodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
366 } else {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
367 handleProxyNodes(methodScope, loopScope, (LoopExitNode) node);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
368 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
369
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
370 } else if (node instanceof AbstractEndNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
371 LoopScope phiInputScope = loopScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
372 LoopScope phiNodeScope = loopScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
373
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
374 if (methodScope.loopExplosion != LoopExplosionKind.NONE && node instanceof LoopEndNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
375 node = handleLoopExplosionEnd(methodScope, loopScope, (LoopEndNode) node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
376 phiNodeScope = loopScope.nextIterations.getLast();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
377 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
378
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
379 int mergeOrderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
380 AbstractMergeNode merge = (AbstractMergeNode) lookupNode(phiNodeScope, mergeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
381 if (merge == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
382 merge = (AbstractMergeNode) makeStubNode(methodScope, phiNodeScope, mergeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
383
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
384 if (merge instanceof LoopBeginNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
385 assert phiNodeScope == phiInputScope && phiNodeScope == loopScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
386 resultScope = new LoopScope(loopScope, loopScope.loopDepth + 1, 0, mergeOrderId, Arrays.copyOf(loopScope.createdNodes, loopScope.createdNodes.length), //
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
387 methodScope.loopExplosion != LoopExplosionKind.NONE ? new ArrayDeque<>() : null, //
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
388 methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE ? new HashMap<>() : null);
21107
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
389 phiInputScope = resultScope;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
390 phiNodeScope = resultScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
391
21107
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
392 registerNode(loopScope, mergeOrderId, null, true, true);
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
393 loopScope.nodesToProcess.clear(mergeOrderId);
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
394 resultScope.nodesToProcess.set(mergeOrderId);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
395 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
396 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
397
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
398 handlePhiFunctions(methodScope, phiInputScope, phiNodeScope, (AbstractEndNode) node, merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
399
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
400 } else if (node instanceof Invoke) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
401 InvokeData invokeData = readInvokeData(methodScope, nodeOrderId, (Invoke) node);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
402 handleInvoke(methodScope, loopScope, invokeData);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
403
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
404 } else if (node instanceof ReturnNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
405 methodScope.returnNodes.add((ReturnNode) node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
406 } else if (node instanceof UnwindNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
407 assert methodScope.unwindNode == null : "graph can have only one UnwindNode";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
408 methodScope.unwindNode = (UnwindNode) node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
409
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
410 } else {
21295
3703ad7bf6b5 Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 21107
diff changeset
411 handleFixedNode(methodScope, loopScope, nodeOrderId, node);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
412 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
413
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
414 return resultScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
415 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
416
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
417 private InvokeData readInvokeData(MethodScope methodScope, int invokeOrderId, Invoke invoke) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
418 ResolvedJavaType contextType = (ResolvedJavaType) readObject(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
419 int callTargetOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
420 int stateAfterOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
421 int nextOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
422
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
423 if (invoke instanceof InvokeWithExceptionNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
424 int nextNextOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
425 int exceptionOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
426 int exceptionStateOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
427 int exceptionNextOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
428 return new InvokeData(invoke, contextType, invokeOrderId, callTargetOrderId, stateAfterOrderId, nextOrderId, nextNextOrderId, exceptionOrderId, exceptionStateOrderId, exceptionNextOrderId);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
429 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
430 return new InvokeData(invoke, contextType, invokeOrderId, callTargetOrderId, stateAfterOrderId, nextOrderId, -1, -1, -1, -1);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
431 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
432 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
433
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
434 /**
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
435 * {@link Invoke} nodes do not have the {@link CallTargetNode}, {@link FrameState}, and
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
436 * successors encoded. Instead, this information is provided separately to allow method inlining
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
437 * without decoding and adding them to the graph upfront. For non-inlined methods, this method
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
438 * restores the normal state. Subclasses can override it to perform method inlining.
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
439 */
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
440 protected void handleInvoke(MethodScope methodScope, LoopScope loopScope, InvokeData invokeData) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
441 assert invokeData.invoke.callTarget() == null : "callTarget edge is ignored during decoding of Invoke";
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
442 CallTargetNode callTarget = (CallTargetNode) ensureNodeCreated(methodScope, loopScope, invokeData.callTargetOrderId);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
443 if (invokeData.invoke instanceof InvokeWithExceptionNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
444 ((InvokeWithExceptionNode) invokeData.invoke).setCallTarget(callTarget);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
445 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
446 ((InvokeNode) invokeData.invoke).setCallTarget(callTarget);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
447 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
448
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
449 assert invokeData.invoke.stateAfter() == null && invokeData.invoke.stateDuring() == null : "FrameState edges are ignored during decoding of Invoke";
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
450 invokeData.invoke.setStateAfter((FrameState) ensureNodeCreated(methodScope, loopScope, invokeData.stateAfterOrderId));
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
451
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
452 invokeData.invoke.setNext(makeStubNode(methodScope, loopScope, invokeData.nextOrderId));
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
453 if (invokeData.invoke instanceof InvokeWithExceptionNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
454 ((InvokeWithExceptionNode) invokeData.invoke).setExceptionEdge((AbstractBeginNode) makeStubNode(methodScope, loopScope, invokeData.exceptionOrderId));
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
455 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
456 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
457
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
458 protected void handleLoopExplosionBegin(MethodScope methodScope, LoopScope loopScope, LoopBeginNode loopBegin) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
459 checkLoopExplosionIteration(methodScope, loopScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
460
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
461 List<EndNode> predecessors = loopBegin.forwardEnds().snapshot();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
462 FixedNode successor = loopBegin.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
463 FrameState frameState = loopBegin.stateAfter();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
464
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
465 if (methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
466 LoopExplosionState queryState = new LoopExplosionState(frameState, null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
467 LoopExplosionState existingState = loopScope.iterationStates.get(queryState);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
468 if (existingState != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
469 loopBegin.replaceAtUsages(existingState.merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
470 loopBegin.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
471 successor.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
472 for (EndNode predecessor : predecessors) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
473 existingState.merge.addForwardEnd(predecessor);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
474 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
475 return;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
476 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
477 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
478
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
479 MergeNode merge = methodScope.graph.add(new MergeNode());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
480 loopBegin.replaceAtUsages(merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
481 loopBegin.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
482 merge.setStateAfter(frameState);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
483 merge.setNext(successor);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
484 for (EndNode predecessor : predecessors) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
485 merge.addForwardEnd(predecessor);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
486 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
487
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
488 if (methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
489 LoopExplosionState explosionState = new LoopExplosionState(frameState, merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
490 loopScope.iterationStates.put(explosionState, explosionState);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
491 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
492 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
493
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
494 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
495 * Hook for subclasses.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
496 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
497 * @param methodScope The current method.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
498 * @param loopScope The current loop.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
499 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
500 protected void checkLoopExplosionIteration(MethodScope methodScope, LoopScope loopScope) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
501 throw shouldNotReachHere("when subclass uses loop explosion, it needs to implement this method");
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
502 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
503
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
504 protected FixedNode handleLoopExplosionEnd(MethodScope methodScope, LoopScope loopScope, LoopEndNode loopEnd) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
505 EndNode replacementNode = methodScope.graph.add(new EndNode());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
506 loopEnd.replaceAtPredecessor(replacementNode);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
507 loopEnd.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
508
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
509 assert methodScope.loopExplosion != LoopExplosionKind.NONE;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
510 if (methodScope.loopExplosion != LoopExplosionKind.FULL_UNROLL || loopScope.nextIterations.isEmpty()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
511 int nextIterationNumber = loopScope.nextIterations.isEmpty() ? loopScope.loopIteration + 1 : loopScope.nextIterations.getLast().loopIteration + 1;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
512 LoopScope nextIterationScope = new LoopScope(loopScope.outer, loopScope.loopDepth, nextIterationNumber, loopScope.loopBeginOrderId, loopScope.initialCreatedNodes,
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
513 loopScope.nextIterations, loopScope.iterationStates);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
514 loopScope.nextIterations.addLast(nextIterationScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
515 registerNode(nextIterationScope, loopScope.loopBeginOrderId, null, true, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
516 makeStubNode(methodScope, nextIterationScope, loopScope.loopBeginOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
517 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
518 return replacementNode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
519 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
520
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
521 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
522 * Hook for subclasses.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
523 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
524 * @param methodScope The current method.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
525 * @param loopScope The current loop.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
526 * @param nodeOrderId The orderId of the node.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
527 * @param node The node to be simplified.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
528 */
21295
3703ad7bf6b5 Fix SimpleInfopointNode processing for PEGraphDecoder
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 21107
diff changeset
529 protected void handleFixedNode(MethodScope methodScope, LoopScope loopScope, int nodeOrderId, FixedNode node) {
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
530 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
531
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
532 protected void handleProxyNodes(MethodScope methodScope, LoopScope loopScope, LoopExitNode loopExit) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
533 assert loopExit.stateAfter() == null;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
534 int stateAfterOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
535 loopExit.setStateAfter((FrameState) ensureNodeCreated(methodScope, loopScope, stateAfterOrderId));
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
536
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
537 int numProxies = methodScope.reader.getUVInt();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
538 for (int i = 0; i < numProxies; i++) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
539 int proxyOrderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
540 ProxyNode proxy = (ProxyNode) ensureNodeCreated(methodScope, loopScope, proxyOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
541 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
542 * The ProxyNode transports a value from the loop to the outer scope. We therefore
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
543 * register it in the outer scope.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
544 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
545 registerNode(loopScope.outer, proxyOrderId, proxy, false, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
546 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
547 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
548
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
549 protected void handleLoopExplosionProxyNodes(MethodScope methodScope, LoopScope loopScope, LoopExitNode loopExit, int loopExitOrderId) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
550 assert loopExit.stateAfter() == null;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
551 int stateAfterOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
552
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
553 BeginNode begin = methodScope.graph.add(new BeginNode());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
554
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
555 FixedNode loopExitSuccessor = loopExit.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
556 loopExit.replaceAtPredecessor(begin);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
557
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
558 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
559 * In the original graph, the loop exit is not a merge node. Multiple exploded loop
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
560 * iterations now take the same loop exit, so we have to introduce a new merge node to
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
561 * handle the merge.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
562 */
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
563 MergeNode merge = null;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
564 Node existingExit = lookupNode(loopScope.outer, loopExitOrderId);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
565 if (existingExit == null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
566 /* First loop iteration that exits. No merge necessary yet. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
567 registerNode(loopScope.outer, loopExitOrderId, begin, false, false);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
568 begin.setNext(loopExitSuccessor);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
569
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
570 } else if (existingExit instanceof BeginNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
571 /* Second loop iteration that exits. Create the merge. */
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
572 merge = methodScope.graph.add(new MergeNode());
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
573 registerNode(loopScope.outer, loopExitOrderId, merge, true, false);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
574 /* Add the first iteration. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
575 EndNode firstEnd = methodScope.graph.add(new EndNode());
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
576 ((BeginNode) existingExit).setNext(firstEnd);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
577 merge.addForwardEnd(firstEnd);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
578 merge.setNext(loopExitSuccessor);
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
579
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
580 } else {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
581 /* Subsequent loop iteration. Merge already created. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
582 merge = (MergeNode) existingExit;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
583 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
584
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
585 if (merge != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
586 EndNode end = methodScope.graph.add(new EndNode());
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
587 begin.setNext(end);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
588 merge.addForwardEnd(end);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
589 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
590
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
591 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
592 * Possibly create phi nodes for the original proxy nodes that flow out of the loop. Note
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
593 * that we definitely do not need a proxy node itself anymore, since the loop was exploded
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
594 * and is no longer present.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
595 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
596 int numProxies = methodScope.reader.getUVInt();
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
597 boolean phiCreated = false;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
598 for (int i = 0; i < numProxies; i++) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
599 int proxyOrderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
600 ProxyNode proxy = (ProxyNode) ensureNodeCreated(methodScope, loopScope, proxyOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
601 ValueNode phiInput = proxy.value();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
602 ValueNode replacement;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
603
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
604 ValueNode existing = (ValueNode) loopScope.outer.createdNodes[proxyOrderId];
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
605 if (existing == null || existing == phiInput) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
606 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
607 * We are at the first loop exit, or the proxy carries the same value for all exits.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
608 * We do not need a phi node yet.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
609 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
610 registerNode(loopScope.outer, proxyOrderId, phiInput, true, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
611 replacement = phiInput;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
612
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
613 } else if (!merge.isPhiAtMerge(existing)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
614 /* Now we have two different values, so we need to create a phi node. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
615 PhiNode phi = methodScope.graph.addWithoutUnique(new ValuePhiNode(proxy.stamp(), merge));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
616 /* Add the inputs from all previous exits. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
617 for (int j = 0; j < merge.phiPredecessorCount() - 1; j++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
618 phi.addInput(existing);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
619 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
620 /* Add the input from this exit. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
621 phi.addInput(phiInput);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
622 registerNode(loopScope.outer, proxyOrderId, phi, true, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
623 replacement = phi;
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
624 phiCreated = true;
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
625
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
626 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
627 /* Phi node has been created before, so just add the new input. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
628 PhiNode phi = (PhiNode) existing;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
629 phi.addInput(phiInput);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
630 replacement = phi;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
631 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
632
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
633 methodScope.graph.replaceFloating(proxy, replacement);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
634 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
635
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
636 if (merge != null && (merge.stateAfter() == null || phiCreated)) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
637 FrameState oldStateAfter = merge.stateAfter();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
638 registerNode(loopScope.outer, stateAfterOrderId, null, true, true);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
639 merge.setStateAfter((FrameState) ensureNodeCreated(methodScope, loopScope.outer, stateAfterOrderId));
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
640 if (oldStateAfter != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
641 oldStateAfter.safeDelete();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
642 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
643 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
644
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
645 loopExit.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
646 assert loopExitSuccessor.predecessor() == null;
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
647 if (merge != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
648 merge.getNodeClass().getSuccessorEdges().update(merge, null, loopExitSuccessor);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
649 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
650 begin.getNodeClass().getSuccessorEdges().update(begin, null, loopExitSuccessor);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
651 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
652 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
653
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
654 protected void handlePhiFunctions(MethodScope methodScope, LoopScope phiInputScope, LoopScope phiNodeScope, AbstractEndNode end, AbstractMergeNode merge) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
655
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
656 if (end instanceof LoopEndNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
657 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
658 * Fix the loop end index and the number of loop ends. When we do canonicalization
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
659 * during decoding, we can end up with fewer ends than the encoded graph had. And the
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
660 * order of loop ends can be different.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
661 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
662 int numEnds = ((LoopBeginNode) merge).loopEnds().count();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
663 ((LoopBeginNode) merge).nextEndIndex = numEnds;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
664 ((LoopEndNode) end).endIndex = numEnds - 1;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
665
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
666 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
667 if (merge.ends == null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
668 merge.ends = new NodeInputList<>(merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
669 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
670 merge.addForwardEnd((EndNode) end);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
671 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
672
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
673 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
674 * We create most phi functions lazily. Canonicalization and simplification during decoding
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
675 * can lead to dead branches that are not decoded, so we might not need all phi functions
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
676 * that the original graph contained. Since we process all predecessors before actually
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
677 * processing the merge node, we have the final phi function when processing the merge node.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
678 * The only exception are loop headers of non-exploded loops: since backward branches are
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
679 * not processed yet when processing the loop body, we need to create all phi functions
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
680 * upfront.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
681 */
21107
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
682 boolean lazyPhi = allowLazyPhis() && (!(merge instanceof LoopBeginNode) || methodScope.loopExplosion != LoopExplosionKind.NONE);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
683 int numPhis = methodScope.reader.getUVInt();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
684 for (int i = 0; i < numPhis; i++) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
685 int phiInputOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
686 int phiNodeOrderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
687
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
688 ValueNode phiInput = (ValueNode) ensureNodeCreated(methodScope, phiInputScope, phiInputOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
689
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
690 ValueNode existing = (ValueNode) lookupNode(phiNodeScope, phiNodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
691 if (lazyPhi && (existing == null || existing == phiInput)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
692 /* Phi function not yet necessary. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
693 registerNode(phiNodeScope, phiNodeOrderId, phiInput, true, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
694
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
695 } else if (!merge.isPhiAtMerge(existing)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
696 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
697 * Phi function is necessary. Create it and fill it with existing inputs as well as
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
698 * the new input.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
699 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
700 registerNode(phiNodeScope, phiNodeOrderId, null, true, true);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
701 PhiNode phi = (PhiNode) ensureNodeCreated(methodScope, phiNodeScope, phiNodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
702
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
703 phi.setMerge(merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
704 for (int j = 0; j < merge.phiPredecessorCount() - 1; j++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
705 phi.addInput(existing);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
706 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
707 phi.addInput(phiInput);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
708
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
709 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
710 /* Phi node has been created before, so just add the new input. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
711 PhiNode phi = (PhiNode) existing;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
712 phi.addInput(phiInput);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
713 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
714 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
715 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
716
21107
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
717 protected boolean allowLazyPhis() {
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
718 /* We need to exactly reproduce the encoded graph, including unnecessary phi functions. */
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
719 return false;
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
720 }
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
721
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
722 protected Node instantiateNode(MethodScope methodScope, int nodeOrderId) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
723 methodScope.reader.setByteIndex(methodScope.encodedGraph.nodeStartOffsets[nodeOrderId]);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
724 NodeClass<?> nodeClass = methodScope.encodedGraph.getNodeClasses()[methodScope.reader.getUVInt()];
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
725 return nodeClass.allocateInstance();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
726 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
727
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
728 protected void readProperties(MethodScope methodScope, Node node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
729 Fields fields = node.getNodeClass().getData();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
730 for (int pos = 0; pos < fields.getCount(); pos++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
731 if (fields.getType(pos).isPrimitive()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
732 long primitive = methodScope.reader.getSV();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
733 fields.setRawPrimitive(node, pos, primitive);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
734 } else {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
735 Object value = readObject(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
736 fields.set(node, pos, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
737 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
738 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
739 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
740
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
741 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
742 * Process the input edges of a node. Input nodes that have not yet been created must be
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
743 * non-fixed nodes (because fixed nodes are processed in reverse postorder. Such non-fixed nodes
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
744 * are created on demand (recursively since they can themselves reference not yet created
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
745 * nodes).
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
746 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
747 protected void makeInputNodes(MethodScope methodScope, LoopScope loopScope, Node node, boolean updateUsages) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
748 Edges edges = node.getNodeClass().getEdges(Edges.Type.Inputs);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
749 for (int index = 0; index < edges.getDirectCount(); index++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
750 if (skipEdge(node, edges, index, true, true)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
751 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
752 }
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
753 int orderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
754 Node value = ensureNodeCreated(methodScope, loopScope, orderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
755 Edges.initializeNode(node, edges.getOffsets(), index, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
756 if (updateUsages && value != null && !value.isDeleted()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
757 edges.update(node, null, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
758
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
759 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
760 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
761 for (int index = edges.getDirectCount(); index < edges.getCount(); index++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
762 if (skipEdge(node, edges, index, false, true)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
763 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
764 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
765 int size = methodScope.reader.getSVInt();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
766 if (size != -1) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
767 NodeList<Node> nodeList = new NodeInputList<>(node, size);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
768 Edges.initializeList(node, edges.getOffsets(), index, nodeList);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
769 for (int idx = 0; idx < size; idx++) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
770 int orderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
771 Node value = ensureNodeCreated(methodScope, loopScope, orderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
772 nodeList.initialize(idx, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
773 if (updateUsages && value != null && !value.isDeleted()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
774 edges.update(node, null, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
775 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
776 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
777 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
778 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
779 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
780
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
781 protected Node ensureNodeCreated(MethodScope methodScope, LoopScope loopScope, int nodeOrderId) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
782 if (nodeOrderId == GraphEncoder.NULL_ORDER_ID) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
783 return null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
784 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
785 Node node = lookupNode(loopScope, nodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
786 if (node != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
787 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
788 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
789
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
790 node = decodeFloatingNode(methodScope, loopScope, nodeOrderId);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
791
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
792 if (node instanceof ProxyNode || node instanceof PhiNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
793 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
794 * We need these nodes as they were in the original graph, without any canonicalization
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
795 * or value numbering.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
796 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
797 node = methodScope.graph.addWithoutUnique(node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
798
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
799 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
800 /* Allow subclasses to canonicalize and intercept nodes. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
801 node = handleFloatingNodeBeforeAdd(methodScope, loopScope, node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
802 if (!node.isAlive()) {
21107
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
803 node = addFloatingNode(methodScope, node);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
804 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
805 node = handleFloatingNodeAfterAdd(methodScope, loopScope, node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
806 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
807 registerNode(loopScope, nodeOrderId, node, false, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
808 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
809 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
810
21107
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
811 protected Node addFloatingNode(MethodScope methodScope, Node node) {
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
812 /*
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
813 * We want to exactly reproduce the encoded graph. Even though nodes should be unique in the
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
814 * encoded graph, this is not always guaranteed.
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
815 */
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
816 return methodScope.graph.addWithoutUnique(node);
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
817 }
fe0531d98fbe GraphDecoder must exactly reproduce the encoded graph, only SimplifyingGraphDecoder can remove unnecessary nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21083
diff changeset
818
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
819 /**
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
820 * Decodes a non-fixed node, but does not do any post-processing and does not register it.
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
821 */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
822 protected Node decodeFloatingNode(MethodScope methodScope, LoopScope loopScope, int nodeOrderId) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
823 long readerByteIndex = methodScope.reader.getByteIndex();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
824 Node node = instantiateNode(methodScope, nodeOrderId);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
825 assert !(node instanceof FixedNode);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
826
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
827 /* Read the properties of the node. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
828 readProperties(methodScope, node);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
829 /* There must not be any successors to read, since it is a non-fixed node. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
830 assert node.getNodeClass().getEdges(Edges.Type.Successors).getCount() == 0;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
831 /* Read the inputs of the node, possibly creating them recursively. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
832 makeInputNodes(methodScope, loopScope, node, false);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
833 methodScope.reader.setByteIndex(readerByteIndex);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
834 return node;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
835 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
836
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
837 /**
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
838 * Hook for subclasses to process a non-fixed node before it is added to the graph.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
839 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
840 * @param methodScope The current method.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
841 * @param loopScope The current loop.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
842 * @param node The node to be canonicalized.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
843 * @return The replacement for the node, or the node itself.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
844 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
845 protected Node handleFloatingNodeBeforeAdd(MethodScope methodScope, LoopScope loopScope, Node node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
846 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
847 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
848
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
849 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
850 * Hook for subclasses to process a non-fixed node after it is added to the graph.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
851 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
852 * @param methodScope The current method.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
853 * @param loopScope The current loop.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
854 * @param node The node to be canonicalized.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
855 * @return The replacement for the node, or the node itself.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
856 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
857 protected Node handleFloatingNodeAfterAdd(MethodScope methodScope, LoopScope loopScope, Node node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
858 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
859 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
860
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
861 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
862 * Process successor edges of a node. We create the successor nodes so that we can fill the
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
863 * successor list, but no properties or edges are loaded yet. That is done when the successor is
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
864 * on top of the worklist in {@link #processNextNode}.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
865 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
866 protected void makeSuccessorStubs(MethodScope methodScope, LoopScope loopScope, Node node, boolean updatePredecessors) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
867 Edges edges = node.getNodeClass().getEdges(Edges.Type.Successors);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
868 for (int index = 0; index < edges.getDirectCount(); index++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
869 if (skipEdge(node, edges, index, true, true)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
870 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
871 }
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
872 int orderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
873 Node value = makeStubNode(methodScope, loopScope, orderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
874 Edges.initializeNode(node, edges.getOffsets(), index, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
875 if (updatePredecessors && value != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
876 edges.update(node, null, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
877 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
878 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
879 for (int index = edges.getDirectCount(); index < edges.getCount(); index++) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
880 if (skipEdge(node, edges, index, false, true)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
881 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
882 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
883 int size = methodScope.reader.getSVInt();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
884 if (size != -1) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
885 NodeList<Node> nodeList = new NodeSuccessorList<>(node, size);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
886 Edges.initializeList(node, edges.getOffsets(), index, nodeList);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
887 for (int idx = 0; idx < size; idx++) {
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
888 int orderId = readOrderId(methodScope);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
889 Node value = makeStubNode(methodScope, loopScope, orderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
890 nodeList.initialize(idx, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
891 if (updatePredecessors && value != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
892 edges.update(node, null, value);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
893 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
894 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
895 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
896 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
897 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
898
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
899 protected FixedNode makeStubNode(MethodScope methodScope, LoopScope loopScope, int nodeOrderId) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
900 if (nodeOrderId == GraphEncoder.NULL_ORDER_ID) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
901 return null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
902 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
903 FixedNode node = (FixedNode) lookupNode(loopScope, nodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
904 if (node != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
905 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
906 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
907
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
908 long readerByteIndex = methodScope.reader.getByteIndex();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
909 node = (FixedNode) methodScope.graph.add(instantiateNode(methodScope, nodeOrderId));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
910 /* Properties and edges are not filled yet, the node remains uninitialized. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
911 methodScope.reader.setByteIndex(readerByteIndex);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
912
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
913 registerNode(loopScope, nodeOrderId, node, false, false);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
914 loopScope.nodesToProcess.set(nodeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
915 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
916 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
917
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
918 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
919 * Returns false for {@link Edges} that are not necessary in the encoded graph because they are
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
920 * reconstructed using other sources of information.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
921 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
922 protected static boolean skipEdge(Node node, Edges edges, int index, boolean direct, boolean decode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
923 if (node instanceof PhiNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
924 /* The inputs of phi functions are filled manually when the end nodes are processed. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
925 assert edges.type() == Edges.Type.Inputs;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
926 if (direct) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
927 assert index == edges.getDirectCount() - 1 : "PhiNode has one direct input (the MergeNode)";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
928 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
929 assert index == edges.getCount() - 1 : "PhiNode has one variable size input (the values)";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
930 if (decode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
931 /* The values must not be null, so initialize with an empty list. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
932 Edges.initializeList(node, edges.getOffsets(), index, new NodeInputList<>(node));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
933 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
934 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
935 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
936
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
937 } else if (node instanceof AbstractMergeNode && edges.type() == Edges.Type.Inputs && !direct) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
938 /* The ends of merge nodes are filled manually when the ends are processed. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
939 assert index == edges.getCount() - 1 : "MergeNode has one variable size input (the ends)";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
940 assert Edges.getNodeList(node, edges.getOffsets(), index) != null : "Input list must have been already created";
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
941 return true;
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
942
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
943 } else if (node instanceof LoopExitNode && edges.type() == Edges.Type.Inputs && edges.getType(index) == FrameState.class) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
944 /* The stateAfter of the loop exit is filled manually. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
945 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
946
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
947 } else if (node instanceof Invoke) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
948 assert node instanceof InvokeNode || node instanceof InvokeWithExceptionNode : "The only two Invoke node classes";
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
949 assert direct : "Invoke and InvokeWithException only have direct successor and input edges";
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
950 if (edges.type() == Edges.Type.Successors) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
951 assert edges.getCount() == (node instanceof InvokeWithExceptionNode ? 2 : 1) : "InvokeNode has one successor (next); InvokeWithExceptionNode has two successors (next, exceptionEdge)";
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
952 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
953 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
954 assert edges.type() == Edges.Type.Inputs;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
955 if (edges.getType(index) == CallTargetNode.class) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
956 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
957 } else if (edges.getType(index) == FrameState.class) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
958 assert edges.get(node, index) == null || edges.get(node, index) == ((Invoke) node).stateAfter() : "Only stateAfter can be a FrameState during encoding";
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
959 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
960 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
961 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
962 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
963 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
964 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
965
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
966 protected Node lookupNode(LoopScope loopScope, int nodeOrderId) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
967 return loopScope.createdNodes[nodeOrderId];
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
968 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
969
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
970 protected void registerNode(LoopScope loopScope, int nodeOrderId, Node node, boolean allowOverwrite, boolean allowNull) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
971 assert node == null || node.isAlive();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
972 assert allowNull || node != null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
973 assert allowOverwrite || lookupNode(loopScope, nodeOrderId) == null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
974 loopScope.createdNodes[nodeOrderId] = node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
975 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
976
20899
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
977 protected int readOrderId(MethodScope methodScope) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
978 return methodScope.reader.getUVInt();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
979 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
980
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
981 protected Object readObject(MethodScope methodScope) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
982 return methodScope.encodedGraph.getObjects()[methodScope.reader.getUVInt()];
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
983 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
984
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
985 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
986 * The following methods are a literal copy from GraphBuilderPhase.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
987 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
988
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
989 protected void detectLoops(StructuredGraph currentGraph, FixedNode startInstruction) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
990 NodeBitMap visited = currentGraph.createNodeBitMap();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
991 NodeBitMap active = currentGraph.createNodeBitMap();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
992 Deque<Node> stack = new ArrayDeque<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
993 stack.add(startInstruction);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
994 visited.mark(startInstruction);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
995 while (!stack.isEmpty()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
996 Node next = stack.peek();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
997 assert next.isDeleted() || visited.isMarked(next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
998 if (next.isDeleted() || active.isMarked(next)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
999 stack.pop();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1000 if (!next.isDeleted()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1001 active.clear(next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1002 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1003 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1004 active.mark(next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1005 for (Node n : next.cfgSuccessors()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1006 if (active.contains(n)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1007 // Detected cycle.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1008 assert n instanceof MergeNode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1009 assert next instanceof EndNode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1010 MergeNode merge = (MergeNode) n;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1011 EndNode endNode = (EndNode) next;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1012 merge.removeEnd(endNode);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1013 FixedNode afterMerge = merge.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1014 if (!(afterMerge instanceof EndNode) || !(((EndNode) afterMerge).merge() instanceof LoopBeginNode)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1015 FrameState stateAfter = merge.stateAfter();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1016 merge.setNext(null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1017 merge.setStateAfter(null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1018 LoopBeginNode newLoopBegin = appendLoopBegin(currentGraph, merge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1019 newLoopBegin.setNext(afterMerge);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1020 newLoopBegin.setStateAfter(stateAfter);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1021 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1022 LoopBeginNode loopBegin = (LoopBeginNode) ((EndNode) merge.next()).merge();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1023 LoopEndNode loopEnd = currentGraph.add(new LoopEndNode(loopBegin));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1024 endNode.replaceAndDelete(loopEnd);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1025 } else if (visited.contains(n)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1026 // Normal merge into a branch we are already exploring.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1027 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1028 visited.mark(n);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1029 stack.push(n);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1030 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1031 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1032 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1033 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1034
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1035 insertLoopEnds(currentGraph, startInstruction);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1036 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1037
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1038 private static LoopBeginNode appendLoopBegin(StructuredGraph currentGraph, FixedWithNextNode fixedWithNext) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1039 EndNode preLoopEnd = currentGraph.add(new EndNode());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1040 LoopBeginNode loopBegin = currentGraph.add(new LoopBeginNode());
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1041 fixedWithNext.setNext(preLoopEnd);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1042 // Add the single non-loop predecessor of the loop header.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1043 loopBegin.addForwardEnd(preLoopEnd);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1044 return loopBegin;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1045 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1046
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1047 private static void insertLoopEnds(StructuredGraph currentGraph, FixedNode startInstruction) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1048 NodeBitMap visited = currentGraph.createNodeBitMap();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1049 Deque<Node> stack = new ArrayDeque<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1050 stack.add(startInstruction);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1051 visited.mark(startInstruction);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1052 List<LoopBeginNode> loopBegins = new ArrayList<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1053 while (!stack.isEmpty()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1054 Node next = stack.pop();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1055 assert visited.isMarked(next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1056 if (next instanceof LoopBeginNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1057 loopBegins.add((LoopBeginNode) next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1058 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1059 for (Node n : next.cfgSuccessors()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1060 if (visited.contains(n)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1061 // Nothing to do.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1062 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1063 visited.mark(n);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1064 stack.push(n);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1065 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1066 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1067 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1068
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1069 IdentityHashMap<LoopBeginNode, List<LoopBeginNode>> innerLoopsMap = new IdentityHashMap<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1070 for (int i = loopBegins.size() - 1; i >= 0; --i) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1071 LoopBeginNode loopBegin = loopBegins.get(i);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1072 insertLoopExits(currentGraph, loopBegin, innerLoopsMap);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1073 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1074
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1075 // Remove degenerated merges with only one predecessor.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1076 for (LoopBeginNode loopBegin : loopBegins) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1077 Node pred = loopBegin.forwardEnd().predecessor();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1078 if (pred instanceof MergeNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1079 MergeNode.removeMergeIfDegenerated((MergeNode) pred);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1080 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1081 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1082 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1083
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1084 private static void insertLoopExits(StructuredGraph currentGraph, LoopBeginNode loopBegin, IdentityHashMap<LoopBeginNode, List<LoopBeginNode>> innerLoopsMap) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1085 NodeBitMap visited = currentGraph.createNodeBitMap();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1086 Deque<Node> stack = new ArrayDeque<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1087 for (LoopEndNode loopEnd : loopBegin.loopEnds()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1088 stack.push(loopEnd);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1089 visited.mark(loopEnd);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1090 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1091
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1092 List<ControlSplitNode> controlSplits = new ArrayList<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1093 List<LoopBeginNode> innerLoopBegins = new ArrayList<>();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1094
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1095 while (!stack.isEmpty()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1096 Node current = stack.pop();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1097 if (current == loopBegin) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1098 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1099 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1100 for (Node pred : current.cfgPredecessors()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1101 if (!visited.isMarked(pred)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1102 visited.mark(pred);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1103 if (pred instanceof LoopExitNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1104 // Inner loop
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1105 LoopExitNode loopExitNode = (LoopExitNode) pred;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1106 LoopBeginNode innerLoopBegin = loopExitNode.loopBegin();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1107 if (!visited.isMarked(innerLoopBegin)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1108 stack.push(innerLoopBegin);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1109 visited.mark(innerLoopBegin);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1110 innerLoopBegins.add(innerLoopBegin);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1111 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1112 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1113 if (pred instanceof ControlSplitNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1114 ControlSplitNode controlSplitNode = (ControlSplitNode) pred;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1115 controlSplits.add(controlSplitNode);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1116 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1117 stack.push(pred);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1118 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1119 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1120 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1121 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1122
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1123 for (ControlSplitNode controlSplit : controlSplits) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1124 for (Node succ : controlSplit.cfgSuccessors()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1125 if (!visited.isMarked(succ)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1126 LoopExitNode loopExit = currentGraph.add(new LoopExitNode(loopBegin));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1127 FixedNode next = ((FixedWithNextNode) succ).next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1128 next.replaceAtPredecessor(loopExit);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1129 loopExit.setNext(next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1130 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1131 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1132 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1133
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1134 for (LoopBeginNode inner : innerLoopBegins) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1135 addLoopExits(currentGraph, loopBegin, inner, innerLoopsMap, visited);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1136 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1137
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1138 innerLoopsMap.put(loopBegin, innerLoopBegins);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1139 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1140
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1141 private static void addLoopExits(StructuredGraph currentGraph, LoopBeginNode loopBegin, LoopBeginNode inner, IdentityHashMap<LoopBeginNode, List<LoopBeginNode>> innerLoopsMap, NodeBitMap visited) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1142 for (LoopExitNode exit : inner.loopExits()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1143 if (!visited.isMarked(exit)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1144 LoopExitNode newLoopExit = currentGraph.add(new LoopExitNode(loopBegin));
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1145 FixedNode next = exit.next();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1146 next.replaceAtPredecessor(newLoopExit);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1147 newLoopExit.setNext(next);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1148 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1149 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1150
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1151 for (LoopBeginNode innerInner : innerLoopsMap.get(inner)) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1152 addLoopExits(currentGraph, loopBegin, innerInner, innerLoopsMap, visited);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1153 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1154 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1155
21379
0042b1960e71 Bugfix: non-simplifying GraphDecoder must not cleanup graph
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21295
diff changeset
1156 /**
0042b1960e71 Bugfix: non-simplifying GraphDecoder must not cleanup graph
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21295
diff changeset
1157 * Removes unnecessary nodes from the graph after decoding.
0042b1960e71 Bugfix: non-simplifying GraphDecoder must not cleanup graph
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21295
diff changeset
1158 *
0042b1960e71 Bugfix: non-simplifying GraphDecoder must not cleanup graph
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21295
diff changeset
1159 * @param methodScope The current method.
0042b1960e71 Bugfix: non-simplifying GraphDecoder must not cleanup graph
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21295
diff changeset
1160 * @param start Marker for the begin of the current method in the graph.
0042b1960e71 Bugfix: non-simplifying GraphDecoder must not cleanup graph
Christian Wimmer <christian.wimmer@oracle.com>
parents: 21295
diff changeset
1161 */
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20899
diff changeset
1162 protected void cleanupGraph(MethodScope methodScope, Graph.Mark start) {
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1163 assert verifyEdges(methodScope);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1164 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1165
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1166 protected boolean verifyEdges(MethodScope methodScope) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1167 for (Node node : methodScope.graph.getNodes()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1168 assert node.isAlive();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1169 node.acceptInputs((n, i) -> {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1170 assert i.isAlive();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1171 assert i.usages().contains(n);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1172 });
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1173 node.acceptSuccessors((n, s) -> {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1174 assert s.isAlive();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1175 assert s.predecessor() == n;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1176 });
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1177
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1178 for (Node usage : node.usages()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1179 assert usage.isAlive();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1180 assert usage.inputs().contains(node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1181 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1182 if (node.predecessor() != null) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1183 assert node.predecessor().isAlive();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1184 assert node.predecessor().successors().contains(node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1185 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1186 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1187 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1188 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1189 }