Mercurial > hg > truffle
annotate graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java @ 15416:89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 28 Apr 2014 16:21:44 +0200 |
parents | 882f4cb7cfcf |
children | 33cedbce5b23 |
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 |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
25 import java.util.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
26 |
7761
eaecd7c187ad
add Assumptions to VirtualizerTool
Lukas Stadler <lukas.stadler@jku.at>
parents:
7728
diff
changeset
|
27 import com.oracle.graal.api.code.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
28 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
|
29 import com.oracle.graal.compiler.common.type.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
30 import com.oracle.graal.debug.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
31 import com.oracle.graal.graph.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
32 import com.oracle.graal.nodes.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
33 import com.oracle.graal.nodes.VirtualState.NodeClosure; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
34 import com.oracle.graal.nodes.cfg.*; |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
35 import com.oracle.graal.nodes.extended.*; |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
36 import com.oracle.graal.nodes.java.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
37 import com.oracle.graal.nodes.spi.*; |
8556
c69b29285ff8
better read elimination
Lukas Stadler <lukas.stadler@jku.at>
parents:
8552
diff
changeset
|
38 import com.oracle.graal.nodes.spi.Virtualizable.EscapeState; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
39 import com.oracle.graal.nodes.virtual.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
40 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
|
41 import com.oracle.graal.phases.util.*; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
42 import com.oracle.graal.virtual.nodes.*; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
43 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
44 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
|
45 |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
46 public static final DebugMetric METRIC_MATERIALIZATIONS = Debug.metric("Materializations"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
47 public static final DebugMetric METRIC_MATERIALIZATIONS_PHI = Debug.metric("MaterializationsPhi"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
48 public static final DebugMetric METRIC_MATERIALIZATIONS_MERGE = Debug.metric("MaterializationsMerge"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
49 public static final DebugMetric METRIC_MATERIALIZATIONS_UNHANDLED = Debug.metric("MaterializationsUnhandled"); |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
50 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
|
51 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
|
52 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
|
53 |
11948 | 54 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
|
55 |
6710
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
56 private final NodeBitMap usages; |
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
57 private final VirtualizerToolImpl tool; |
8552
31b7a648b4b3
turn inlining hints into a map
Lukas Stadler <lukas.stadler@jku.at>
parents:
8551
diff
changeset
|
58 private final Map<Invoke, Double> hints = new IdentityHashMap<>(); |
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) { |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
82 super(schedule); |
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 |
8552
31b7a648b4b3
turn inlining hints into a map
Lukas Stadler <lukas.stadler@jku.at>
parents:
8551
diff
changeset
|
87 public Map<Invoke, Double> getHints() { |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
88 return hints; |
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
89 } |
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
90 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
91 /** |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
92 * @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
|
93 */ |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
94 @Override |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
95 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
|
96 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
|
97 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
|
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 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
|
100 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
|
101 } else { |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
102 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
|
103 return false; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
104 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
105 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
106 |
9809
a8a5d5832def
first step towards extensibility of the escape analysis phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9755
diff
changeset
|
107 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
|
108 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
|
109 if (node instanceof Virtualizable) { |
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
110 ((Virtualizable) node).virtualize(tool); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
111 } |
6710
6db6881c1270
add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents:
6666
diff
changeset
|
112 if (tool.isDeleted()) { |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
113 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
|
114 } |
9755
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
115 if (isMarked) { |
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
116 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
|
117 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
|
118 if (obj != null) { |
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
119 if (obj.isVirtual() && node instanceof MethodCallTargetNode) { |
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
120 Invoke invoke = ((MethodCallTargetNode) node).invoke(); |
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
121 hints.put(invoke, 5d); |
432b8405e056
small refactoring of early read elimination (move logic into "virtualize" methods)
Lukas Stadler <lukas.stadler@jku.at>
parents:
9686
diff
changeset
|
122 } |
9809
a8a5d5832def
first step towards extensibility of the escape analysis phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9755
diff
changeset
|
123 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
|
124 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
|
125 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
126 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
127 if (node instanceof NodeWithState) { |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
128 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
|
129 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
130 } |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8544
diff
changeset
|
131 return false; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
132 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
133 |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
134 private void processNodeWithState(NodeWithState nodeWithState, final BlockT state, final GraphEffectList effects) { |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
135 for (FrameState frameState : nodeWithState.states()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
136 if (frameState.usages().count() > 1) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
137 FrameState copy = (FrameState) frameState.copyWithInputs(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
138 nodeWithState.asNode().replaceFirstInput(frameState, copy); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
139 frameState = copy; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
140 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
141 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
|
142 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
|
143 |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
144 @Override |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
145 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
|
146 ObjectState valueObj = getObjectState(state, value); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
147 if (valueObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
148 virtual.add(valueObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
149 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
|
150 } else if (value instanceof VirtualObjectNode) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
151 ObjectState virtualObj = null; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
152 for (ObjectState obj : state.getStates()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
153 if (value == obj.virtual) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
154 virtualObj = obj; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
155 break; |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
156 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
157 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
158 if (virtualObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
159 virtual.add(virtualObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
160 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
161 } |
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 }); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
164 for (ObjectState obj : state.getStates()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
165 if (obj.isVirtual() && obj.hasLocks()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
166 virtual.add(obj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
167 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
168 } |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
169 |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
170 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
|
171 while (!queue.isEmpty()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
172 ObjectState obj = queue.removeLast(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
173 if (obj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
174 for (ValueNode field : obj.getEntries()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
175 if (field instanceof VirtualObjectNode) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
176 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
|
177 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
|
178 virtual.add(fieldObj); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
179 queue.addLast(fieldObj); |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
180 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
181 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
182 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
183 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
184 } |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
185 for (ObjectState obj : virtual) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
186 EscapeObjectState v; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
187 if (obj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
188 ValueNode[] fieldState = obj.getEntries().clone(); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
189 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
|
190 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
|
191 if (valueObj != null) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
192 if (valueObj.isVirtual()) { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
193 fieldState[i] = valueObj.virtual; |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
194 } else { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
195 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
|
196 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
197 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
198 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
199 v = new VirtualObjectState(obj.virtual, fieldState); |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
200 } else { |
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
201 v = new MaterializedObjectState(obj.virtual, obj.getMaterializedValue()); |
12418
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
202 } |
15208
349a0371b3b6
Add LambdaEagerTest.states, use it in PE closure
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15198
diff
changeset
|
203 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
|
204 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
205 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
206 } |
8c53ba3efbc9
PEA: fix up FrameStates *after* dealing with unhandled inputs
Lukas Stadler <lukas.stadler@jku.at>
parents:
11948
diff
changeset
|
207 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
208 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
209 * @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
|
210 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
211 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
|
212 assert obj != null; |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
213 if (obj.getState() == EscapeState.Virtual) { |
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
214 metric.increment(); |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
215 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
|
216 assert !obj.isVirtual(); |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
217 return true; |
7394
94f032472c28
changed PEA interface:
Lukas Stadler <lukas.stadler@jku.at>
parents:
7123
diff
changeset
|
218 } else { |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
219 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
|
220 return false; |
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 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
224 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
|
225 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
|
226 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
|
227 return materialized; |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
228 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
229 |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
230 @Override |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
231 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
|
232 HashMap<VirtualObjectNode, ProxyNode> proxies = new HashMap<>(); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
233 |
7897
a58851061377
rename ValueProxyNode to ProxyNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
7761
diff
changeset
|
234 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
|
235 ObjectState obj = getObjectState(exitState, proxy.value()); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
236 if (obj != null) { |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
237 proxies.put(obj.virtual, proxy); |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
238 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
239 } |
6657
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6656
diff
changeset
|
240 for (ObjectState obj : exitState.getStates()) { |
768793150bcd
more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents:
6656
diff
changeset
|
241 ObjectState initialObj = initialState.getObjectStateOptional(obj.virtual); |
6655
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
242 if (obj.isVirtual()) { |
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
243 for (int i = 0; i < obj.getEntries().length; i++) { |
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
244 ValueNode value = obj.getEntry(i); |
12649
f376a77c22fb
don't create ProxyNodes for constants during PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
12626
diff
changeset
|
245 if (!(value instanceof VirtualObjectNode || value.isConstant())) { |
8981
09cdf7224794
PEA: cleanup and documentation for recent changes
Lukas Stadler <lukas.stadler@jku.at>
parents:
8924
diff
changeset
|
246 if (exitNode.loopBegin().isPhiAtMerge(value) || initialObj == null || !initialObj.isVirtual() || initialObj.getEntry(i) != value) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
247 ProxyNode proxy = new ValueProxyNode(value, exitNode); |
6655
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
248 obj.setEntry(i, proxy); |
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
|
249 effects.addFloatingNode(proxy, "virtualProxy"); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
250 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
251 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
252 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
253 } else { |
6655
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
254 if (initialObj == null || initialObj.isVirtual()) { |
7897
a58851061377
rename ValueProxyNode to ProxyNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
7761
diff
changeset
|
255 ProxyNode proxy = proxies.get(obj.virtual); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
256 if (proxy == null) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
257 proxy = new ValueProxyNode(obj.getMaterializedValue(), exitNode); |
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
|
258 effects.addFloatingNode(proxy, "proxy"); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
259 } else { |
6655
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
260 effects.replaceFirstInput(proxy, proxy.value(), obj.getMaterializedValue()); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
261 // nothing to do - will be handled in processNode |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
262 } |
6655
b01f9c391e17
first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
6650
diff
changeset
|
263 obj.updateMaterializedValue(proxy); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
264 } else { |
8981
09cdf7224794
PEA: cleanup and documentation for recent changes
Lukas Stadler <lukas.stadler@jku.at>
parents:
8924
diff
changeset
|
265 if (initialObj.getMaterializedValue() == obj.getMaterializedValue()) { |
09cdf7224794
PEA: cleanup and documentation for recent changes
Lukas Stadler <lukas.stadler@jku.at>
parents:
8924
diff
changeset
|
266 Debug.log("materialized value changes within loop: %s vs. %s at %s", initialObj.getMaterializedValue(), obj.getMaterializedValue(), exitNode); |
09cdf7224794
PEA: cleanup and documentation for recent changes
Lukas Stadler <lukas.stadler@jku.at>
parents:
8924
diff
changeset
|
267 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
268 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
269 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
270 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
271 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
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 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
274 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
|
275 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
|
276 } |
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
|
277 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
278 protected class MergeProcessor extends EffectsClosure<BlockT>.MergeProcessor { |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
279 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
280 private final HashMap<Object, ValuePhiNode> materializedPhis = new HashMap<>(); |
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
281 private final IdentityHashMap<ValueNode, ValuePhiNode[]> valuePhis = new IdentityHashMap<>(); |
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
282 private final IdentityHashMap<ValuePhiNode, VirtualObjectNode> valueObjectVirtuals = new IdentityHashMap<>(); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
283 |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
284 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
|
285 super(mergeBlock); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
286 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
287 |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
288 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
|
289 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
|
290 if (result == null) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
291 result = new ValuePhiNode(stamp, merge); |
8924
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
292 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
|
293 } |
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 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
|
295 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
296 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
297 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
|
298 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
|
299 if (result == null) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
300 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
|
301 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
|
302 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
303 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
|
304 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
|
305 } |
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 |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 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
|
312 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
313 return result; |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
314 } |
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
315 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
316 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
317 * 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
|
318 * 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
|
319 * 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
|
320 * 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
|
321 * into the correct blocks. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
322 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
323 * @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
|
324 */ |
9944
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
325 @Override |
eef9281ec13b
pull basic algorithm of PartialEscapeAnalysisPhase into new base class EffectsPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
9877
diff
changeset
|
326 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
|
327 super.merge(states); |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
328 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
329 // 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
|
330 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
|
331 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
|
332 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
|
333 } |
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 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 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
|
341 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
|
342 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
343 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
344 // 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
|
345 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
|
346 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
|
347 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
|
348 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
|
349 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
|
350 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
|
351 virtual++; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
352 uniqueMaterializedValue = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
353 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
|
354 } 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
|
355 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
|
356 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
357 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
358 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
359 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
|
360 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
|
361 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
362 if (uniqueMaterializedValue != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
363 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
|
364 } else { |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
365 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
|
366 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
|
367 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
|
368 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
|
369 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
|
370 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
|
371 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
|
372 } |
11854
3b6a8b78233c
remove unused EscapeState.ThreadLocal
Lukas Stadler <lukas.stadler@jku.at>
parents:
11787
diff
changeset
|
373 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
|
374 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
375 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
376 } |
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 |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
378 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
|
379 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
|
380 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
|
381 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
382 } |
14610
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
383 if (materialized) { |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
384 newState.objectStates.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
385 mergeEffects.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
386 afterMergeEffects.clear(); |
aef9e4224076
refactored state cleaning in PEA MergeProcessor
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14581
diff
changeset
|
387 } |
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
|
388 } 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
|
389 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
390 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
391 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
392 * 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
|
393 * 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
|
394 * 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
|
395 * 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
|
396 * 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
|
397 * {@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
|
398 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
399 * @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
|
400 * @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
|
401 * @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
|
402 * @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
|
403 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
404 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
|
405 boolean compatible = true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
406 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
|
407 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
408 // 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
|
409 Kind[] twoSlotKinds = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
410 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
|
411 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
|
412 int valueIndex = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
413 while (valueIndex < values.length) { |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14610
diff
changeset
|
414 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
|
415 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
|
416 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
|
417 if (twoSlotKinds == null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
418 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
|
419 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
420 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
|
421 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
422 break outer; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
423 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
424 twoSlotKinds[valueIndex] = otherKind; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
425 // 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
|
426 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
427 } else { |
12626
e09959e910f7
weakened or commented out assertions that are too strict given the way Truffle makes use of Unsafe
Doug Simon <doug.simon@oracle.com>
parents:
12619
diff
changeset
|
428 assert entryKind.getStackKind() == otherKind.getStackKind() || entryKind.getBitCount() >= otherKind.getBitCount() : entryKind + " vs " + otherKind; |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
429 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
430 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
431 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
432 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
433 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
|
434 // 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 ValueNode value = objStates[i].getEntry(valueIndex); |
14633
da2431cc1506
Rename ValueNode kind() to getKind().
Josef Eisl <josef.eisl@jku.at>
parents:
14610
diff
changeset
|
440 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
|
441 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
|
442 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
|
443 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
|
444 // 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
|
445 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
|
446 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
|
447 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
448 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
449 break outer; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
450 } |
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
|
451 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
452 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
453 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
454 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
455 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
456 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
457 if (compatible) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
458 // 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
|
459 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
|
460 int valueIndex = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
461 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
|
462 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
|
463 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
|
464 if (phis[valueIndex] == null && values[valueIndex] != fields[valueIndex]) { |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
465 phis[valueIndex] = new ValuePhiNode(values[valueIndex].stamp().unrestricted(), merge); |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
466 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
467 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
468 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
|
469 // 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
|
470 valueIndex++; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
471 phis[valueIndex] = null; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
472 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
|
473 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
474 valueIndex++; |
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 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
477 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
478 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
|
479 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
|
480 if (phi != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
481 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
|
482 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
|
483 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
|
484 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
485 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
|
486 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
487 values[i] = phi; |
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 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
490 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
|
491 return materialized; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
492 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
493 // not compatible: materialize in all predecessors |
14558
fabf5447603e
Use stamp constructor in PhiNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
14160
diff
changeset
|
494 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
|
495 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
|
496 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
|
497 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
|
498 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
|
499 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
|
500 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
501 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
|
502 return true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
503 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
504 } |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
505 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
506 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
507 * 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
|
508 * virtual object. |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
509 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
510 * @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
|
511 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
512 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
|
513 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
514 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
|
515 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
|
516 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
517 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
518 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
|
519 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
|
520 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
|
521 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
|
522 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
|
523 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
|
524 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
525 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
|
526 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
527 return materialized; |
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 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
531 * 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
|
532 * object. |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
533 */ |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
534 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
|
535 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
|
536 if (!state.isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
537 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
538 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
539 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
|
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 /** |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
544 * 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
|
545 * 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
|
546 * 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
|
547 * identity if not used later on). |
14891
00b66fc77764
avoid repetitive BoxNode virtualization
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14850
diff
changeset
|
548 * |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
549 * @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
|
550 * @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
|
551 * @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
|
552 * 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
|
553 * @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
|
554 */ |
14978
e302df8bf51c
separate subclasses for value and guard phis and proxies
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14891
diff
changeset
|
555 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
|
556 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
|
557 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
|
558 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
559 // 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
|
560 int virtualInputs = 0; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
561 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
|
562 boolean uniqueVirtualObject = true; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
563 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
|
564 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
|
565 if (obj != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
566 if (obj.isVirtual()) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
567 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
|
568 uniqueVirtualObject = false; |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
569 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
570 virtualInputs++; |
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 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
574 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
|
575 if (uniqueVirtualObject) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
576 // 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
|
577 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
|
578 return false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
579 } else { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
580 // 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
|
581 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
|
582 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
|
583 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
|
584 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
|
585 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
|
586 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
|
587 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
|
588 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
|
589 compatible = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
590 break; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
591 } |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
592 } |
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
|
593 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
|
594 // 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
|
595 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
|
596 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
|
597 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
|
598 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
|
599 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
|
600 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
|
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 } |
89ff116d8956
PEA: only merge objects at phi if this phi is the only reference
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15261
diff
changeset
|
604 } |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
605 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
606 if (compatible) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
607 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
|
608 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
|
609 |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
610 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
|
611 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
|
612 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
|
613 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
|
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 } |
fc972f34c1d5
PEA: unify merge and loop logic, implement handling of identity-less virtual objects
Lukas Stadler <lukas.stadler@jku.at>
parents:
8911
diff
changeset
|
617 |
12617
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
618 // 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
|
619 boolean materialized = false; |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
620 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
|
621 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
|
622 if (obj != null) { |
bca33c3135de
PEA: support for unsafe stores of mismatching sizes, cleanup, documentation
Lukas Stadler <lukas.stadler@jku.at>
parents:
12570
diff
changeset
|
623 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
|
624 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
|
625 afterMergeEffects.initializePhiInput(phi, i, obj.getMaterializedValue()); |
8911
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
626 } |
5cf8471a4034
small PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents:
8620
diff
changeset
|
627 } |
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
|
628 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
|
629 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
630 } |
11857
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
631 |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
632 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
|
633 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
|
634 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
|
635 } |
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 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
|
637 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
|
638 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
|
639 } 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
|
640 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
|
641 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
|
642 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
643 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
|
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 |
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 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
|
648 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
|
649 aliases.set(node, virtual); |
12619
62b05f62a75c
removed redundant assertion
Doug Simon <doug.simon@oracle.com>
parents:
12617
diff
changeset
|
650 for (Node usage : node.usages()) { |
62b05f62a75c
removed redundant assertion
Doug Simon <doug.simon@oracle.com>
parents:
12617
diff
changeset
|
651 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
|
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 |
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 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
|
657 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
|
658 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
|
659 } |
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 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
|
661 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
|
662 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
|
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 } |
3aef4d88fbb9
simplify PEA block states by turning scalarAliases and objectAliases into one global NodeMap
Lukas Stadler <lukas.stadler@jku.at>
parents:
11854
diff
changeset
|
665 } |
6650
ea38da80dd29
refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff
changeset
|
666 } |