Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java @ 14978:e302df8bf51c
separate subclasses for value and guard phis and proxies
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Fri, 04 Apr 2014 18:32:32 +0200 |
parents | 2ed3233503b8 |
children | bceb077143ae |
rev | line source |
---|---|
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
1 /* |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
4 * |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
8 * |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
14 * |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
18 * |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
21 * questions. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
22 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
23 package com.oracle.graal.java; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
24 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
25 import static com.oracle.graal.graph.iterators.NodePredicates.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
26 import static com.oracle.graal.nodes.ValueNodeUtil.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
27 import static java.lang.reflect.Modifier.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
28 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
29 import java.util.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
30 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
31 import com.oracle.graal.api.code.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
32 import com.oracle.graal.api.meta.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
33 import com.oracle.graal.debug.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
34 import com.oracle.graal.graph.Node.Verbosity; |
14827
2ed3233503b8
Starting point of the baseline bytecode parser
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14826
diff
changeset
|
35 import com.oracle.graal.java.BciBlockMapping.BciBlock; |
14803 | 36 import com.oracle.graal.java.BciBlockMapping.LocalLiveness; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
37 import com.oracle.graal.nodes.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
38 import com.oracle.graal.nodes.calc.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
39 import com.oracle.graal.nodes.java.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
40 import com.oracle.graal.nodes.type.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
41 import com.oracle.graal.nodes.util.*; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
42 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
43 public class HIRFrameStateBuilder extends AbstractFrameStateBuilder<ValueNode> { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
44 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
45 private static final ValueNode[] EMPTY_ARRAY = new ValueNode[0]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
46 private static final MonitorIdNode[] EMPTY_MONITOR_ARRAY = new MonitorIdNode[0]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
47 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
48 private final ValueNode[] locals; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
49 private final ValueNode[] stack; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
50 private ValueNode[] lockedObjects; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
51 private MonitorIdNode[] monitorIds; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
52 private final StructuredGraph graph; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
53 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
54 /** |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
55 * @see BytecodeFrame#rethrowException |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
56 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
57 private boolean rethrowException; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
58 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
59 public HIRFrameStateBuilder(ResolvedJavaMethod method, StructuredGraph graph, boolean eagerResolve) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
60 super(method); |
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
61 |
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
62 assert graph != null; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
63 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
64 this.locals = new ValueNode[method.getMaxLocals()]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
65 // we always need at least one stack slot (for exceptions) |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
66 this.stack = new ValueNode[Math.max(1, method.getMaxStackSize())]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
67 this.lockedObjects = EMPTY_ARRAY; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
68 this.monitorIds = EMPTY_MONITOR_ARRAY; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
69 this.graph = graph; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
70 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
71 int javaIndex = 0; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
72 int index = 0; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
73 if (!isStatic(method.getModifiers())) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
74 // add the receiver |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
75 ParameterNode receiver = graph.unique(new ParameterNode(javaIndex, StampFactory.declaredNonNull(method.getDeclaringClass()))); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
76 storeLocal(javaIndex, receiver); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
77 javaIndex = 1; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
78 index = 1; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
79 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
80 Signature sig = method.getSignature(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
81 int max = sig.getParameterCount(false); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
82 ResolvedJavaType accessingClass = method.getDeclaringClass(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
83 for (int i = 0; i < max; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
84 JavaType type = sig.getParameterType(i, accessingClass); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
85 if (eagerResolve) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
86 type = type.resolve(accessingClass); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
87 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
88 Kind kind = type.getKind().getStackKind(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
89 Stamp stamp; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
90 if (kind == Kind.Object && type instanceof ResolvedJavaType) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
91 stamp = StampFactory.declared((ResolvedJavaType) type); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
92 } else { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
93 stamp = StampFactory.forKind(kind); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
94 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
95 ParameterNode param = graph.unique(new ParameterNode(index, stamp)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
96 storeLocal(javaIndex, param); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
97 javaIndex += stackSlots(kind); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
98 index++; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
99 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
100 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
101 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
102 private HIRFrameStateBuilder(HIRFrameStateBuilder other) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
103 super(other); |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
104 assert other.graph != null; |
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
105 graph = other.graph; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
106 locals = other.locals.clone(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
107 stack = other.stack.clone(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
108 lockedObjects = other.lockedObjects == EMPTY_ARRAY ? EMPTY_ARRAY : other.lockedObjects.clone(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
109 monitorIds = other.monitorIds == EMPTY_MONITOR_ARRAY ? EMPTY_MONITOR_ARRAY : other.monitorIds.clone(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
110 stackSize = other.stackSize; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
111 rethrowException = other.rethrowException; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
112 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
113 assert locals.length == method.getMaxLocals(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
114 assert stack.length == Math.max(1, method.getMaxStackSize()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
115 assert lockedObjects.length == monitorIds.length; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
116 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
117 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
118 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
119 public String toString() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
120 StringBuilder sb = new StringBuilder(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
121 sb.append("[locals: ["); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
122 for (int i = 0; i < locals.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
123 sb.append(i == 0 ? "" : ",").append(locals[i] == null ? "_" : locals[i].toString(Verbosity.Id)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
124 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
125 sb.append("] stack: ["); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
126 for (int i = 0; i < stackSize; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
127 sb.append(i == 0 ? "" : ",").append(stack[i] == null ? "_" : stack[i].toString(Verbosity.Id)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
128 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
129 sb.append("] locks: ["); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
130 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
131 sb.append(i == 0 ? "" : ",").append(lockedObjects[i].toString(Verbosity.Id)).append(" / ").append(monitorIds[i].toString(Verbosity.Id)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
132 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
133 sb.append("]"); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
134 if (rethrowException) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
135 sb.append(" rethrowException"); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
136 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
137 sb.append("]"); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
138 return sb.toString(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
139 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
140 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
141 public FrameState create(int bci) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
142 return graph.add(new FrameState(method, bci, locals, Arrays.asList(stack).subList(0, stackSize), lockedObjects, monitorIds, rethrowException, false)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
143 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
144 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
145 public HIRFrameStateBuilder copy() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
146 return new HIRFrameStateBuilder(this); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
147 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
148 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
149 public boolean isCompatibleWith(HIRFrameStateBuilder other) { |
14803 | 150 assert method.equals(other.method) && graph == other.graph && localsSize() == other.localsSize() : "Can only compare frame states of the same method"; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
151 assert lockedObjects.length == monitorIds.length && other.lockedObjects.length == other.monitorIds.length : "mismatch between lockedObjects and monitorIds"; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
152 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
153 if (stackSize() != other.stackSize()) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
154 return false; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
155 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
156 for (int i = 0; i < stackSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
157 ValueNode x = stackAt(i); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
158 ValueNode y = other.stackAt(i); |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
159 if (x != y && (x == null || x.isDeleted() || y == null || y.isDeleted() || x.getKind() != y.getKind())) { |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
160 return false; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
161 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
162 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
163 if (lockedObjects.length != other.lockedObjects.length) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
164 return false; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
165 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
166 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
167 if (GraphUtil.originalValue(lockedObjects[i]) != GraphUtil.originalValue(other.lockedObjects[i]) || monitorIds[i] != other.monitorIds[i]) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
168 throw new BailoutException("unbalanced monitors"); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
169 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
170 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
171 return true; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
172 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
173 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
174 public void merge(MergeNode block, HIRFrameStateBuilder other) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
175 assert isCompatibleWith(other); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
176 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
177 for (int i = 0; i < localsSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
178 storeLocal(i, merge(localAt(i), other.localAt(i), block)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
179 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
180 for (int i = 0; i < stackSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
181 storeStack(i, merge(stackAt(i), other.stackAt(i), block)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
182 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
183 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
184 lockedObjects[i] = merge(lockedObjects[i], other.lockedObjects[i], block); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
185 assert monitorIds[i] == other.monitorIds[i]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
186 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
187 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
188 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
189 private ValueNode merge(ValueNode currentValue, ValueNode otherValue, MergeNode block) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
190 if (currentValue == null || currentValue.isDeleted()) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
191 return null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
192 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
193 } else if (block.isPhiAtMerge(currentValue)) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
194 if (otherValue == null || otherValue.isDeleted() || currentValue.getKind() != otherValue.getKind()) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
195 propagateDelete((ValuePhiNode) currentValue); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
196 return null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
197 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
198 ((PhiNode) currentValue).addInput(otherValue); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
199 return currentValue; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
200 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
201 } else if (currentValue != otherValue) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
202 assert !(block instanceof LoopBeginNode) : "Phi functions for loop headers are create eagerly for all locals and stack slots"; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
203 if (otherValue == null || otherValue.isDeleted() || currentValue.getKind() != otherValue.getKind()) { |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
204 return null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
205 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
206 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
207 ValuePhiNode phi = graph.addWithoutUnique(new ValuePhiNode(currentValue.stamp().unrestricted(), block)); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
208 for (int i = 0; i < block.phiPredecessorCount(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
209 phi.addInput(currentValue); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
210 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
211 phi.addInput(otherValue); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
212 assert phi.valueCount() == block.phiPredecessorCount() + 1 : "valueCount=" + phi.valueCount() + " predSize= " + block.phiPredecessorCount(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
213 return phi; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
214 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
215 } else { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
216 return currentValue; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
217 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
218 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
219 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
220 private void propagateDelete(FloatingNode node) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
221 assert node instanceof ValuePhiNode || node instanceof ProxyNode; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
222 if (node.isDeleted()) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
223 return; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
224 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
225 // Collect all phi functions that use this phi so that we can delete them recursively (after |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
226 // we delete ourselves to avoid circles). |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
227 List<FloatingNode> propagateUsages = node.usages().filter(FloatingNode.class).filter(isA(ValuePhiNode.class).or(ProxyNode.class)).snapshot(); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
228 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
229 // Remove the phi function from all FrameStates where it is used and then delete it. |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
230 assert node.usages().filter(isNotA(FrameState.class).nor(ValuePhiNode.class).nor(ProxyNode.class)).isEmpty() : "phi function that gets deletes must only be used in frame states"; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
231 node.replaceAtUsages(null); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
232 node.safeDelete(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
233 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
234 for (FloatingNode phiUsage : propagateUsages) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
235 propagateDelete(phiUsage); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
236 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
237 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
238 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
239 public void insertLoopPhis(LoopBeginNode loopBegin) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
240 for (int i = 0; i < localsSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
241 storeLocal(i, createLoopPhi(loopBegin, localAt(i))); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
242 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
243 for (int i = 0; i < stackSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
244 storeStack(i, createLoopPhi(loopBegin, stackAt(i))); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
245 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
246 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
247 lockedObjects[i] = createLoopPhi(loopBegin, lockedObjects[i]); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
248 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
249 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
250 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
251 public void insertLoopProxies(LoopExitNode loopExit, HIRFrameStateBuilder loopEntryState) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
252 for (int i = 0; i < localsSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
253 ValueNode value = localAt(i); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
254 if (value != null && (!loopEntryState.contains(value) || loopExit.loopBegin().isPhiAtMerge(value))) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
255 Debug.log(" inserting proxy for %s", value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
256 storeLocal(i, ProxyNode.forValue(value, loopExit, graph)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
257 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
258 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
259 for (int i = 0; i < stackSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
260 ValueNode value = stackAt(i); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
261 if (value != null && (!loopEntryState.contains(value) || loopExit.loopBegin().isPhiAtMerge(value))) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
262 Debug.log(" inserting proxy for %s", value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
263 storeStack(i, ProxyNode.forValue(value, loopExit, graph)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
264 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
265 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
266 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
267 ValueNode value = lockedObjects[i]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
268 if (value != null && (!loopEntryState.contains(value) || loopExit.loopBegin().isPhiAtMerge(value))) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
269 Debug.log(" inserting proxy for %s", value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
270 lockedObjects[i] = ProxyNode.forValue(value, loopExit, graph); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
271 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
272 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
273 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
274 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
275 public void insertProxies(AbstractBeginNode begin) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
276 for (int i = 0; i < localsSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
277 ValueNode value = localAt(i); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
278 if (value != null) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
279 Debug.log(" inserting proxy for %s", value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
280 storeLocal(i, ProxyNode.forValue(value, begin, graph)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
281 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
282 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
283 for (int i = 0; i < stackSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
284 ValueNode value = stackAt(i); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
285 if (value != null) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
286 Debug.log(" inserting proxy for %s", value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
287 storeStack(i, ProxyNode.forValue(value, begin, graph)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
288 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
289 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
290 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
291 ValueNode value = lockedObjects[i]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
292 if (value != null) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
293 Debug.log(" inserting proxy for %s", value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
294 lockedObjects[i] = ProxyNode.forValue(value, begin, graph); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
295 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
296 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
297 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
298 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
299 private ValuePhiNode createLoopPhi(MergeNode block, ValueNode value) { |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
300 if (value == null) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
301 return null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
302 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
303 assert !block.isPhiAtMerge(value) : "phi function for this block already created"; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
304 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
305 ValuePhiNode phi = graph.addWithoutUnique(new ValuePhiNode(value.stamp().unrestricted(), block)); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
306 phi.addInput(value); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
307 return phi; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
308 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
309 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
310 public void cleanupDeletedPhis() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
311 for (int i = 0; i < localsSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
312 if (localAt(i) != null && localAt(i).isDeleted()) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14827
diff
changeset
|
313 assert localAt(i) instanceof ValuePhiNode || localAt(i) instanceof ProxyNode : "Only phi and value proxies can be deleted during parsing: " + localAt(i); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
314 storeLocal(i, null); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
315 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
316 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
317 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
318 |
14827
2ed3233503b8
Starting point of the baseline bytecode parser
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14826
diff
changeset
|
319 public void clearNonLiveLocals(BciBlock block, LocalLiveness liveness, boolean liveIn) { |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
320 if (liveness == null) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
321 return; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
322 } |
14803 | 323 if (liveIn) { |
324 for (int i = 0; i < locals.length; i++) { | |
325 if (!liveness.localIsLiveIn(block, i)) { | |
326 locals[i] = null; | |
327 } | |
328 } | |
329 } else { | |
330 for (int i = 0; i < locals.length; i++) { | |
331 if (!liveness.localIsLiveOut(block, i)) { | |
332 locals[i] = null; | |
333 } | |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
334 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
335 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
336 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
337 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
338 /** |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
339 * @see BytecodeFrame#rethrowException |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
340 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
341 public boolean rethrowException() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
342 return rethrowException; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
343 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
344 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
345 /** |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
346 * @see BytecodeFrame#rethrowException |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
347 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
348 public void setRethrowException(boolean b) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
349 rethrowException = b; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
350 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
351 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
352 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
353 public int localsSize() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
354 return locals.length; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
355 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
356 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
357 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
358 public ValueNode localAt(int i) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
359 return locals[i]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
360 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
361 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
362 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
363 public ValueNode stackAt(int i) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
364 return stack[i]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
365 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
366 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
367 /** |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
368 * Adds a locked monitor to this frame state. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
369 * |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
370 * @param object the object whose monitor will be locked. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
371 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
372 public void pushLock(ValueNode object, MonitorIdNode monitorId) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
373 assert object.isAlive() && object.getKind() == Kind.Object : "unexpected value: " + object; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
374 lockedObjects = Arrays.copyOf(lockedObjects, lockedObjects.length + 1); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
375 monitorIds = Arrays.copyOf(monitorIds, monitorIds.length + 1); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
376 lockedObjects[lockedObjects.length - 1] = object; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
377 monitorIds[monitorIds.length - 1] = monitorId; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
378 assert lockedObjects.length == monitorIds.length; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
379 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
380 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
381 /** |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
382 * Removes a locked monitor from this frame state. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
383 * |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
384 * @return the object whose monitor was removed from the locks list. |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
385 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
386 public ValueNode popLock() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
387 try { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
388 return lockedObjects[lockedObjects.length - 1]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
389 } finally { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
390 lockedObjects = lockedObjects.length == 1 ? EMPTY_ARRAY : Arrays.copyOf(lockedObjects, lockedObjects.length - 1); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
391 monitorIds = monitorIds.length == 1 ? EMPTY_MONITOR_ARRAY : Arrays.copyOf(monitorIds, monitorIds.length - 1); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
392 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
393 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
394 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
395 public MonitorIdNode peekMonitorId() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
396 return monitorIds[monitorIds.length - 1]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
397 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
398 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
399 /** |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
400 * @return the current lock depth |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
401 */ |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
402 public int lockDepth() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
403 assert lockedObjects.length == monitorIds.length; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
404 return lockedObjects.length; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
405 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
406 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
407 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
408 public ValueNode loadLocal(int i) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
409 ValueNode x = locals[i]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
410 assert !x.isDeleted(); |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
411 assert !isTwoSlot(x.getKind()) || locals[i + 1] == null; |
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
412 assert i == 0 || locals[i - 1] == null || !isTwoSlot(locals[i - 1].getKind()); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
413 return x; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
414 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
415 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
416 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
417 public void storeLocal(int i, ValueNode x) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
418 assert x == null || x.isAlive() && x.getKind() != Kind.Void && x.getKind() != Kind.Illegal : "unexpected value: " + x; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
419 locals[i] = x; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
420 if (x != null && isTwoSlot(x.getKind())) { |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
421 // if this is a double word, then kill i+1 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
422 locals[i + 1] = null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
423 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
424 if (x != null && i > 0) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
425 ValueNode p = locals[i - 1]; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
426 if (p != null && isTwoSlot(p.getKind())) { |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
427 // if there was a double word at i - 1, then kill it |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
428 locals[i - 1] = null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
429 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
430 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
431 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
432 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
433 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
434 public void storeStack(int i, ValueNode x) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
435 assert x == null || x.isAlive() && (stack[i] == null || x.getKind() == stack[i].getKind()) : "Method does not handle changes from one-slot to two-slot values or non-alive values"; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
436 stack[i] = x; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
437 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
438 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
439 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
440 public void push(Kind kind, ValueNode x) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
441 assert x.isAlive() && x.getKind() != Kind.Void && x.getKind() != Kind.Illegal; |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
442 xpush(assertKind(kind, x)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
443 if (isTwoSlot(kind)) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
444 xpush(null); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
445 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
446 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
447 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
448 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
449 public void xpush(ValueNode x) { |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
450 assert x == null || (x.isAlive() && x.getKind() != Kind.Void && x.getKind() != Kind.Illegal); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
451 stack[stackSize++] = x; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
452 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
453 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
454 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
455 public void ipush(ValueNode x) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
456 xpush(assertInt(x)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
457 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
458 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
459 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
460 public void fpush(ValueNode x) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
461 xpush(assertFloat(x)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
462 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
463 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
464 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
465 public void apush(ValueNode x) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
466 xpush(assertObject(x)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
467 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
468 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
469 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
470 public void lpush(ValueNode x) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
471 xpush(assertLong(x)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
472 xpush(null); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
473 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
474 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
475 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
476 public void dpush(ValueNode x) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
477 xpush(assertDouble(x)); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
478 xpush(null); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
479 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
480 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
481 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
482 public void pushReturn(Kind kind, ValueNode x) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
483 if (kind != Kind.Void) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
484 push(kind.getStackKind(), x); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
485 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
486 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
487 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
488 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
489 public ValueNode pop(Kind kind) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
490 assert kind != Kind.Void; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
491 if (isTwoSlot(kind)) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
492 xpop(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
493 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
494 return assertKind(kind, xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
495 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
496 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
497 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
498 public ValueNode xpop() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
499 ValueNode result = stack[--stackSize]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
500 assert result == null || !result.isDeleted(); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
501 return result; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
502 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
503 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
504 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
505 public ValueNode ipop() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
506 return assertInt(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
507 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
508 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
509 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
510 public ValueNode fpop() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
511 return assertFloat(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
512 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
513 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
514 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
515 public ValueNode apop() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
516 return assertObject(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
517 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
518 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
519 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
520 public ValueNode lpop() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
521 assertHigh(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
522 return assertLong(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
523 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
524 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
525 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
526 public ValueNode dpop() { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
527 assertHigh(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
528 return assertDouble(xpop()); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
529 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
530 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
531 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
532 public ValueNode[] popArguments(int slotSize, int argSize) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
533 int base = stackSize - slotSize; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
534 ValueNode[] r = new ValueNode[argSize]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
535 int argIndex = 0; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
536 int stackindex = 0; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
537 while (stackindex < slotSize) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
538 ValueNode element = stack[base + stackindex]; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
539 assert element != null; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
540 r[argIndex++] = element; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
541 stackindex += stackSlots(element.getKind()); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
542 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
543 stackSize = base; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
544 return r; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
545 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
546 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
547 @Override |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
548 public ValueNode peek(int argumentNumber) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
549 int idx = stackSize() - 1; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
550 for (int i = 0; i < argumentNumber; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
551 if (stackAt(idx) == null) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
552 idx--; |
14817
80147dac0d6e
LIRFrameStateBuilder added
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
14803
diff
changeset
|
553 assert isTwoSlot(stackAt(idx).getKind()); |
14793
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
554 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
555 idx--; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
556 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
557 return stackAt(idx); |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
558 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
559 |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
560 public boolean contains(ValueNode value) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
561 for (int i = 0; i < localsSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
562 if (localAt(i) == value) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
563 return true; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
564 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
565 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
566 for (int i = 0; i < stackSize(); i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
567 if (stackAt(i) == value) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
568 return true; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
569 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
570 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
571 assert lockedObjects.length == monitorIds.length; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
572 for (int i = 0; i < lockedObjects.length; i++) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
573 if (lockedObjects[i] == value || monitorIds[i] == value) { |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
574 return true; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
575 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
576 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
577 return false; |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
578 } |
c4e65d48887c
Added the HIRAbstractFrameStateBuilder
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff
changeset
|
579 } |