annotate graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java @ 7123:b914b9b4c578

graal.graph refactorings Common out NodeInputsIterable and NodeSuccessorsIterable Remove NodeUsagesList.size, use .count instead Change return type of Node.usages to NodeIterable<Node>
author Gilles Duboscq <duboscq@ssw.jku.at>
date Mon, 03 Dec 2012 13:53:53 +0100
parents 1d5f1237902f
children 94f032472c28
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 static com.oracle.graal.virtual.phases.ea.PartialEscapeAnalysisPhase.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
26
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
27 import java.util.*;
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
28 import java.util.concurrent.*;
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
29 import java.util.concurrent.atomic.*;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
30
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
31 import com.oracle.graal.api.meta.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
32 import com.oracle.graal.debug.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
33 import com.oracle.graal.graph.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
34 import com.oracle.graal.nodes.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
35 import com.oracle.graal.nodes.PhiNode.PhiType;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
36 import com.oracle.graal.nodes.VirtualState.NodeClosure;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
37 import com.oracle.graal.nodes.cfg.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
38 import com.oracle.graal.nodes.spi.*;
7006
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
39 import com.oracle.graal.nodes.spi.EscapeAnalyzable.ObjectDesc;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
40 import com.oracle.graal.nodes.virtual.*;
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
41 import com.oracle.graal.phases.*;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
42 import com.oracle.graal.phases.graph.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
43 import com.oracle.graal.phases.graph.ReentrantBlockIterator.BlockIteratorClosure;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
44 import com.oracle.graal.phases.graph.ReentrantBlockIterator.LoopInfo;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
45 import com.oracle.graal.phases.schedule.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
46 import com.oracle.graal.virtual.nodes.*;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
47
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
48 class PartialEscapeClosure extends BlockIteratorClosure<BlockState> {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
49
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
50 public static final ConcurrentHashMap<Class<? extends Node>, AtomicLong> materializeReasons = new ConcurrentHashMap<>();
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
51
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
52 static {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
53 if (GraalOptions.EscapeAnalysisHistogram) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
54 Runtime.getRuntime().addShutdownHook(new Thread() {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
55 @Override
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
56 public void run() {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
57 for (Map.Entry<Class<? extends Node>, AtomicLong> entry : materializeReasons.entrySet()) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
58 System.out.println(entry.getKey() + ": " + entry.getValue());
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
59 }
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
60 }
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
61 });
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
62 }
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
63 }
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
64
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
65 private static final DebugMetric metricAllocationRemoved = Debug.metric("AllocationRemoved ");
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
66
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
67 private final NodeBitMap usages;
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
68 private final SchedulePhase schedule;
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
69
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
70 private final GraphEffectList effects = new GraphEffectList();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
71 private final HashSet<VirtualObjectNode> reusedVirtualObjects = new HashSet<>();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
72 private int virtualIds = 0;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
73
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
74 private final VirtualizerToolImpl tool;
7007
94596bbec6f0 provide MetaAccessProvider to EscapeAnalyzable
Lukas Stadler <lukas.stadler@jku.at>
parents: 7006
diff changeset
75 private final MetaAccessProvider metaAccess;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
76
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
77 public PartialEscapeClosure(NodeBitMap usages, SchedulePhase schedule, MetaAccessProvider metaAccess) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
78 this.usages = usages;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
79 this.schedule = schedule;
7007
94596bbec6f0 provide MetaAccessProvider to EscapeAnalyzable
Lukas Stadler <lukas.stadler@jku.at>
parents: 7006
diff changeset
80 this.metaAccess = metaAccess;
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
81 tool = new VirtualizerToolImpl(effects, usages, metaAccess);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
82 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
83
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
84 public GraphEffectList getEffects() {
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
85 return effects;
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
86 }
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
87
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
88 public int getVirtualIdCount() {
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
89 return virtualIds;
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
90 }
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
91
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
92 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
93 protected void processBlock(Block block, BlockState state) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
94 trace("\nBlock: %s (", block);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
95 List<ScheduledNode> nodeList = schedule.getBlockToNodesMap().get(block);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
96
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
97 FixedWithNextNode lastFixedNode = null;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
98 for (Node node : nodeList) {
7006
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
99 ObjectDesc[] newAllocations = null;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
100 if (node instanceof EscapeAnalyzable) {
7007
94596bbec6f0 provide MetaAccessProvider to EscapeAnalyzable
Lukas Stadler <lukas.stadler@jku.at>
parents: 7006
diff changeset
101 newAllocations = ((EscapeAnalyzable) node).getAllocations(virtualIds, metaAccess);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
102 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
103
7006
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
104 if (newAllocations != null) {
7009
867a02e8c610 small fix to multi-allocation PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 7007
diff changeset
105 trace("{{%s}} ", node);
7006
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
106 for (ObjectDesc desc : newAllocations) {
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
107 VirtualObjectNode virtualObject = desc.virtualObject;
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
108 if (virtualObject.isAlive()) {
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
109 reusedVirtualObjects.add(virtualObject);
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
110 state.addAndMarkAlias(virtualObject, virtualObject, usages);
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
111 } else {
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
112 effects.addFloatingNode(virtualObject);
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
113 }
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
114 ValueNode[] fieldState = desc.entryState;
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
115 for (int i = 0; i < fieldState.length; i++) {
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
116 fieldState[i] = state.getScalarAlias(fieldState[i]);
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
117 }
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
118 state.addObject(virtualObject, new ObjectState(virtualObject, fieldState, desc.lockCount));
7010
1d5f1237902f more small fixes to PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 7009
diff changeset
119 state.addAndMarkAlias(virtualObject, virtualObject, usages);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
120 }
7009
867a02e8c610 small fix to multi-allocation PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 7007
diff changeset
121 state.addAndMarkAlias(newAllocations[0].virtualObject, (ValueNode) node, usages);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
122 effects.deleteFixedNode((FixedWithNextNode) node);
7006
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
123 metricAllocationRemoved.add(newAllocations.length);
51b6e594b0cd refactor EscapeAnalyzeable (remove EscapeOp)
Lukas Stadler <lukas.stadler@jku.at>
parents: 6710
diff changeset
124 virtualIds += newAllocations.length;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
125 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
126 if (usages.isMarked(node)) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
127 trace("[[%s]] ", node);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
128 processNode((ValueNode) node, lastFixedNode == null ? null : lastFixedNode.next(), state);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
129 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
130 trace("%s ", node);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
131 }
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
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
134 if (node instanceof FixedWithNextNode && node.isAlive()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
135 lastFixedNode = (FixedWithNextNode) node;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
136 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
137 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
138 trace(")\n end state: %s\n", state);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
139 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
140
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
141
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
142 private void processNode(final ValueNode node, FixedNode insertBefore, final BlockState state) {
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
143 tool.reset(state, node);
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
144 if (node instanceof Virtualizable) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
145 ((Virtualizable) node).virtualize(tool);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
146 }
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
147 if (tool.isDeleted()) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
148 return;
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
149 }
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
150 if (node instanceof StateSplit) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
151 StateSplit split = (StateSplit) node;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
152 FrameState stateAfter = split.stateAfter();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
153 if (stateAfter != null) {
7123
b914b9b4c578 graal.graph refactorings
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 7010
diff changeset
154 if (stateAfter.usages().count() > 1) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
155 stateAfter = (FrameState) stateAfter.copyWithInputs();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
156 split.setStateAfter(stateAfter);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
157 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
158 final HashSet<ObjectState> virtual = new HashSet<>();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
159 stateAfter.applyToNonVirtual(new NodeClosure<ValueNode>() {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
160
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
161 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
162 public void apply(Node usage, ValueNode value) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
163 ObjectState valueObj = state.getObjectState(value);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
164 if (valueObj != null) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
165 virtual.add(valueObj);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
166 effects.replaceFirstInput(usage, value, valueObj.virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
167 } else if (value instanceof VirtualObjectNode) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
168 ObjectState virtualObj = null;
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
169 for (ObjectState obj : state.getStates()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
170 if (value == obj.virtual) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
171 virtualObj = obj;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
172 break;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
173 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
174 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
175 if (virtualObj != null) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
176 virtual.add(virtualObj);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
177 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
178 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
179 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
180 });
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
181 for (ObjectState obj : state.getStates()) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
182 if (obj.isVirtual() && obj.getLockCount() > 0) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
183 virtual.add(obj);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
184 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
185 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
186
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
187 ArrayDeque<ObjectState> queue = new ArrayDeque<>(virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
188 while (!queue.isEmpty()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
189 ObjectState obj = queue.removeLast();
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
190 if (obj.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
191 for (ValueNode field : obj.getEntries()) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
192 ObjectState fieldObj = state.getObjectState(field);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
193 if (fieldObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
194 if (fieldObj.isVirtual() && !virtual.contains(fieldObj)) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
195 virtual.add(fieldObj);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
196 queue.addLast(fieldObj);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
197 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
198 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
199 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
200 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
201 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
202 for (ObjectState obj : virtual) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
203 EscapeObjectState v;
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
204 if (obj.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
205 ValueNode[] fieldState = obj.getEntries().clone();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
206 for (int i = 0; i < fieldState.length; i++) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
207 ObjectState valueObj = state.getObjectState(fieldState[i]);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
208 if (valueObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
209 if (valueObj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
210 fieldState[i] = valueObj.virtual;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
211 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
212 fieldState[i] = valueObj.getMaterializedValue();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
213 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
214 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
215 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
216 v = new VirtualObjectState(obj.virtual, fieldState);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
217 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
218 v = new MaterializedObjectState(obj.virtual, obj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
219 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
220 effects.addVirtualMapping(stateAfter, v, reusedVirtualObjects);
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 }
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
223 }
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
224 if (tool.isCustomAction()) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
225 return;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
226 }
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
227 for (ValueNode input : node.inputs().filter(ValueNode.class)) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
228 ObjectState obj = state.getObjectState(input);
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
229 if (obj != null) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
230 trace("replacing input %s at %s: %s", input, node, obj);
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
231 if (GraalOptions.EscapeAnalysisHistogram && obj.isVirtual()) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
232 AtomicLong counter = materializeReasons.get(node.getClass());
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
233 if (counter == null) {
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
234 counter = new AtomicLong();
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
235 materializeReasons.put(node.getClass(), counter);
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
236 }
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
237 counter.incrementAndGet();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
238 }
6710
6db6881c1270 add Virtualizable and VirtualizerTool, refactor PEA to use it
Lukas Stadler <lukas.stadler@jku.at>
parents: 6666
diff changeset
239 replaceWithMaterialized(input, node, insertBefore, state, obj);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
240 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
241 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
242 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
243
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
244 private void ensureMaterialized(BlockState state, ObjectState obj, FixedNode materializeBefore) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
245 assert obj != null;
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
246 if (obj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
247 state.materializeBefore(materializeBefore, obj.virtual, effects);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
248 }
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
249 assert !obj.isVirtual();
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 private void replaceWithMaterialized(ValueNode value, Node usage, FixedNode materializeBefore, BlockState state, ObjectState obj) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
253 ensureMaterialized(state, obj, materializeBefore);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
254 effects.replaceFirstInput(usage, value, obj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
255 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
256
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
257 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
258 protected BlockState merge(MergeNode merge, List<BlockState> states) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
259
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
260 BlockState newState = BlockState.meetAliases(states);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
261
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
262 // Iterative processing:
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
263 // Merging the materialized/virtual state of virtual objects can lead to new materializations, which can
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
264 // lead to new materializations because of phis, and so on.
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
265
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
266 boolean materialized;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
267 do {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
268 materialized = false;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
269 // use a hash set to make the values distinct...
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
270 for (VirtualObjectNode object : newState.getVirtualObjects()) {
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
271 ObjectState resultState = newState.getObjectStateOptional(object);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
272 if (resultState == null || resultState.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
273 int virtual = 0;
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
274 ObjectState startObj = states.get(0).getObjectState(object);
6656
5bb9511a6764 first part of PEA refactoring, fixes
Lukas Stadler <lukas.stadler@jku.at>
parents: 6655
diff changeset
275 int lockCount = startObj.getLockCount();
6666
49cd16dfb10c fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 6665
diff changeset
276 boolean locksMatch = true;
6656
5bb9511a6764 first part of PEA refactoring, fixes
Lukas Stadler <lukas.stadler@jku.at>
parents: 6655
diff changeset
277 ValueNode singleValue = startObj.isVirtual() ? null : startObj.getMaterializedValue();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
278 for (BlockState state : states) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
279 ObjectState obj = state.getObjectState(object);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
280 if (obj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
281 virtual++;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
282 singleValue = null;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
283 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
284 if (obj.getMaterializedValue() != singleValue) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
285 singleValue = null;
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 }
6666
49cd16dfb10c fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 6665
diff changeset
288 locksMatch &= obj.getLockCount() == lockCount;
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
289 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
290
6666
49cd16dfb10c fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 6665
diff changeset
291 assert virtual < states.size() || locksMatch : "mismatching lock counts at " + merge;
49cd16dfb10c fix lock-related assertion in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 6665
diff changeset
292
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
293 if (virtual < states.size()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
294 if (singleValue == null) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
295 PhiNode materializedValuePhi = new PhiNode(Kind.Object, merge);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
296 effects.addFloatingNode(materializedValuePhi);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
297 for (int i = 0; i < states.size(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
298 BlockState state = states.get(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
299 ObjectState obj = state.getObjectState(object);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
300 materialized |= obj.isVirtual();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
301 ensureMaterialized(state, obj, merge.forwardEndAt(i));
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
302 effects.addPhiInput(materializedValuePhi, obj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
303 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
304 newState.addObject(object, new ObjectState(object, materializedValuePhi, lockCount));
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
305 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
306 newState.addObject(object, new ObjectState(object, singleValue, lockCount));
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
307 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
308 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
309 assert virtual == states.size();
6656
5bb9511a6764 first part of PEA refactoring, fixes
Lukas Stadler <lukas.stadler@jku.at>
parents: 6655
diff changeset
310 ValueNode[] values = startObj.getEntries().clone();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
311 PhiNode[] phis = new PhiNode[values.length];
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
312 int mismatch = 0;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
313 for (int i = 1; i < states.size(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
314 BlockState state = states.get(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
315 ValueNode[] fields = state.getObjectState(object).getEntries();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
316 for (int index = 0; index < values.length; index++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
317 if (phis[index] == null && values[index] != fields[index]) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
318 mismatch++;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
319 phis[index] = new PhiNode(values[index].kind(), merge);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
320 effects.addFloatingNode(phis[index]);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
321 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
322 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
323 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
324 if (mismatch > 0) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
325 for (int i = 0; i < states.size(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
326 BlockState state = states.get(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
327 ValueNode[] fields = state.getObjectState(object).getEntries();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
328 for (int index = 0; index < values.length; index++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
329 if (phis[index] != null) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
330 ObjectState obj = state.getObjectState(fields[index]);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
331 if (obj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
332 materialized |= obj.isVirtual();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
333 ensureMaterialized(state, obj, merge.forwardEndAt(i));
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
334 fields[index] = obj.getMaterializedValue();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
335 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
336 effects.addPhiInput(phis[index], fields[index]);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
337 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
338 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
339 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
340 for (int index = 0; index < values.length; index++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
341 if (phis[index] != null) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
342 values[index] = phis[index];
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
343 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
344 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
345 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
346 newState.addObject(object, new ObjectState(object, values, lockCount));
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
347 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
348 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
349 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
350
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
351 for (PhiNode phi : merge.phis().snapshot()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
352 if (usages.isMarked(phi) && phi.type() == PhiType.Value) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
353 materialized |= processPhi(newState, merge, phi, states);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
354 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
355 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
356 } while (materialized);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
357
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
358 return newState;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
359 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
360
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
361 private boolean processPhi(BlockState newState, MergeNode merge, PhiNode phi, List<BlockState> states) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
362 assert states.size() == phi.valueCount();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
363 int virtualInputs = 0;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
364 boolean materialized = false;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
365 VirtualObjectNode sameObject = null;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
366 ResolvedJavaType sameType = null;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
367 int sameEntryCount = -1;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
368 for (int i = 0; i < phi.valueCount(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
369 ValueNode value = phi.valueAt(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
370 ObjectState obj = states.get(i).getObjectState(value);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
371 if (obj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
372 if (obj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
373 virtualInputs++;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
374 if (i == 0) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
375 sameObject = obj.virtual;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
376 sameType = obj.virtual.type();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
377 sameEntryCount = obj.virtual.entryCount();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
378 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
379 if (sameObject != obj.virtual) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
380 sameObject = null;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
381 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
382 if (sameType != obj.virtual.type()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
383 sameType = null;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
384 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
385 if (sameEntryCount != obj.virtual.entryCount()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
386 sameEntryCount = -1;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
387 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
388 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
389 } else {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
390 effects.setPhiInput(phi, i, obj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
391 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
392 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
393 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
394 boolean materialize = false;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
395 if (virtualInputs == 0) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
396 // nothing to do...
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
397 } else if (virtualInputs == phi.valueCount()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
398 if (sameObject != null) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
399 newState.addAndMarkAlias(sameObject, phi, usages);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
400 } else if (sameType != null && sameEntryCount != -1) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
401 materialize = true;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
402 // throw new GraalInternalError("merge required for %s", sameType);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
403 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
404 materialize = true;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
405 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
406 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
407 materialize = true;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
408 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
409
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
410 if (materialize) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
411 for (int i = 0; i < phi.valueCount(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
412 ValueNode value = phi.valueAt(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
413 ObjectState obj = states.get(i).getObjectState(value);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
414 if (obj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
415 materialized |= obj.isVirtual();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
416 replaceWithMaterialized(value, phi, merge.forwardEndAt(i), states.get(i), obj);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
417 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
418 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
419 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
420 return materialized;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
421 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
422
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
423 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
424 protected BlockState afterSplit(FixedNode node, BlockState oldState) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
425 return oldState.cloneState();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
426 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
427
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
428 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
429 protected List<BlockState> processLoop(Loop loop, BlockState initialState) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
430 GraphEffectList successEffects = new GraphEffectList();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
431 HashSet<PhiDesc> phis = new HashSet<>();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
432 for (int iteration = 0; iteration < 10; iteration++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
433 BlockState state = initialState.cloneState();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
434 int checkpoint = effects.checkpoint();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
435
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
436 for (PhiDesc desc : phis) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
437 ObjectState obj = state.getObjectState(desc.virtualObject);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
438 if (obj.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
439 ValueNode value = obj.getEntry(desc.fieldIndex);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
440 ObjectState valueObj = state.getObjectState(value);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
441 if (valueObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
442 assert !valueObj.isVirtual();
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
443 value = valueObj.getMaterializedValue();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
444 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
445
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
446 PhiNode phiNode = new PhiNode(value.kind(), loop.loopBegin());
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
447 effects.addFloatingNode(phiNode);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
448 effects.addPhiInput(phiNode, value);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
449 obj.setEntry(desc.fieldIndex, phiNode);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
450 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
451 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
452
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
453 for (PhiNode phi : loop.loopBegin().phis()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
454 if (usages.isMarked(phi) && phi.type() == PhiType.Value) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
455 ObjectState initialObj = initialState.getObjectState(phi.valueAt(0));
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
456 if (initialObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
457 if (initialObj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
458 state.addAndMarkAlias(initialObj.virtual, phi, usages);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
459 } else {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
460 successEffects.setPhiInput(phi, 0, initialObj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
461 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
462 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
463 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
464 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
465
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
466 effects.incLevel();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
467 LoopInfo<BlockState> info = ReentrantBlockIterator.processLoop(this, loop, state.cloneState());
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
468
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
469 List<BlockState> loopEndStates = info.endStates;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
470 List<Block> predecessors = loop.header.getPredecessors();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
471 HashSet<VirtualObjectNode> additionalMaterializations = new HashSet<>();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
472 int oldPhiCount = phis.size();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
473 for (int i = 1; i < predecessors.size(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
474 processLoopEnd(loop.loopBegin(), (LoopEndNode) predecessors.get(i).getEndNode(), state, loopEndStates.get(i - 1), successEffects, additionalMaterializations, phis);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
475 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
476 if (additionalMaterializations.isEmpty() && oldPhiCount == phis.size()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
477 effects.addAll(successEffects);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
478
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
479 assert info.exitStates.size() == loop.exits.size();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
480 for (int i = 0; i < loop.exits.size(); i++) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
481 BlockState exitState = info.exitStates.get(i);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
482 assert exitState != null : "no loop exit state at " + loop.exits.get(i) + " / " + loop.header;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
483 processLoopExit((LoopExitNode) loop.exits.get(i).getBeginNode(), state, exitState);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
484 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
485
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
486 effects.decLevel();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
487 return info.exitStates;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
488 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
489 successEffects.clear();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
490 effects.backtrack(checkpoint);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
491 effects.decLevel();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
492 for (VirtualObjectNode virtualObject : additionalMaterializations) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
493 ObjectState obj = initialState.getObjectState(virtualObject);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
494 if (obj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
495 initialState.materializeBefore(loop.loopBegin().forwardEnd(), virtualObject, effects);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
496 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
497 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
498 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
499 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
500
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
501 throw new GraalInternalError("too many iterations at %s", loop);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
502 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
503
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
504 private void processLoopExit(LoopExitNode exitNode, BlockState initialState, BlockState exitState) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
505 HashMap<VirtualObjectNode, ValueProxyNode> proxies = new HashMap<>();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
506
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
507 for (ValueProxyNode proxy : exitNode.proxies()) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
508 ObjectState obj = exitState.getObjectState(proxy.value());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
509 if (obj != null) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
510 proxies.put(obj.virtual, proxy);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
511 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
512 }
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
513 for (ObjectState obj : exitState.getStates()) {
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
514 ObjectState initialObj = initialState.getObjectStateOptional(obj.virtual);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
515 if (obj.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
516 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
517 ValueNode value = obj.getEntry(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
518 ObjectState valueObj = exitState.getObjectState(value);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
519 if (valueObj == null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
520 if ((value instanceof PhiNode && ((PhiNode) value).merge() == exitNode.loopBegin()) || initialObj == null || !initialObj.isVirtual() || initialObj.getEntry(i) != value) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
521 ValueProxyNode proxy = new ValueProxyNode(value, exitNode, PhiType.Value);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
522 obj.setEntry(i, proxy);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
523 effects.addFloatingNode(proxy);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
524 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
525 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
526 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
527 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
528 if (initialObj == null || initialObj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
529 ValueProxyNode proxy = proxies.get(obj.virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
530 if (proxy == null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
531 proxy = new ValueProxyNode(obj.getMaterializedValue(), exitNode, PhiType.Value);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
532 effects.addFloatingNode(proxy);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
533 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
534 effects.replaceFirstInput(proxy, proxy.value(), obj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
535 // nothing to do - will be handled in processNode
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
536 }
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
537 obj.updateMaterializedValue(proxy);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
538 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
539 assert initialObj.getMaterializedValue() == obj.getMaterializedValue() : "materialized value is not allowed to change within loops: " + initialObj.getMaterializedValue() +
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
540 " vs. " + obj.getMaterializedValue();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
541 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
542 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
543 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
544 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
545
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
546 private final class PhiDesc {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
547
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
548 public final VirtualObjectNode virtualObject;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
549 public final int fieldIndex;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
550
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
551 public PhiDesc(VirtualObjectNode virtualObject, int fieldIndex) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
552 this.virtualObject = virtualObject;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
553 this.fieldIndex = fieldIndex;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
554 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
555
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
556 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
557 public int hashCode() {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
558 final int prime = 31;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
559 int result = fieldIndex;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
560 result = prime * result + ((virtualObject == null) ? 0 : virtualObject.hashCode());
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
561 return result;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
562 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
563
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
564 @Override
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
565 public boolean equals(Object obj) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
566 if (this == obj) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
567 return true;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
568 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
569 if (obj == null || getClass() != obj.getClass()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
570 return false;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
571 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
572 PhiDesc other = (PhiDesc) obj;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
573 return virtualObject == other.virtualObject && fieldIndex == other.fieldIndex;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
574 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
575 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
576
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
577 private void processLoopEnd(LoopBeginNode loopBegin, LoopEndNode loopEnd, BlockState initialState, BlockState loopEndState, GraphEffectList successEffects,
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
578 Set<VirtualObjectNode> additionalMaterializations, HashSet<PhiDesc> phis) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
579 assert loopEnd.loopBegin() == loopBegin;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
580 boolean materialized;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
581 do {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
582 materialized = false;
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
583 for (ObjectState state : initialState.getStates()) {
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
584 ObjectState endState = loopEndState.getObjectState(state.virtual);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
585 if (state.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
586 if (endState.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
587 assert state.getEntries().length == endState.getEntries().length;
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
588 for (int i = 0; endState.isVirtual() && i < state.getEntries().length; i++) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
589 ValueNode value = state.getEntry(i);
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
590 ValueNode endValue = endState.getEntry(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
591 ObjectState valueObj = initialState.getObjectState(value);
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
592 ObjectState endValueObj = loopEndState.getObjectState(endValue);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
593
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
594 if (valueObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
595 if (valueObj.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
596 if (endValueObj == null || !endValueObj.isVirtual() || valueObj.virtual != endValueObj.virtual) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
597 additionalMaterializations.add(valueObj.virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
598 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
599 // endValue is also virtual and refers to the same virtual object, so we're
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
600 // good.
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
601 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
602 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
603 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
604 if (value instanceof PhiNode && ((PhiNode) value).merge() == loopBegin) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
605 if (endValueObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
606 if (endValueObj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
607 loopEndState.materializeBefore(loopEnd, endValueObj.virtual, successEffects);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
608 materialized = true;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
609 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
610 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
611 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
612 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
613 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
614 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
615 additionalMaterializations.add(state.virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
616 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
617 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
618 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
619 for (PhiNode phi : loopBegin.phis().snapshot()) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
620 if (usages.isMarked(phi) && phi.type() == PhiType.Value) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
621 ObjectState initialObj = initialState.getObjectState(phi.valueAt(0));
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
622 boolean initialMaterialized = initialObj == null || !initialObj.isVirtual();
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
623
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
624 ObjectState loopEndObj = loopEndState.getObjectState(phi.valueAt(loopEnd));
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
625 if (loopEndObj == null || !loopEndObj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
626 if (loopEndObj != null) {
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
627 successEffects.setPhiInput(phi, loopBegin.phiPredecessorIndex(loopEnd), loopEndObj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
628 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
629 if (!initialMaterialized) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
630 additionalMaterializations.add(initialObj.virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
631 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
632 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
633 if (initialMaterialized) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
634 loopEndState.materializeBefore(loopEnd, loopEndObj.virtual, successEffects);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
635 materialized = true;
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
636 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
637 if (loopEndObj.virtual != initialObj.virtual) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
638 additionalMaterializations.add(initialObj.virtual);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
639 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
640 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
641 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
642 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
643 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
644 } while (materialized);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
645
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
646 for (ObjectState state : initialState.getStates()) {
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
647 ObjectState endState = loopEndState.getObjectState(state.virtual);
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
648 if (state.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
649 if (endState.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
650 assert state.getEntries().length == endState.getEntries().length;
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
651 for (int i = 0; i < state.getEntries().length; i++) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
652 ValueNode value = state.getEntry(i);
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
653 ValueNode endValue = endState.getEntry(i);
6657
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
654 ObjectState valueObj = initialState.getObjectState(value);
768793150bcd more PEA refactoring, multiple iterations
Lukas Stadler <lukas.stadler@jku.at>
parents: 6656
diff changeset
655 ObjectState endValueObj = loopEndState.getObjectState(endValue);
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
656
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
657 if (valueObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
658 if (valueObj.isVirtual()) {
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
659 if (endValueObj == null || !endValueObj.isVirtual() || valueObj.virtual != endValueObj.virtual) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
660 assert !additionalMaterializations.isEmpty();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
661 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
662 // endValue is also virtual and refers to the same virtual object, so we're
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
663 // good.
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
664 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
665 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
666 if ((endValueObj != null && endValueObj.getMaterializedValue() != valueObj.getMaterializedValue()) || (endValueObj == null && valueObj.getMaterializedValue() != endValue)) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
667 phis.add(new PhiDesc(state.virtual, i));
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
668 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
669 // either endValue has the same materialized value as value or endValue is the
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
670 // same as the materialized value, so we're good.
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
671 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
672 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
673 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
674 if (value instanceof PhiNode && ((PhiNode) value).merge() == loopBegin) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
675 if (endValueObj != null) {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
676 if (endValueObj.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
677 assert !additionalMaterializations.isEmpty();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
678 }
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
679 successEffects.addPhiInput((PhiNode) value, endValueObj.getMaterializedValue());
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
680 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
681 successEffects.addPhiInput((PhiNode) value, endValue);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
682 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
683 } else if (value != endValue) {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
684 phis.add(new PhiDesc(state.virtual, i));
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
685 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
686 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
687 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
688 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
689 // endState.materializedValue != null
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
690 assert !additionalMaterializations.isEmpty();
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
691 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
692 } else {
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
693 // state.materializedValue != null
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
694 if (endState.isVirtual()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
695 // throw new GraalInternalError("un-materialized object state at %s", loopEnd);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
696 } else {
6655
b01f9c391e17 first part of PEA refactoring
Lukas Stadler <lukas.stadler@jku.at>
parents: 6650
diff changeset
697 if (state.getMaterializedValue() != endState.getMaterializedValue()) {
6650
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
698 // throw new GraalInternalError("changed materialized value during loop: %s vs %s",
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
699 // state.materializedValue, endState.materializedValue);
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
700 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
701 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
702 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
703 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
704 }
ea38da80dd29 refactor PEA into separate classes
Lukas Stadler <lukas.stadler@jku.at>
parents:
diff changeset
705 }