Mercurial > hg > truffle
annotate graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java @ 18163:c88ab4f1f04a
re-enabled Checkstyle with the release of 6.0 that supports Java 8; fixed existing Checkstyle warnings
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 24 Oct 2014 16:18:10 +0200 |
parents | 03259118b81b |
children | 9619ba4daf4c |
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) { |
18163
c88ab4f1f04a
re-enabled Checkstyle with the release of 6.0 that supports Java 8; fixed existing Checkstyle warnings
Doug Simon <doug.simon@oracle.com>
parents:
18111
diff
changeset
|
127 for (FrameState fs : nodeWithState.states()) { |
c88ab4f1f04a
re-enabled Checkstyle with the release of 6.0 that supports Java 8; fixed existing Checkstyle warnings
Doug Simon <doug.simon@oracle.com>
parents:
18111
diff
changeset
|
128 FrameState frameState = fs; |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
129 if (frameState.usages().count() > 1) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
130 FrameState copy = (FrameState) frameState.copyWithInputs(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
131 nodeWithState.asNode().replaceFirstInput(frameState, copy); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
132 frameState = copy; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
133 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
134 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
|
135 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
|
136 |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
137 @Override |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
138 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
|
139 ObjectState valueObj = getObjectState(state, value); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
140 if (valueObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
141 virtual.add(valueObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
142 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
|
143 } else if (value instanceof VirtualObjectNode) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
144 ObjectState virtualObj = null; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
145 for (ObjectState obj : state.getStates()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
146 if (value == obj.virtual) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
147 virtualObj = obj; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
148 break; |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
149 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
150 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
151 if (virtualObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
152 virtual.add(virtualObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
153 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
154 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
155 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
156 }); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
157 for (ObjectState obj : state.getStates()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
158 if (obj.isVirtual() && obj.hasLocks()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
159 virtual.add(obj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
160 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
161 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
162 |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
163 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
|
164 while (!queue.isEmpty()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
165 ObjectState obj = queue.removeLast(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
166 if (obj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
167 for (ValueNode field : obj.getEntries()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
168 if (field instanceof VirtualObjectNode) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
169 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
|
170 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
|
171 virtual.add(fieldObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
172 queue.addLast(fieldObj); |
12418
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 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
176 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
177 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
178 for (ObjectState obj : virtual) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
179 EscapeObjectState v; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
180 if (obj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
181 ValueNode[] fieldState = obj.getEntries().clone(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
182 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
|
183 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
|
184 if (valueObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
185 if (valueObj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
186 fieldState[i] = valueObj.virtual; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
187 } else { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
188 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
|
189 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
190 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
191 } |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
192 v = VirtualObjectState.create(obj.virtual, fieldState); |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
193 } else { |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
194 v = MaterializedObjectState.create(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
|
195 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
196 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
|
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 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
200 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
201 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
202 * @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
|
203 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
204 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
|
205 assert obj != null; |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
206 if (obj.getState() == EscapeState.Virtual) { |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
207 metric.increment(); |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
208 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
|
209 assert !obj.isVirtual(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
210 return true; |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
211 } else { |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
212 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
|
213 return false; |
6650
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 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
216 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
217 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
|
218 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
|
219 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
|
220 return materialized; |
6650
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 |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
223 @Override |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
224 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
|
225 HashMap<VirtualObjectNode, ProxyNode> proxies = new HashMap<>(); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
226 |
7897
a58851061377
rename ValueProxyNode to ProxyNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
7761
diff
changeset
|
227 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
|
228 ObjectState obj = getObjectState(exitState, proxy.value()); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
229 if (obj != null) { |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
230 proxies.put(obj.virtual, proxy); |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
231 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
232 } |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
233 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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 if (exitNode.loopBegin().isPhiAtMerge(value) || initialObj == null || !initialObj.isVirtual() || initialObj.getEntry(i) != value) { |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
241 ProxyNode proxy = ValueProxyNode.create(value, exitNode); |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
242 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
|
243 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
|
244 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
245 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
246 } |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
247 } else { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
248 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
|
249 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
|
250 if (proxy == null) { |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
251 proxy = ValueProxyNode.create(obj.getMaterializedValue(), exitNode); |
16461
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
252 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
|
253 } else { |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
254 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
|
255 // 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
|
256 } |
be0ad9b9aefe
do not create proxy nodes if the graph doesn't need them
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16446
diff
changeset
|
257 obj.updateMaterializedValue(proxy); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
258 } 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
|
259 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
|
260 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
|
261 } |
8981
09cdf7224794
PEA: cleanup and documentation for recent changes
Lukas Stadler <lukas.stadler@jku.at>
parents:
8924
diff
changeset
|
262 } |
6650
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 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
267 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
268 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
269 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
|
270 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
|
271 } |
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
|
272 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
273 protected class MergeProcessor extends EffectsClosure<BlockT>.MergeProcessor { |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
274 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
275 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
|
276 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
|
277 private final Map<ValuePhiNode, VirtualObjectNode> valueObjectVirtuals = newNodeIdentityMap(); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
278 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
279 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
|
280 super(mergeBlock); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
281 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
282 |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
283 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
|
284 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
|
285 if (result == null) { |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
286 result = ValuePhiNode.create(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
|
287 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
|
288 } |
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 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
|
290 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
291 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
292 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
|
293 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
|
294 if (result == null) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
295 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
|
296 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
|
297 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
298 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
|
299 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
|
300 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
301 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
302 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
|
303 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
|
304 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
|
305 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
|
306 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
|
307 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
308 return result; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
309 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
310 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
311 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
312 * 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
|
313 * 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
|
314 * 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
|
315 * 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
|
316 * into the correct blocks. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
317 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
318 * @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
|
319 */ |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
320 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
321 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
|
322 super.merge(states); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
323 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
324 // 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
|
325 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
|
326 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
|
327 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
|
328 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
329 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
338 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
339 // 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
|
340 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
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 virtual++; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
347 uniqueMaterializedValue = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
348 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
|
349 } 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
|
350 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
|
351 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
352 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
353 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
354 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
|
355 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
|
356 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
357 if (uniqueMaterializedValue != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
358 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
|
359 } else { |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 } |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
368 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
|
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 |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
373 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
|
374 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
|
375 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
|
376 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
377 } |
14610
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
378 if (materialized) { |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
379 newState.objectStates.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
380 mergeEffects.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
381 afterMergeEffects.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
382 } |
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
|
383 } 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
|
384 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
385 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
386 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
387 * 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
|
388 * 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
|
389 * 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
|
390 * 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
|
391 * 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
|
392 * {@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
|
393 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
394 * @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
|
395 * @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
|
396 * @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
|
397 * @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
|
398 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
399 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
|
400 boolean compatible = true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
401 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
|
402 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
403 // 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
|
404 Kind[] twoSlotKinds = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
405 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
|
406 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
|
407 int valueIndex = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
408 while (valueIndex < values.length) { |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14610
diff
changeset
|
409 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
|
410 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
|
411 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
|
412 if (twoSlotKinds == null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
413 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
|
414 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
415 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
|
416 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
417 break outer; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
418 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
419 twoSlotKinds[valueIndex] = otherKind; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
420 // 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
|
421 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
422 } else { |
18111
03259118b81b
Truffle: relax assertions for object state entries of int kind
Andreas Woess <andreas.woess@jku.at>
parents:
16895
diff
changeset
|
423 assert entryKind.getStackKind() == otherKind.getStackKind() || (entryKind == Kind.Int && otherKind == Kind.Illegal) || entryKind.getBitCount() >= otherKind.getBitCount() : entryKind + |
03259118b81b
Truffle: relax assertions for object state entries of int kind
Andreas Woess <andreas.woess@jku.at>
parents:
16895
diff
changeset
|
424 " vs " + otherKind; |
12617
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 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
427 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
428 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
429 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
|
430 // 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
|
431 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
|
432 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
|
433 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
|
434 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
|
435 ValueNode value = objStates[i].getEntry(valueIndex); |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14610
diff
changeset
|
436 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
|
437 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
|
438 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
|
439 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
|
440 // 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
|
441 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
|
442 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
|
443 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
444 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
445 break outer; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
446 } |
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
|
447 } |
8911
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 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
450 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
451 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
452 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
453 if (compatible) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
454 // 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
|
455 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
|
456 int valueIndex = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
457 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
|
458 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
|
459 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
|
460 if (phis[valueIndex] == null && values[valueIndex] != fields[valueIndex]) { |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
461 phis[valueIndex] = ValuePhiNode.create(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
|
462 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
463 } |
16446
4584f29431be
check phi types in during PEA state merging
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15867
diff
changeset
|
464 if (phis[valueIndex] != null && !phis[valueIndex].stamp().isCompatible(values[valueIndex].stamp())) { |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16461
diff
changeset
|
465 phis[valueIndex] = ValuePhiNode.create(values[valueIndex].stamp().unrestricted(), merge); |
16446
4584f29431be
check phi types in during PEA state merging
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15867
diff
changeset
|
466 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
467 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
|
468 // 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
|
469 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
470 phis[valueIndex] = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
471 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
|
472 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
473 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
474 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
475 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
476 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
477 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
|
478 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
|
479 if (phi != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
484 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
|
485 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
486 values[i] = phi; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
487 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
488 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
489 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
|
490 return materialized; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
491 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
492 // not compatible: materialize in all predecessors |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
493 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
|
494 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
|
495 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
|
496 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
|
497 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
|
498 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
|
499 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
500 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
|
501 return true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
502 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
503 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
504 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
505 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
506 * 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
|
507 * virtual object. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
508 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
509 * @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
|
510 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
511 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
|
512 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
513 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
|
514 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
|
515 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
516 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
517 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
|
518 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
|
519 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
|
520 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
|
521 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
|
522 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
|
523 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
524 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
|
525 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
526 return materialized; |
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 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
529 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
530 * 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
|
531 * object. |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
532 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
533 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
|
534 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
|
535 if (!state.isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
536 break; |
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 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
|
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 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
542 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
543 * 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
|
544 * 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
|
545 * 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
|
546 * identity if not used later on). |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
547 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
548 * @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
|
549 * @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
|
550 * @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
|
551 * 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
|
552 * @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
|
553 */ |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
554 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
|
555 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
|
556 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
|
557 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
558 // 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
|
559 int virtualInputs = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
560 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
|
561 boolean uniqueVirtualObject = true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
562 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
|
563 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
|
564 if (obj != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
565 if (obj.isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
566 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
|
567 uniqueVirtualObject = false; |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
568 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
569 virtualInputs++; |
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 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
572 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
573 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
|
574 if (uniqueVirtualObject) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
575 // 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
|
576 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
|
577 return false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
578 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
579 // 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
|
580 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
|
581 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
|
582 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
|
583 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
|
584 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
|
585 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
|
586 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
|
587 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
|
588 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
589 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
590 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
591 } |
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
|
592 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
|
593 // 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
|
594 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
|
595 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
|
596 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
|
597 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
|
598 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
|
599 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
|
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 } |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
602 } |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
603 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
604 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
605 if (compatible) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
606 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
|
607 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
|
608 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
609 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
|
610 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
|
611 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
|
612 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
|
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 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
615 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
616 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
617 // 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
|
618 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
619 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
|
620 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
|
621 if (obj != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
622 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
|
623 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
|
624 afterMergeEffects.initializePhiInput(phi, i, obj.getMaterializedValue()); |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
625 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
626 } |
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
|
627 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
|
628 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
629 } |
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
|
630 |
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 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
|
632 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
|
633 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
|
634 } |
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 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
|
636 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
|
637 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
|
638 } 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
|
639 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
|
640 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
|
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 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
|
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 } |
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 |
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 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
|
647 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
|
648 aliases.set(node, virtual); |
12619
62b05f62a75c
removed redundant assertion
Doug Simon <doug.simon@oracle.com>
parents:
12617
diff
changeset
|
649 for (Node usage : node.usages()) { |
62b05f62a75c
removed redundant assertion
Doug Simon <doug.simon@oracle.com>
parents:
12617
diff
changeset
|
650 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
|
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 } |
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 |
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 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
|
656 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
|
657 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
|
658 } |
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 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
|
660 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
|
661 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
|
662 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
663 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
664 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
665 } |