Mercurial > hg > truffle
annotate graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java @ 16461:be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Thu, 10 Jul 2014 17:11:57 +0200 |
parents | 4584f29431be |
children | 06c15e88d383 |
rev | line source |
---|---|
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
1 /* |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
4 * |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
8 * |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
14 * |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
18 * |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
21 * questions. |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
22 */ |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
23 package com.oracle.graal.virtual.phases.ea; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
24 |
15551
33cedbce5b23
added CollectionsProvider and NodeCollectionsProvider and replaced (almost) all allocations of IdentityHashMaps to go through these providers
Doug Simon <doug.simon@oracle.com>
parents:
15416
diff
changeset
|
25 import static com.oracle.graal.graph.util.CollectionsAccess.*; |
33cedbce5b23
added CollectionsProvider and NodeCollectionsProvider and replaced (almost) all allocations of IdentityHashMaps to go through these providers
Doug Simon <doug.simon@oracle.com>
parents:
15416
diff
changeset
|
26 |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
27 import java.util.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
28 |
7761
eaecd7c187ad
add Assumptions to VirtualizerTool
Lukas Stadler <lukas.stadler@jku.at>
parents:
7728
diff
changeset
|
29 import com.oracle.graal.api.code.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
30 import com.oracle.graal.api.meta.*; |
15198
2c0cfbf454b5
Move LIRTypeTool and Stamp to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents:
15018
diff
changeset
|
31 import com.oracle.graal.compiler.common.type.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
32 import com.oracle.graal.debug.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
33 import com.oracle.graal.graph.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
34 import com.oracle.graal.nodes.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
35 import com.oracle.graal.nodes.VirtualState.NodeClosure; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
36 import com.oracle.graal.nodes.cfg.*; |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
37 import com.oracle.graal.nodes.extended.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
38 import com.oracle.graal.nodes.spi.*; |
8556
c69b29285ff8
better read elimination
Lukas Stadler <lukas.stadler@jku.at>
parents:
8552
diff
changeset
|
39 import com.oracle.graal.nodes.spi.Virtualizable.EscapeState; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
40 import com.oracle.graal.nodes.virtual.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
41 import com.oracle.graal.phases.schedule.*; |
13369
c3ecad078114
utils: introduce ArraySet. use it instead of HashSet at some places
Bernhard Urban <bernhard.urban@jku.at>
parents:
13327
diff
changeset
|
42 import com.oracle.graal.phases.util.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
43 import com.oracle.graal.virtual.nodes.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
44 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
45 public abstract class PartialEscapeClosure<BlockT extends PartialEscapeBlockState<BlockT>> extends EffectsClosure<BlockT> { |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
46 |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
47 public static final DebugMetric METRIC_MATERIALIZATIONS = Debug.metric("Materializations"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
48 public static final DebugMetric METRIC_MATERIALIZATIONS_PHI = Debug.metric("MaterializationsPhi"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
49 public static final DebugMetric METRIC_MATERIALIZATIONS_MERGE = Debug.metric("MaterializationsMerge"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
50 public static final DebugMetric METRIC_MATERIALIZATIONS_UNHANDLED = Debug.metric("MaterializationsUnhandled"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
51 public static final DebugMetric METRIC_MATERIALIZATIONS_LOOP_REITERATION = Debug.metric("MaterializationsLoopReiteration"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
52 public static final DebugMetric METRIC_MATERIALIZATIONS_LOOP_END = Debug.metric("MaterializationsLoopEnd"); |
7550
2820060df953
removed space in metric name
Doug Simon <doug.simon@oracle.com>
parents:
7394
diff
changeset
|
53 public static final DebugMetric METRIC_ALLOCATION_REMOVED = Debug.metric("AllocationsRemoved"); |
6657
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6656
diff
changeset
|
54 |
11948 | 55 public static final DebugMetric METRIC_MEMORYCHECKPOINT = Debug.metric("MemoryCheckpoint"); |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
56 |
6710
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
57 private final NodeBitMap usages; |
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
58 private final VirtualizerToolImpl tool; |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
59 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
60 /** |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
61 * Final subclass of PartialEscapeClosure, for performance and to make everything behave nicely |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
62 * with generics. |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
63 */ |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
64 public static final class Final extends PartialEscapeClosure<PartialEscapeBlockState.Final> { |
8559
af0c1352f969
more work on read elimination
Lukas Stadler <lukas.stadler@jku.at>
parents:
8556
diff
changeset
|
65 |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
66 public Final(SchedulePhase schedule, MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, Assumptions assumptions) { |
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
67 super(schedule, metaAccess, constantReflection, assumptions); |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
68 } |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
69 |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
70 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
71 protected PartialEscapeBlockState.Final getInitialState() { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
72 return new PartialEscapeBlockState.Final(); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
73 } |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
74 |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
75 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
76 protected PartialEscapeBlockState.Final cloneState(PartialEscapeBlockState.Final oldState) { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
77 return new PartialEscapeBlockState.Final(oldState); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
78 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
79 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
80 |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
81 public PartialEscapeClosure(SchedulePhase schedule, MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, Assumptions assumptions) { |
15867
23f45bae453a
read elimination without schedule
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15551
diff
changeset
|
82 super(schedule, schedule.getCFG()); |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
83 this.usages = schedule.getCFG().graph.createNodeBitMap(); |
15018
db4254246f9a
Remove Constant.forObject and Constant.asObject to improve compiler/VM separation
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14978
diff
changeset
|
84 this.tool = new VirtualizerToolImpl(metaAccess, constantReflection, assumptions, this); |
6657
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6656
diff
changeset
|
85 } |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6656
diff
changeset
|
86 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
87 /** |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
88 * @return true if the node was deleted, false otherwise |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
89 */ |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
90 @Override |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
91 protected boolean processNode(Node node, BlockT state, GraphEffectList effects, FixedWithNextNode lastFixedNode) { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
92 boolean isMarked = usages.isMarked(node); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
93 if (isMarked || node instanceof VirtualizableRoot) { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
94 VirtualUtil.trace("[[%s]] ", node); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
95 FixedNode nextFixedNode = lastFixedNode == null ? null : lastFixedNode.next(); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
96 return processNode((ValueNode) node, nextFixedNode, state, effects, isMarked); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
97 } else { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
98 VirtualUtil.trace("%s ", node); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
99 return false; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
100 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
101 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
102 |
9809
a8a5d5832def
first step towards extensibility of the escape analysis phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9755
diff
changeset
|
103 private boolean processNode(final ValueNode node, FixedNode insertBefore, final BlockT state, final GraphEffectList effects, boolean isMarked) { |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
104 tool.reset(state, node, insertBefore, effects); |
6710
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
105 if (node instanceof Virtualizable) { |
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
106 ((Virtualizable) node).virtualize(tool); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
107 } |
6710
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
108 if (tool.isDeleted()) { |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
109 return !(node instanceof CommitAllocationNode || node instanceof AllocatedObjectNode || node instanceof BoxNode); |
6710
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
110 } |
9755
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
111 if (isMarked) { |
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
112 for (ValueNode input : node.inputs().filter(ValueNode.class)) { |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
113 ObjectState obj = getObjectState(state, input); |
9755
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
114 if (obj != null) { |
9809
a8a5d5832def
first step towards extensibility of the escape analysis phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9755
diff
changeset
|
115 VirtualUtil.trace("replacing input %s at %s: %s", input, node, obj); |
9755
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
116 replaceWithMaterialized(input, node, insertBefore, state, obj, effects, METRIC_MATERIALIZATIONS_UNHANDLED); |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
117 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
118 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
119 if (node instanceof NodeWithState) { |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
120 processNodeWithState((NodeWithState) node, state, effects); |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
121 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
122 } |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
123 return false; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
124 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
125 |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
126 private void processNodeWithState(NodeWithState nodeWithState, final BlockT state, final GraphEffectList effects) { |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
127 for (FrameState frameState : nodeWithState.states()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
128 if (frameState.usages().count() > 1) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
129 FrameState copy = (FrameState) frameState.copyWithInputs(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
130 nodeWithState.asNode().replaceFirstInput(frameState, copy); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
131 frameState = copy; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
132 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
133 final Set<ObjectState> virtual = new ArraySet<>(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
134 frameState.applyToNonVirtual(new NodeClosure<ValueNode>() { |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
135 |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
136 @Override |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
137 public void apply(Node usage, ValueNode value) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
138 ObjectState valueObj = getObjectState(state, value); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
139 if (valueObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
140 virtual.add(valueObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
141 effects.replaceFirstInput(usage, value, valueObj.virtual); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
142 } else if (value instanceof VirtualObjectNode) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
143 ObjectState virtualObj = null; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
144 for (ObjectState obj : state.getStates()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
145 if (value == obj.virtual) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
146 virtualObj = obj; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
147 break; |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
148 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
149 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
150 if (virtualObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
151 virtual.add(virtualObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
152 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
153 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
154 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
155 }); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
156 for (ObjectState obj : state.getStates()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
157 if (obj.isVirtual() && obj.hasLocks()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
158 virtual.add(obj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
159 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
160 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
161 |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
162 ArrayDeque<ObjectState> queue = new ArrayDeque<>(virtual); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
163 while (!queue.isEmpty()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
164 ObjectState obj = queue.removeLast(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
165 if (obj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
166 for (ValueNode field : obj.getEntries()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
167 if (field instanceof VirtualObjectNode) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
168 ObjectState fieldObj = state.getObjectState((VirtualObjectNode) field); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
169 if (fieldObj.isVirtual() && !virtual.contains(fieldObj)) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
170 virtual.add(fieldObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
171 queue.addLast(fieldObj); |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
172 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
173 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
174 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
175 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
176 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
177 for (ObjectState obj : virtual) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
178 EscapeObjectState v; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
179 if (obj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
180 ValueNode[] fieldState = obj.getEntries().clone(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
181 for (int i = 0; i < fieldState.length; i++) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
182 ObjectState valueObj = getObjectState(state, fieldState[i]); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
183 if (valueObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
184 if (valueObj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
185 fieldState[i] = valueObj.virtual; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
186 } else { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
187 fieldState[i] = valueObj.getMaterializedValue(); |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
188 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
189 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
190 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
191 v = new VirtualObjectState(obj.virtual, fieldState); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
192 } else { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
193 v = new MaterializedObjectState(obj.virtual, obj.getMaterializedValue()); |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
194 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
195 effects.addVirtualMapping(frameState, v); |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
196 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
197 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
198 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
199 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
200 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
201 * @return true if materialization happened, false if not. |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
202 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
203 private boolean ensureMaterialized(BlockT state, ObjectState obj, FixedNode materializeBefore, GraphEffectList effects, DebugMetric metric) { |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
204 assert obj != null; |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
205 if (obj.getState() == EscapeState.Virtual) { |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
206 metric.increment(); |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
207 state.materializeBefore(materializeBefore, obj.virtual, EscapeState.Materialized, effects); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
208 assert !obj.isVirtual(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
209 return true; |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
210 } else { |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
211 assert obj.getState() == EscapeState.Materialized; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
212 return false; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
213 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
214 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
215 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
216 private boolean replaceWithMaterialized(ValueNode value, Node usage, FixedNode materializeBefore, BlockT state, ObjectState obj, GraphEffectList effects, DebugMetric metric) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
217 boolean materialized = ensureMaterialized(state, obj, materializeBefore, effects, metric); |
6655
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
218 effects.replaceFirstInput(usage, value, obj.getMaterializedValue()); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
219 return materialized; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
220 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
221 |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
222 @Override |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
223 protected void processLoopExit(LoopExitNode exitNode, BlockT initialState, BlockT exitState, GraphEffectList effects) { |
7897
a58851061377
rename ValueProxyNode to ProxyNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
7761
diff
changeset
|
224 HashMap<VirtualObjectNode, ProxyNode> proxies = new HashMap<>(); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
225 |
7897
a58851061377
rename ValueProxyNode to ProxyNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
7761
diff
changeset
|
226 for (ProxyNode proxy : exitNode.proxies()) { |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
227 ObjectState obj = getObjectState(exitState, proxy.value()); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
228 if (obj != null) { |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
229 proxies.put(obj.virtual, proxy); |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
230 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
231 } |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
232 if (exitNode.graph().hasValueProxies()) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
233 for (ObjectState obj : exitState.getStates()) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
234 ObjectState initialObj = initialState.getObjectStateOptional(obj.virtual); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
235 if (obj.isVirtual()) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
236 for (int i = 0; i < obj.getEntries().length; i++) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
237 ValueNode value = obj.getEntry(i); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
238 if (!(value instanceof VirtualObjectNode || value.isConstant())) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
239 if (exitNode.loopBegin().isPhiAtMerge(value) || initialObj == null || !initialObj.isVirtual() || initialObj.getEntry(i) != value) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
240 ProxyNode proxy = new ValueProxyNode(value, exitNode); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
241 obj.setEntry(i, proxy); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
242 effects.addFloatingNode(proxy, "virtualProxy"); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
243 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
244 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
245 } |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
246 } else { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
247 if (initialObj == null || initialObj.isVirtual()) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
248 ProxyNode proxy = proxies.get(obj.virtual); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
249 if (proxy == null) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
250 proxy = new ValueProxyNode(obj.getMaterializedValue(), exitNode); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
251 effects.addFloatingNode(proxy, "proxy"); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
252 } else { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
253 effects.replaceFirstInput(proxy, proxy.value(), obj.getMaterializedValue()); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
254 // nothing to do - will be handled in processNode |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
255 } |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
256 obj.updateMaterializedValue(proxy); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
257 } else { |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
258 if (initialObj.getMaterializedValue() == obj.getMaterializedValue()) { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
259 Debug.log("materialized value changes within loop: %s vs. %s at %s", initialObj.getMaterializedValue(), obj.getMaterializedValue(), exitNode); |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
260 } |
8981
09cdf7224794
PEA: cleanup and documentation for recent changes
Lukas Stadler <lukas.stadler@jku.at>
parents:
8924
diff
changeset
|
261 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
262 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
263 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
264 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
265 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
266 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
267 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
268 protected MergeProcessor createMergeProcessor(Block merge) { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
269 return new MergeProcessor(merge); |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
270 } |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
271 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
272 protected class MergeProcessor extends EffectsClosure<BlockT>.MergeProcessor { |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
273 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
274 private final HashMap<Object, ValuePhiNode> materializedPhis = new HashMap<>(); |
15551
33cedbce5b23
added CollectionsProvider and NodeCollectionsProvider and replaced (almost) all allocations of IdentityHashMaps to go through these providers
Doug Simon <doug.simon@oracle.com>
parents:
15416
diff
changeset
|
275 private final Map<ValueNode, ValuePhiNode[]> valuePhis = newIdentityMap(); |
33cedbce5b23
added CollectionsProvider and NodeCollectionsProvider and replaced (almost) all allocations of IdentityHashMaps to go through these providers
Doug Simon <doug.simon@oracle.com>
parents:
15416
diff
changeset
|
276 private final Map<ValuePhiNode, VirtualObjectNode> valueObjectVirtuals = newNodeIdentityMap(); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
277 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
278 public MergeProcessor(Block mergeBlock) { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
279 super(mergeBlock); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
280 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
281 |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
282 protected <T> PhiNode getCachedPhi(T virtual, Stamp stamp) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
283 ValuePhiNode result = materializedPhis.get(virtual); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
284 if (result == null) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
285 result = new ValuePhiNode(stamp, merge); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
286 materializedPhis.put(virtual, result); |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
287 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
288 return result; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
289 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
290 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
291 private PhiNode[] getValuePhis(ValueNode key, int entryCount) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
292 ValuePhiNode[] result = valuePhis.get(key); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
293 if (result == null) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
294 result = new ValuePhiNode[entryCount]; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
295 valuePhis.put(key, result); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
296 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
297 assert result.length == entryCount; |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
298 return result; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
299 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
300 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
301 private VirtualObjectNode getValueObjectVirtual(ValuePhiNode phi, VirtualObjectNode virtual) { |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
302 VirtualObjectNode result = valueObjectVirtuals.get(phi); |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
303 if (result == null) { |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
304 result = virtual.duplicate(); |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
305 valueObjectVirtuals.put(phi, result); |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
306 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
307 return result; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
308 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
309 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
310 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
311 * Merge all predecessor block states into one block state. This is an iterative process, |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
312 * because merging states can lead to materializations which make previous parts of the |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
313 * merging operation invalid. The merging process is executed until a stable state has been |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
314 * reached. This method needs to be careful to place the effects of the merging operation |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
315 * into the correct blocks. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
316 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
317 * @param states the predecessor block states of the merge |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
318 */ |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
319 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
320 protected void merge(List<BlockT> states) { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
321 super.merge(states); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
322 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
323 // calculate the set of virtual objects that exist in all predecessors |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
324 HashSet<VirtualObjectNode> virtualObjTemp = new HashSet<>(states.get(0).getVirtualObjects()); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
325 for (int i = 1; i < states.size(); i++) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
326 virtualObjTemp.retainAll(states.get(i).getVirtualObjects()); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
327 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
328 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
329 ObjectState[] objStates = new ObjectState[states.size()]; |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
330 boolean materialized; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
331 do { |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
332 materialized = false; |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
333 for (VirtualObjectNode object : virtualObjTemp) { |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
334 for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
335 objStates[i] = states.get(i).getObjectState(object); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
336 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
337 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
338 // determine if all inputs are virtual or the same materialized value |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
339 int virtual = 0; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
340 ObjectState startObj = objStates[0]; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
341 boolean locksMatch = true; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
342 ValueNode uniqueMaterializedValue = startObj.isVirtual() ? null : startObj.getMaterializedValue(); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
343 for (ObjectState obj : objStates) { |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
344 if (obj.isVirtual()) { |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
345 virtual++; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
346 uniqueMaterializedValue = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
347 locksMatch &= obj.locksEqual(startObj); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
348 } else if (obj.getMaterializedValue() != uniqueMaterializedValue) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
349 uniqueMaterializedValue = null; |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
350 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
351 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
352 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
353 if (virtual == objStates.length && locksMatch) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
354 materialized |= mergeObjectStates(object, objStates, states); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
355 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
356 if (uniqueMaterializedValue != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
357 newState.addObject(object, new ObjectState(object, uniqueMaterializedValue, EscapeState.Materialized, null)); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
358 } else { |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
359 PhiNode materializedValuePhi = getCachedPhi(object, StampFactory.forKind(Kind.Object)); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
360 mergeEffects.addFloatingNode(materializedValuePhi, "materializedPhi"); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
361 for (int i = 0; i < objStates.length; i++) { |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
362 ObjectState obj = objStates[i]; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
363 Block predecessor = mergeBlock.getPredecessors().get(i); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
364 materialized |= ensureMaterialized(states.get(i), obj, predecessor.getEndNode(), blockEffects.get(predecessor), METRIC_MATERIALIZATIONS_MERGE); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
365 afterMergeEffects.addPhiInput(materializedValuePhi, obj.getMaterializedValue()); |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
366 } |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
367 newState.addObject(object, new ObjectState(object, materializedValuePhi, EscapeState.Materialized, null)); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
368 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
369 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
370 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
371 |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
372 for (PhiNode phi : merge.phis()) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
373 if (usages.isMarked(phi) && phi instanceof ValuePhiNode) { |
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
374 materialized |= processPhi((ValuePhiNode) phi, states, virtualObjTemp); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
375 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
376 } |
14610
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
377 if (materialized) { |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
378 newState.objectStates.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
379 mergeEffects.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
380 afterMergeEffects.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
381 } |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
382 } while (materialized); |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
383 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
384 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
385 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
386 * Try to merge multiple virtual object states into a single object state. If the incoming |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
387 * object states are compatible, then this method will create PhiNodes for the object's |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
388 * entries where needed. If they are incompatible, then all incoming virtual objects will be |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
389 * materialized, and a PhiNode for the materialized values will be created. Object states |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
390 * can be incompatible if they contain {@code long} or {@code double} values occupying two |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
391 * {@code int} slots in such a way that that their values cannot be merged using PhiNodes. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
392 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
393 * @param object the virtual object that should be associated with the merged object state |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
394 * @param objStates the incoming object states (all of which need to be virtual) |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
395 * @param blockStates the predecessor block states of the merge |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
396 * @return true if materialization happened during the merge, false otherwise |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
397 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
398 private boolean mergeObjectStates(VirtualObjectNode object, ObjectState[] objStates, List<BlockT> blockStates) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
399 boolean compatible = true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
400 ValueNode[] values = objStates[0].getEntries().clone(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
401 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
402 // determine all entries that have a two-slot value |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
403 Kind[] twoSlotKinds = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
404 outer: for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
405 ValueNode[] entries = objStates[i].getEntries(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
406 int valueIndex = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
407 while (valueIndex < values.length) { |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14610
diff
changeset
|
408 Kind otherKind = entries[valueIndex].getKind(); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
409 Kind entryKind = object.entryKind(valueIndex); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
410 if (entryKind == Kind.Int && (otherKind == Kind.Long || otherKind == Kind.Double)) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
411 if (twoSlotKinds == null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
412 twoSlotKinds = new Kind[values.length]; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
413 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
414 if (twoSlotKinds[valueIndex] != null && twoSlotKinds[valueIndex] != otherKind) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
415 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
416 break outer; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
417 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
418 twoSlotKinds[valueIndex] = otherKind; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
419 // skip the next entry |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
420 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
421 } else { |
12626
e09959e910f7
weakened or commented out assertions that are too strict given the way Truffle makes use of Unsafe
Doug Simon <doug.simon@oracle.com>
parents:
12619
diff
changeset
|
422 assert entryKind.getStackKind() == otherKind.getStackKind() || entryKind.getBitCount() >= otherKind.getBitCount() : entryKind + " vs " + otherKind; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
423 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
424 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
425 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
426 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
427 if (compatible && twoSlotKinds != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
428 // if there are two-slot values then make sure the incoming states can be merged |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
429 outer: for (int valueIndex = 0; valueIndex < values.length; valueIndex++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
430 if (twoSlotKinds[valueIndex] != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
431 assert valueIndex < object.entryCount() - 1 && object.entryKind(valueIndex) == Kind.Int && object.entryKind(valueIndex + 1) == Kind.Int; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
432 for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
433 ValueNode value = objStates[i].getEntry(valueIndex); |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14610
diff
changeset
|
434 Kind valueKind = value.getKind(); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
435 if (valueKind != twoSlotKinds[valueIndex]) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
436 ValueNode nextValue = objStates[i].getEntry(valueIndex + 1); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
437 if (value.isConstant() && value.asConstant().equals(Constant.INT_0) && nextValue.isConstant() && nextValue.asConstant().equals(Constant.INT_0)) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
438 // rewrite to a zero constant of the larger kind |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
439 objStates[i].setEntry(valueIndex, ConstantNode.defaultForKind(twoSlotKinds[valueIndex], merge.graph())); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
440 objStates[i].setEntry(valueIndex + 1, ConstantNode.forConstant(Constant.forIllegal(), tool.getMetaAccessProvider(), merge.graph())); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
441 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
442 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
443 break outer; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
444 } |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
445 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
446 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
447 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
448 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
449 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
450 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
451 if (compatible) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
452 // virtual objects are compatible: create phis for all entries that need them |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
453 PhiNode[] phis = getValuePhis(object, object.entryCount()); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
454 int valueIndex = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
455 while (valueIndex < values.length) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
456 for (int i = 1; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
457 ValueNode[] fields = objStates[i].getEntries(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
458 if (phis[valueIndex] == null && values[valueIndex] != fields[valueIndex]) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
459 phis[valueIndex] = new ValuePhiNode(values[valueIndex].stamp().unrestricted(), merge); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
460 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
461 } |
16446
4584f29431be
check phi types in during PEA state merging
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15867
diff
changeset
|
462 if (phis[valueIndex] != null && !phis[valueIndex].stamp().isCompatible(values[valueIndex].stamp())) { |
4584f29431be
check phi types in during PEA state merging
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15867
diff
changeset
|
463 phis[valueIndex] = new ValuePhiNode(values[valueIndex].stamp().unrestricted(), merge); |
4584f29431be
check phi types in during PEA state merging
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15867
diff
changeset
|
464 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
465 if (twoSlotKinds != null && twoSlotKinds[valueIndex] != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
466 // skip an entry after a long/double value that occupies two int slots |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
467 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
468 phis[valueIndex] = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
469 values[valueIndex] = ConstantNode.forConstant(Constant.forIllegal(), tool.getMetaAccessProvider(), merge.graph()); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
470 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
471 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
472 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
473 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
474 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
475 for (int i = 0; i < values.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
476 PhiNode phi = phis[i]; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
477 if (phi != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
478 mergeEffects.addFloatingNode(phi, "virtualMergePhi"); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
479 if (object.entryKind(i) == Kind.Object) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
480 materialized |= mergeObjectEntry(objStates, blockStates, phi, i); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
481 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
482 mergePrimitiveEntry(objStates, phi, i); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
483 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
484 values[i] = phi; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
485 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
486 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
487 newState.addObject(object, new ObjectState(object, values, EscapeState.Virtual, objStates[0].getLocks())); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
488 return materialized; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
489 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
490 // not compatible: materialize in all predecessors |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
491 PhiNode materializedValuePhi = getCachedPhi(object, StampFactory.forKind(Kind.Object)); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
492 for (int i = 0; i < blockStates.size(); i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
493 ObjectState obj = objStates[i]; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
494 Block predecessor = mergeBlock.getPredecessors().get(i); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
495 ensureMaterialized(blockStates.get(i), obj, predecessor.getEndNode(), blockEffects.get(predecessor), METRIC_MATERIALIZATIONS_MERGE); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
496 afterMergeEffects.addPhiInput(materializedValuePhi, obj.getMaterializedValue()); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
497 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
498 newState.addObject(object, new ObjectState(object, materializedValuePhi, EscapeState.Materialized, null)); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
499 return true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
500 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
501 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
502 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
503 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
504 * Fill the inputs of the PhiNode corresponding to one {@link Kind#Object} entry in the |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
505 * virtual object. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
506 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
507 * @return true if materialization happened during the merge, false otherwise |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
508 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
509 private boolean mergeObjectEntry(ObjectState[] objStates, List<BlockT> blockStates, PhiNode phi, int entryIndex) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
510 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
511 for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
512 if (!objStates[i].isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
513 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
514 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
515 ValueNode[] entries = objStates[i].getEntries(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
516 if (entries[entryIndex] instanceof VirtualObjectNode) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
517 ObjectState obj = blockStates.get(i).getObjectState((VirtualObjectNode) entries[entryIndex]); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
518 Block predecessor = mergeBlock.getPredecessors().get(i); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
519 materialized |= ensureMaterialized(blockStates.get(i), obj, predecessor.getEndNode(), blockEffects.get(predecessor), METRIC_MATERIALIZATIONS_MERGE); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
520 entries[entryIndex] = obj.getMaterializedValue(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
521 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
522 afterMergeEffects.addPhiInput(phi, entries[entryIndex]); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
523 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
524 return materialized; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
525 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
526 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
527 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
528 * Fill the inputs of the PhiNode corresponding to one primitive entry in the virtual |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
529 * object. |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
530 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
531 private void mergePrimitiveEntry(ObjectState[] objStates, PhiNode phi, int entryIndex) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
532 for (ObjectState state : objStates) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
533 if (!state.isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
534 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
535 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
536 afterMergeEffects.addPhiInput(phi, state.getEntries()[entryIndex]); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
537 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
538 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
539 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
540 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
541 * Examine a PhiNode and try to replace it with merging of virtual objects if all its inputs |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
542 * refer to virtual object states. In order for the merging to happen, all incoming object |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
543 * states need to be compatible and without object identity (meaning that their object |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
544 * identity if not used later on). |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
545 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
546 * @param phi the PhiNode that should be processed |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
547 * @param states the predecessor block states of the merge |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
548 * @param mergedVirtualObjects the set of virtual objects that exist in all incoming states, |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
549 * and therefore also exist in the merged state |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
550 * @return true if materialization happened during the merge, false otherwise |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
551 */ |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
552 private boolean processPhi(ValuePhiNode phi, List<BlockT> states, Set<VirtualObjectNode> mergedVirtualObjects) { |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
553 aliases.set(phi, null); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
554 assert states.size() == phi.valueCount(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
555 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
556 // determine how many inputs are virtual and if they're all the same virtual object |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
557 int virtualInputs = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
558 ObjectState[] objStates = new ObjectState[states.size()]; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
559 boolean uniqueVirtualObject = true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
560 for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
561 ObjectState obj = objStates[i] = getObjectState(states.get(i), phi.valueAt(i)); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
562 if (obj != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
563 if (obj.isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
564 if (objStates[0] == null || objStates[0].virtual != obj.virtual) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
565 uniqueVirtualObject = false; |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
566 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
567 virtualInputs++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
568 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
569 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
570 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
571 if (virtualInputs == objStates.length) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
572 if (uniqueVirtualObject) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
573 // all inputs refer to the same object: just make the phi node an alias |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
574 addAndMarkAlias(objStates[0].virtual, phi); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
575 return false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
576 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
577 // all inputs are virtual: check if they're compatible and without identity |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
578 boolean compatible = true; |
15416
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
579 boolean hasIdentity = false; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
580 ObjectState firstObj = objStates[0]; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
581 for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
582 ObjectState obj = objStates[i]; |
15416
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
583 hasIdentity |= obj.virtual.hasIdentity(); |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
584 boolean identitySurvives = obj.virtual.hasIdentity() && mergedVirtualObjects.contains(obj.virtual); |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
585 if (identitySurvives || !firstObj.virtual.type().equals(obj.virtual.type()) || firstObj.virtual.entryCount() != obj.virtual.entryCount() || !firstObj.locksEqual(obj)) { |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
586 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
587 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
588 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
589 } |
15416
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
590 if (compatible && hasIdentity) { |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
591 // we still need to check whether this value is referenced by any other phi |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
592 outer: for (PhiNode otherPhi : merge.phis().filter(otherPhi -> otherPhi != phi)) { |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
593 for (int i = 0; i < objStates.length; i++) { |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
594 ObjectState otherPhiValueState = getObjectState(states.get(i), otherPhi.valueAt(i)); |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
595 if (Arrays.asList(objStates).contains(otherPhiValueState)) { |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
596 compatible = false; |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
597 break outer; |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
598 } |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
599 } |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
600 } |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
601 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
602 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
603 if (compatible) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
604 VirtualObjectNode virtual = getValueObjectVirtual(phi, getObjectState(states.get(0), phi.valueAt(0)).virtual); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
605 mergeEffects.addFloatingNode(virtual, "valueObjectNode"); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
606 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
607 boolean materialized = mergeObjectStates(virtual, objStates, states); |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
608 addAndMarkAlias(virtual, virtual); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
609 addAndMarkAlias(virtual, phi); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
610 return materialized; |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
611 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
612 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
613 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
614 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
615 // otherwise: materialize all phi inputs |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
616 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
617 for (int i = 0; i < objStates.length; i++) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
618 ObjectState obj = objStates[i]; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
619 if (obj != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
620 Block predecessor = mergeBlock.getPredecessors().get(i); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
621 materialized |= ensureMaterialized(states.get(i), obj, predecessor.getEndNode(), blockEffects.get(predecessor), METRIC_MATERIALIZATIONS_PHI); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
622 afterMergeEffects.initializePhiInput(phi, i, obj.getMaterializedValue()); |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
623 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
624 } |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
625 return materialized; |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
626 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
627 } |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
628 |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
629 public ObjectState getObjectState(PartialEscapeBlockState<?> state, ValueNode value) { |
13327
c258331fdde6
removed support for external nodes (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
13292
diff
changeset
|
630 if (value == null) { |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
631 return null; |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
632 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
633 if (value.isAlive() && !aliases.isNew(value)) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
634 ValueNode object = aliases.get(value); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
635 return object instanceof VirtualObjectNode ? state.getObjectStateOptional((VirtualObjectNode) object) : null; |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
636 } else { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
637 if (value instanceof VirtualObjectNode) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
638 return state.getObjectStateOptional((VirtualObjectNode) value); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
639 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
640 return null; |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
641 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
642 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
643 |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
644 void addAndMarkAlias(VirtualObjectNode virtual, ValueNode node) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
645 if (node.isAlive()) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
646 aliases.set(node, virtual); |
12619
62b05f62a75c
removed redundant assertion
Doug Simon <doug.simon@oracle.com>
parents:
12617
diff
changeset
|
647 for (Node usage : node.usages()) { |
62b05f62a75c
removed redundant assertion
Doug Simon <doug.simon@oracle.com>
parents:
12617
diff
changeset
|
648 markVirtualUsages(usage); |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
649 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
650 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
651 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
652 |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
653 private void markVirtualUsages(Node node) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
654 if (!usages.isNew(node)) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
655 usages.mark(node); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
656 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
657 if (node instanceof VirtualState) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
658 for (Node usage : node.usages()) { |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
659 markVirtualUsages(usage); |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
660 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
661 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
662 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
663 } |