annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GraphDecoder.java @ 20985:eebb05f2d1e8

Fixes for GraphPE
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 15 Apr 2015 21:01:33 -0700
parents c7f1ab98d950
children acc86d08e1cc
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
25 import static com.oracle.graal.compiler.common.GraalInternalError.*;
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
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
29 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
30 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
31 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
32 import com.oracle.graal.debug.*;
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.*;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.nodes.util.*;
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. */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
71 protected static class MethodScope {
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
20896
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
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
92 if (encodedGraph != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
93 reader = new UnsafeArrayTypeReader(encodedGraph.getEncoding(), encodedGraph.getStartOffset());
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
20896
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
20896
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
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
252 public final void decode(StructuredGraph graph, EncodedGraph encodedGraph) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
253 MethodScope methodScope = new MethodScope(graph, encodedGraph, LoopExplosionKind.NONE);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
254 decode(methodScope, null);
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
255 cleanupGraph(methodScope, null);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
256 methodScope.graph.verify();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
257 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
258
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
259 protected final void decode(MethodScope methodScope, FixedWithNextNode startNode) {
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
260 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
261 LoopScope loopScope = new LoopScope(methodScope);
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
262 FixedNode firstNode;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
263 if (startNode != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
264 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
265 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
266 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
267 } else {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
268 firstNode = methodScope.graph.start();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
269 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
270 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
271 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
272
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
273 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
274 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
275 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
276 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
277
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
278 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
279 /* 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
280 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
281 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
282 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
283 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
284 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
285 }
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 if (methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE) {
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
288 /*
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
289 * 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: 20896
diff changeset
290 * available) as the starting point for loop detection.
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
291 */
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
292 FixedNode detectLoopsStart = startNode.predecessor() != null ? (FixedNode) startNode.predecessor() : startNode;
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
293 cleanupGraph(methodScope, start);
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
294 Debug.dump(methodScope.graph, "Before loop detection");
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
295 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
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
299 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
300 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
301 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
302
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
303 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
304 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
305 return loopScope;
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
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
308 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
309 ((AbstractMergeNode) node).forwardEndCount() == 1) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
310 AbstractMergeNode merge = (AbstractMergeNode) node;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
311 EndNode singleEnd = merge.forwardEndAt(0);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
312 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
313 singleEnd.replaceAtPredecessor(next);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
314
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
315 merge.safeDelete();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
316 singleEnd.safeDelete();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
317 return loopScope;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
318 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
319
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
320 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
321 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
322 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
323 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
324 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
325 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
326
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
327 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
328 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
329 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
330 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
331 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
332 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
333
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
334 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
335 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
336 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
337 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
338 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
339
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
340 } 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
341 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
342 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
343 } else {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
344 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
345 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
346
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
347 } 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
348 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
349 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
350
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
351 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
352 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
353 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
354 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
355
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
356 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
357 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
358 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
359 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
360
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
361 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
362 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
363 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
364 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
365 methodScope.loopExplosion == LoopExplosionKind.MERGE_EXPLODE ? new HashMap<>() : null);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
366 phiNodeScope = resultScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
367
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
368 registerNode(phiInputScope, mergeOrderId, 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
369 phiInputScope.nodesToProcess.clear(mergeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
370 phiNodeScope.nodesToProcess.set(mergeOrderId);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
371 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
372 }
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 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
375
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
376 } else if (node instanceof Invoke) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
377 InvokeData invokeData = readInvokeData(methodScope, nodeOrderId, (Invoke) node);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
378 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
379
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
380 } 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
381 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
382 } 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
383 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
384 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
385
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
386 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
387 simplifyFixedNode(methodScope, loopScope, nodeOrderId, node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
388 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
389
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
390 return resultScope;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
391 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
392
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
393 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
394 ResolvedJavaType contextType = (ResolvedJavaType) readObject(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
395 int callTargetOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
396 int stateAfterOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
397 int nextOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
398
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
399 if (invoke instanceof InvokeWithExceptionNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
400 int nextNextOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
401 int exceptionOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
402 int exceptionStateOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
403 int exceptionNextOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
404 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
405 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
406 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
407 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
408 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
409
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
410 /**
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
411 * {@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
412 * 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
413 * 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
414 * 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
415 */
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
416 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
417 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
418 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
419 if (invokeData.invoke instanceof InvokeWithExceptionNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
420 ((InvokeWithExceptionNode) invokeData.invoke).setCallTarget(callTarget);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
421 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
422 ((InvokeNode) invokeData.invoke).setCallTarget(callTarget);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
423 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
424
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
425 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
426 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
427
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
428 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
429 if (invokeData.invoke instanceof InvokeWithExceptionNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
430 ((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
431 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
432 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
433
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
434 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
435 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
436
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
437 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
438 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
439 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
440
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
441 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
442 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
443 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
444 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
445 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
446 loopBegin.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
447 successor.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
448 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
449 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
450 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
451 return;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
452 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
453 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
454
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
455 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
456 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
457 loopBegin.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
458 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
459 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
460 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
461 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
462 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
463
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
464 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
465 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
466 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
467 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
468 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
469
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
470 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
471 * 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
472 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
473 * @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
474 * @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
475 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
476 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
477 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
478 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
479
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
480 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
481 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
482 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
483 loopEnd.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
484
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
485 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
486 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
487 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
488 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
489 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
490 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
491 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
492 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
493 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
494 return replacementNode;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
495 }
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 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
498 * 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
499 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
500 * @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
501 * @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
502 * @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
503 * @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
504 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
505 protected void simplifyFixedNode(MethodScope methodScope, LoopScope loopScope, int nodeOrderId, FixedNode node) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
506 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
507
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
508 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
509 assert loopExit.stateAfter() == null;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
510 int stateAfterOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
511 loopExit.setStateAfter((FrameState) ensureNodeCreated(methodScope, loopScope, stateAfterOrderId));
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
512
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
513 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
514 for (int i = 0; i < numProxies; i++) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
515 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
516 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
517 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
518 * 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
519 * 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
520 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
521 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
522 }
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
525 protected void handleLoopExplosionProxyNodes(MethodScope methodScope, LoopScope loopScope, LoopExitNode loopExit, int loopExitOrderId) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
526 assert loopExit.stateAfter() == null;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
527 int stateAfterOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
528
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
529 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
530
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
531 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
532 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
533
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
534 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
535 * 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
536 * 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
537 * 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
538 */
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
539 MergeNode merge = null;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
540 Node existingExit = lookupNode(loopScope.outer, loopExitOrderId);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
541 if (existingExit == null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
542 /* 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
543 registerNode(loopScope.outer, loopExitOrderId, begin, false, false);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
544 begin.setNext(loopExitSuccessor);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
545
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
546 } else if (existingExit instanceof BeginNode) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
547 /* 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
548 merge = methodScope.graph.add(new MergeNode());
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
549 registerNode(loopScope.outer, loopExitOrderId, merge, true, false);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
550 /* Add the first iteration. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
551 EndNode firstEnd = methodScope.graph.add(new EndNode());
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
552 ((BeginNode) existingExit).setNext(firstEnd);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
553 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
554 merge.setNext(loopExitSuccessor);
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
555
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
556 } else {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
557 /* Subsequent loop iteration. Merge already created. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
558 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
559 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
560
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
561 if (merge != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
562 EndNode end = methodScope.graph.add(new EndNode());
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
563 begin.setNext(end);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
564 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
565 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
566
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
567 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
568 * 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
569 * 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
570 * 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
571 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
572 int numProxies = methodScope.reader.getUVInt();
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
573 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
574 for (int i = 0; i < numProxies; i++) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
575 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
576 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
577 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
578 ValueNode replacement;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
579
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
580 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
581 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
582 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
583 * 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
584 * 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
585 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
586 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
587 replacement = phiInput;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
588
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
589 } 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
590 /* 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
591 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
592 /* 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
593 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
594 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
595 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
596 /* 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
597 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
598 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
599 replacement = phi;
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
600 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
601
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
602 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
603 /* 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
604 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
605 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
606 replacement = phi;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
607 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
608
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
609 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
610 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
611
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
612 if (merge != null && (merge.stateAfter() == null || phiCreated)) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
613 FrameState oldStateAfter = merge.stateAfter();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
614 registerNode(loopScope.outer, stateAfterOrderId, null, true, true);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
615 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
616 if (oldStateAfter != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
617 oldStateAfter.safeDelete();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
618 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
619 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
620
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
621 loopExit.safeDelete();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
622 assert loopExitSuccessor.predecessor() == null;
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
623 if (merge != null) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
624 merge.getNodeClass().getSuccessorEdges().update(merge, null, loopExitSuccessor);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
625 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
626 begin.getNodeClass().getSuccessorEdges().update(begin, null, loopExitSuccessor);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
627 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
628 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
629
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
630 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
631
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
632 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
633 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
634 * 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
635 * 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
636 * 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
637 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
638 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
639 ((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
640 ((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
641
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
642 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
643 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
644 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
645 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
646 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
647 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
648
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
649 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
650 * 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
651 * 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
652 * 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
653 * 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
654 * 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
655 * 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
656 * upfront.
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 boolean lazyPhi = !(merge instanceof LoopBeginNode) || 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
659 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
660 for (int i = 0; i < numPhis; i++) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
661 int phiInputOrderId = readOrderId(methodScope);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
662 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
663
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
664 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
665
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
666 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
667 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
668 /* 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
669 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
670
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
671 } 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
672 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
673 * 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
674 * 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
675 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
676 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
677 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
678
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
679 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
680 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
681 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
682 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
683 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
684
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
685 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
686 /* 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
687 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
688 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
689 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
690 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
691 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
692
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
693 protected Node instantiateNode(MethodScope methodScope, int nodeOrderId) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
694 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
695 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
696 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
697 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
698
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
699 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
700 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
701 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
702 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
703 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
704 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
705 } else {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
706 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
707 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
708 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
709 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
710 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
711
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
712 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
713 * 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
714 * 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
715 * 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
716 * nodes).
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
717 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
718 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
719 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
720 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
721 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
722 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
723 }
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
724 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
725 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
726 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
727 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
728 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
729
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
730 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
731 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
732 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
733 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
734 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
735 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
736 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
737 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
738 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
739 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
740 for (int idx = 0; idx < size; idx++) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
741 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
742 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
743 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
744 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
745 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
746 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
747 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
748 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
749 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
750 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
751
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
752 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
753 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
754 return null;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
755 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
756 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
757 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
758 return node;
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
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
761 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
762
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
763 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
764 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
765 * 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
766 * 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
767 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
768 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
769
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
770 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
771 /* 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
772 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
773 if (!node.isAlive()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
774 node = methodScope.graph.addOrUnique(node);
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 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
777 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
778 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
779 return node;
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
782 /**
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
783 * 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
784 */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
785 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
786 long readerByteIndex = methodScope.reader.getByteIndex();
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
787 Node node = instantiateNode(methodScope, nodeOrderId);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
788 assert !(node instanceof FixedNode);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
789
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
790 /* Read the properties of the node. */
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
791 readProperties(methodScope, node);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
792 /* 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
793 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
794 /* 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
795 makeInputNodes(methodScope, loopScope, node, false);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
796 methodScope.reader.setByteIndex(readerByteIndex);
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
797 return node;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
798 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
799
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
800 /**
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
801 * 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
802 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
803 * @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
804 * @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
805 * @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
806 * @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
807 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
808 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
809 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
810 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
811
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
812 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
813 * 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
814 *
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
815 * @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
816 * @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
817 * @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
818 * @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
819 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
820 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
821 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
822 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
823
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
824 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
825 * 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
826 * 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
827 * 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
828 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
829 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
830 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
831 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
832 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
833 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
834 }
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
835 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
836 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
837 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
838 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
839 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
840 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
841 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
842 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
843 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
844 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
845 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
846 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
847 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
848 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
849 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
850 for (int idx = 0; idx < size; idx++) {
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
851 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
852 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
853 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
854 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
855 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
856 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
857 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
858 }
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 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
863 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
864 return null;
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 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
867 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
868 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
869 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
870
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
871 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
872 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
873 /* 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
874 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
875
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
876 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
877 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
878 return node;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
879 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
880
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
881 /**
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
882 * 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
883 * 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
884 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
885 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
886 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
887 /* 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
888 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
889 if (direct) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
890 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
891 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
892 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
893 if (decode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
894 /* 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
895 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
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 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
899
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
900 } 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
901 /* 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
902 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
903 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
904 return true;
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
905
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
906 } 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
907 /* 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
908 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
909
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
910 } else if (node instanceof Invoke) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
911 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
912 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
913 if (edges.type() == Edges.Type.Successors) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
914 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
915 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
916 } else {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
917 assert edges.type() == Edges.Type.Inputs;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
918 if (edges.getType(index) == CallTargetNode.class) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
919 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
920 } else if (edges.getType(index) == FrameState.class) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
921 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
922 return true;
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
923 }
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
924 }
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
925 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
926 return false;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
927 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
928
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
929 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
930 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
931 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
932
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
933 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
934 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
935 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
936 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
937 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
938 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
939
20896
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
940 protected int readOrderId(MethodScope methodScope) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
941 return methodScope.reader.getUVInt();
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
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
944 protected Object readObject(MethodScope methodScope) {
c7f1ab98d950 Improve speed of Graph partial evaluation
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20827
diff changeset
945 return methodScope.encodedGraph.getObjects()[methodScope.reader.getUVInt()];
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
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
948 /*
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
949 * 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
950 */
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
951
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
952 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
953 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
954 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
955 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
956 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
957 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
958 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
959 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
960 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
961 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
962 stack.pop();
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
963 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
964 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
965 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
966 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
967 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
968 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
969 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
970 // Detected cycle.
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
971 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
972 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
973 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
974 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
975 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
976 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
977 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
978 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
979 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
980 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
981 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
982 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
983 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
984 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
985 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
986 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
987 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
988 } 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
989 // 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
990 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
991 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
992 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
993 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
994 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
995 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
996 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
997
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
998 Debug.dump(currentGraph, "After loops detected");
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
999 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
1000 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1001
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1002 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
1003 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
1004 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
1005 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
1006 // 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
1007 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
1008 return loopBegin;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1009 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1010
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1011 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
1012 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
1013 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
1014 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
1015 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
1016 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
1017 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
1018 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
1019 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
1020 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
1021 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
1022 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1023 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
1024 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
1025 // 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
1026 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1027 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
1028 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
1029 }
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 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
1034 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
1035 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
1036 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
1037 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1038
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1039 // 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
1040 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
1041 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
1042 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
1043 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
1044 }
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
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1048 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
1049 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
1050 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
1051 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
1052 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
1053 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
1054 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1055
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1056 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
1057 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
1058
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1059 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
1060 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
1061 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
1062 continue;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1063 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1064 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
1065 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
1066 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
1067 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
1068 // Inner loop
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1069 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
1070 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
1071 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
1072 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
1073 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
1074 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
1075 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1076 } else {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1077 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
1078 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
1079 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
1080 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1081 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
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 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1085 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1086
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1087 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
1088 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
1089 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
1090 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
1091 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
1092 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
1093 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
1094 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1095 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1096 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1097
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1098 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
1099 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
1100 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1101
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1102 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
1103 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1104
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1105 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
1106 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
1107 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
1108 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
1109 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
1110 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
1111 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
1112 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1113 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1114
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1115 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
1116 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
1117 }
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
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1120 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
1121 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
1122
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1123 Debug.dump(methodScope.graph, "Before removing redundant merges");
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1124 for (Node node : methodScope.graph.getNewNodes(start)) {
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1125 if (node instanceof MergeNode) {
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1126 MergeNode mergeNode = (MergeNode) node;
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1127 if (mergeNode.forwardEndCount() == 1) {
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1128 methodScope.graph.reduceTrivialMerge(mergeNode);
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1129 }
20827
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 Debug.dump(methodScope.graph, "Before removing redundant begins");
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1134 for (Node node : methodScope.graph.getNewNodes(start)) {
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1135 if (node instanceof BeginNode || node instanceof KillingBeginNode) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1136 if (!(node.predecessor() instanceof ControlSplitNode) && node.hasNoUsages()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1137 GraphUtil.unlinkFixedNode((AbstractBeginNode) node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1138 node.safeDelete();
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 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1142
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1143 Debug.dump(methodScope.graph, "Before removing unused non-fixed nodes");
20985
eebb05f2d1e8 Fixes for GraphPE
Christian Wimmer <christian.wimmer@oracle.com>
parents: 20896
diff changeset
1144 for (Node node : methodScope.graph.getNewNodes(start)) {
20827
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1145 if (!(node instanceof FixedNode) && node.hasNoUsages()) {
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1146 GraphUtil.killCFG(node);
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1147 }
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 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
1152 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
1153 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
1154 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
1155 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
1156 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
1157 });
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1158 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
1159 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
1160 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
1161 });
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1162
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1163 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
1164 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
1165 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
1166 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1167 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
1168 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
1169 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
1170 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1171 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1172 return true;
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1173 }
5bf195ce816a New partial evaluator that works on encoded graphs (instead of on bytecodes)
Christian Wimmer <christian.wimmer@oracle.com>
parents:
diff changeset
1174 }