Mercurial > hg > truffle
annotate graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/nodes/MaterializeObjectNode.java @ 7007:94596bbec6f0
provide MetaAccessProvider to EscapeAnalyzable
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 20 Nov 2012 13:36:22 +0100 |
parents | 51b6e594b0cd |
children | 742ec0f04559 |
rev | line source |
---|---|
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
1 /* |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
2 * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
4 * |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
8 * |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
14 * |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
18 * |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
21 * questions. |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
22 */ |
6524
a206e077ffc8
rename packages in graal.virtual to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6522
diff
changeset
|
23 package com.oracle.graal.virtual.nodes; |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
24 |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
25 import com.oracle.graal.api.meta.*; |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
26 import com.oracle.graal.graph.*; |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
27 import com.oracle.graal.nodes.*; |
6411
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6399
diff
changeset
|
28 import com.oracle.graal.nodes.java.*; |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
29 import com.oracle.graal.nodes.spi.*; |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
30 import com.oracle.graal.nodes.type.*; |
6524
a206e077ffc8
rename packages in graal.virtual to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6522
diff
changeset
|
31 import com.oracle.graal.nodes.virtual.*; |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
32 |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
33 @NodeInfo(nameTemplate = "Materialize {i#virtualObject}") |
6393
adf0879a41c1
more escape analysis infrastructure: change EscapeOp behavior, make MaterializeObjectNodes roots for escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
6354
diff
changeset
|
34 public final class MaterializeObjectNode extends FixedWithNextNode implements EscapeAnalyzable, Lowerable, Node.IterableNodeType, Canonicalizable { |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
35 |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
36 @Input private final NodeInputList<ValueNode> values; |
6394
466e6ceebfed
iterative partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
6393
diff
changeset
|
37 @Input private final VirtualObjectNode virtualObject; |
6666
49cd16dfb10c
fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
38 private final int lockCount; |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
39 |
6666
49cd16dfb10c
fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
40 public MaterializeObjectNode(VirtualObjectNode virtualObject, int lockCount) { |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
41 super(StampFactory.exactNonNull(virtualObject.type())); |
6394
466e6ceebfed
iterative partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
6393
diff
changeset
|
42 this.virtualObject = virtualObject; |
6666
49cd16dfb10c
fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
43 this.lockCount = lockCount; |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
44 this.values = new NodeInputList<>(this, virtualObject.entryCount()); |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
45 } |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
46 |
6354
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
47 public NodeInputList<ValueNode> values() { |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
48 return values; |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
49 } |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
50 |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
51 @Override |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
52 public void lower(LoweringTool tool) { |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
53 StructuredGraph graph = (StructuredGraph) graph(); |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
54 if (virtualObject instanceof VirtualInstanceNode) { |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
55 VirtualInstanceNode virtual = (VirtualInstanceNode) virtualObject; |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
56 |
6666
49cd16dfb10c
fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
57 NewInstanceNode newInstance = graph.add(new NewInstanceNode(virtual.type(), false, lockCount > 0)); |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
58 this.replaceAtUsages(newInstance); |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
59 graph.addAfterFixed(this, newInstance); |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
60 |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
61 FixedWithNextNode position = newInstance; |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
62 for (int i = 0; i < virtual.entryCount(); i++) { |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
63 StoreFieldNode store = graph.add(new StoreFieldNode(newInstance, virtual.field(i), values.get(i), -1)); |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
64 graph.addAfterFixed(position, store); |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
65 position = store; |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
66 } |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
67 |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
68 graph.removeFixed(this); |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
69 } else { |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
70 assert virtualObject instanceof VirtualArrayNode; |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
71 VirtualArrayNode virtual = (VirtualArrayNode) virtualObject; |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
72 |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
73 ResolvedJavaType element = virtual.componentType(); |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
74 NewArrayNode newArray; |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6524
diff
changeset
|
75 if (element.getKind() == Kind.Object) { |
6666
49cd16dfb10c
fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
76 newArray = graph.add(new NewObjectArrayNode(element, ConstantNode.forInt(virtual.entryCount(), graph), false, lockCount > 0)); |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
77 } else { |
6666
49cd16dfb10c
fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
6657
diff
changeset
|
78 newArray = graph.add(new NewPrimitiveArrayNode(element, ConstantNode.forInt(virtual.entryCount(), graph), false, lockCount > 0)); |
6399
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
79 } |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
80 this.replaceAtUsages(newArray); |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
81 graph.addAfterFixed(this, newArray); |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
82 |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
83 FixedWithNextNode position = newArray; |
6ad5bf2efb5e
cleanups, merge EscapeRecord and VirtualObjectNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
6394
diff
changeset
|
84 for (int i = 0; i < virtual.entryCount(); i++) { |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6524
diff
changeset
|
85 StoreIndexedNode store = graph.add(new StoreIndexedNode(newArray, ConstantNode.forInt(i, graph), element.getKind(), values.get(i), -1)); |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
86 graph.addAfterFixed(position, store); |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
87 position = store; |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
88 } |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
89 |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
90 graph.removeFixed(this); |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
91 } |
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
92 } |
6354
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
93 |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
94 @Override |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
95 public ValueNode canonical(CanonicalizerTool tool) { |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
96 if (usages().isEmpty()) { |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
97 return null; |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
98 } else { |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
99 return this; |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
100 } |
6a324c13cfff
add fillContents property to New... nodes
Lukas Stadler <lukas.stadler@jku.at>
parents:
6290
diff
changeset
|
101 } |
6393
adf0879a41c1
more escape analysis infrastructure: change EscapeOp behavior, make MaterializeObjectNodes roots for escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
6354
diff
changeset
|
102 |
adf0879a41c1
more escape analysis infrastructure: change EscapeOp behavior, make MaterializeObjectNodes roots for escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
6354
diff
changeset
|
103 @Override |
7007
94596bbec6f0
provide MetaAccessProvider to EscapeAnalyzable
Lukas Stadler <lukas.stadler@jku.at>
parents:
7006
diff
changeset
|
104 public ObjectDesc[] getAllocations(long nextVirtualId, MetaAccessProvider metaAccess) { |
7006
51b6e594b0cd
refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
105 if (shouldRevirtualize(this)) { |
51b6e594b0cd
refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
106 return new ObjectDesc[] {new ObjectDesc(virtualObject, values.toArray(new ValueNode[values.size()]), lockCount)}; |
6657
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
107 } |
7006
51b6e594b0cd
refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
108 return null; |
6393
adf0879a41c1
more escape analysis infrastructure: change EscapeOp behavior, make MaterializeObjectNodes roots for escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
6354
diff
changeset
|
109 } |
6657
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
110 |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
111 private boolean shouldRevirtualize(MaterializeObjectNode materializeObjectNode) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
112 FixedWithNextNode end = materializeObjectNode; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
113 do { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
114 Node next = end.next(); |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
115 if (next instanceof MaterializeObjectNode) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
116 if (!shouldRevirtualize((MaterializeObjectNode) next)) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
117 return false; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
118 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
119 end = (FixedWithNextNode) next; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
120 } else if (next instanceof CyclicMaterializeStoreNode) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
121 end = (FixedWithNextNode) next; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
122 } else { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
123 break; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
124 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
125 } while (true); |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
126 FixedNode suffix = end.next(); |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
127 if (suffix instanceof EndNode) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
128 for (PhiNode phi : ((EndNode) suffix).merge().phis()) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
129 int materialized = 0; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
130 boolean used = false; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
131 for (Node input : phi.inputs()) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
132 if (input instanceof MaterializeObjectNode) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
133 materialized++; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
134 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
135 if (input == materializeObjectNode) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
136 used = true; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
137 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
138 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
139 if (used && materialized != phi.valueCount()) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
140 return false; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
141 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
142 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
143 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
144 |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
145 return true; |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6539
diff
changeset
|
146 } |
6286
67a357e3e42a
infrastructure changes in preparation of partial escape analysis
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
147 } |