52 import org.graalvm.compiler.nodes.StartNode;
53 import org.graalvm.compiler.nodes.StructuredGraph;
54 import org.graalvm.compiler.nodes.ValueNodeUtil;
55 import org.graalvm.compiler.nodes.calc.FloatingNode;
56 import org.graalvm.compiler.nodes.cfg.Block;
57 import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
58 import org.graalvm.compiler.nodes.cfg.HIRLoop;
59 import org.graalvm.compiler.nodes.memory.FloatableAccessNode;
60 import org.graalvm.compiler.nodes.memory.FloatingAccessNode;
61 import org.graalvm.compiler.nodes.memory.FloatingReadNode;
62 import org.graalvm.compiler.nodes.memory.MemoryAccess;
63 import org.graalvm.compiler.nodes.memory.MemoryAnchorNode;
64 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
65 import org.graalvm.compiler.nodes.memory.MemoryMap;
66 import org.graalvm.compiler.nodes.memory.MemoryMapNode;
67 import org.graalvm.compiler.nodes.memory.MemoryNode;
68 import org.graalvm.compiler.nodes.memory.MemoryPhiNode;
69 import org.graalvm.compiler.nodes.memory.ReadNode;
70 import org.graalvm.compiler.nodes.util.GraphUtil;
71 import org.graalvm.compiler.phases.Phase;
72 import org.graalvm.compiler.phases.common.util.HashSetNodeEventListener;
73 import org.graalvm.compiler.phases.graph.ReentrantNodeIterator;
74 import org.graalvm.compiler.phases.graph.ReentrantNodeIterator.LoopInfo;
75 import org.graalvm.compiler.phases.graph.ReentrantNodeIterator.NodeIteratorClosure;
76 import jdk.internal.vm.compiler.word.LocationIdentity;
77
78 public class FloatingReadPhase extends Phase {
79
80 private boolean createFloatingReads;
81 private boolean createMemoryMapNodes;
82
83 public static class MemoryMapImpl implements MemoryMap {
84
85 private final EconomicMap<LocationIdentity, MemoryNode> lastMemorySnapshot;
86
87 public MemoryMapImpl(MemoryMapImpl memoryMap) {
88 lastMemorySnapshot = EconomicMap.create(Equivalence.DEFAULT, memoryMap.lastMemorySnapshot);
89 }
90
91 public MemoryMapImpl(StartNode start) {
92 this();
204 }
205 }
206
207 modifiedInLoops.put(loopBegin, result);
208 return result;
209 }
210
211 @Override
212 @SuppressWarnings("try")
213 protected void run(StructuredGraph graph) {
214 EconomicMap<LoopBeginNode, EconomicSet<LocationIdentity>> modifiedInLoops = null;
215 if (graph.hasLoops()) {
216 modifiedInLoops = EconomicMap.create(Equivalence.IDENTITY);
217 ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false);
218 for (Loop<?> l : cfg.getLoops()) {
219 HIRLoop loop = (HIRLoop) l;
220 processLoop(loop, modifiedInLoops);
221 }
222 }
223
224 HashSetNodeEventListener listener = new HashSetNodeEventListener(EnumSet.of(NODE_ADDED, ZERO_USAGES));
225 try (NodeEventScope nes = graph.trackNodeEvents(listener)) {
226 ReentrantNodeIterator.apply(new FloatingReadClosure(modifiedInLoops, createFloatingReads, createMemoryMapNodes), graph.start(), new MemoryMapImpl(graph.start()));
227 }
228
229 for (Node n : removeExternallyUsedNodes(listener.getNodes())) {
230 if (n.isAlive() && n instanceof FloatingNode) {
231 n.replaceAtUsages(null);
232 GraphUtil.killWithUnusedFloatingInputs(n);
233 }
234 }
235 if (createFloatingReads) {
236 assert !graph.isAfterFloatingReadPhase();
237 graph.setAfterFloatingReadPhase(true);
238 }
239 }
240
241 public static MemoryMapImpl mergeMemoryMaps(AbstractMergeNode merge, List<? extends MemoryMap> states) {
242 MemoryMapImpl newState = new MemoryMapImpl();
243
244 EconomicSet<LocationIdentity> keys = EconomicSet.create(Equivalence.DEFAULT);
|
52 import org.graalvm.compiler.nodes.StartNode;
53 import org.graalvm.compiler.nodes.StructuredGraph;
54 import org.graalvm.compiler.nodes.ValueNodeUtil;
55 import org.graalvm.compiler.nodes.calc.FloatingNode;
56 import org.graalvm.compiler.nodes.cfg.Block;
57 import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
58 import org.graalvm.compiler.nodes.cfg.HIRLoop;
59 import org.graalvm.compiler.nodes.memory.FloatableAccessNode;
60 import org.graalvm.compiler.nodes.memory.FloatingAccessNode;
61 import org.graalvm.compiler.nodes.memory.FloatingReadNode;
62 import org.graalvm.compiler.nodes.memory.MemoryAccess;
63 import org.graalvm.compiler.nodes.memory.MemoryAnchorNode;
64 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
65 import org.graalvm.compiler.nodes.memory.MemoryMap;
66 import org.graalvm.compiler.nodes.memory.MemoryMapNode;
67 import org.graalvm.compiler.nodes.memory.MemoryNode;
68 import org.graalvm.compiler.nodes.memory.MemoryPhiNode;
69 import org.graalvm.compiler.nodes.memory.ReadNode;
70 import org.graalvm.compiler.nodes.util.GraphUtil;
71 import org.graalvm.compiler.phases.Phase;
72 import org.graalvm.compiler.phases.common.util.EconomicSetNodeEventListener;
73 import org.graalvm.compiler.phases.graph.ReentrantNodeIterator;
74 import org.graalvm.compiler.phases.graph.ReentrantNodeIterator.LoopInfo;
75 import org.graalvm.compiler.phases.graph.ReentrantNodeIterator.NodeIteratorClosure;
76 import jdk.internal.vm.compiler.word.LocationIdentity;
77
78 public class FloatingReadPhase extends Phase {
79
80 private boolean createFloatingReads;
81 private boolean createMemoryMapNodes;
82
83 public static class MemoryMapImpl implements MemoryMap {
84
85 private final EconomicMap<LocationIdentity, MemoryNode> lastMemorySnapshot;
86
87 public MemoryMapImpl(MemoryMapImpl memoryMap) {
88 lastMemorySnapshot = EconomicMap.create(Equivalence.DEFAULT, memoryMap.lastMemorySnapshot);
89 }
90
91 public MemoryMapImpl(StartNode start) {
92 this();
204 }
205 }
206
207 modifiedInLoops.put(loopBegin, result);
208 return result;
209 }
210
211 @Override
212 @SuppressWarnings("try")
213 protected void run(StructuredGraph graph) {
214 EconomicMap<LoopBeginNode, EconomicSet<LocationIdentity>> modifiedInLoops = null;
215 if (graph.hasLoops()) {
216 modifiedInLoops = EconomicMap.create(Equivalence.IDENTITY);
217 ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false);
218 for (Loop<?> l : cfg.getLoops()) {
219 HIRLoop loop = (HIRLoop) l;
220 processLoop(loop, modifiedInLoops);
221 }
222 }
223
224 EconomicSetNodeEventListener listener = new EconomicSetNodeEventListener(EnumSet.of(NODE_ADDED, ZERO_USAGES));
225 try (NodeEventScope nes = graph.trackNodeEvents(listener)) {
226 ReentrantNodeIterator.apply(new FloatingReadClosure(modifiedInLoops, createFloatingReads, createMemoryMapNodes), graph.start(), new MemoryMapImpl(graph.start()));
227 }
228
229 for (Node n : removeExternallyUsedNodes(listener.getNodes())) {
230 if (n.isAlive() && n instanceof FloatingNode) {
231 n.replaceAtUsages(null);
232 GraphUtil.killWithUnusedFloatingInputs(n);
233 }
234 }
235 if (createFloatingReads) {
236 assert !graph.isAfterFloatingReadPhase();
237 graph.setAfterFloatingReadPhase(true);
238 }
239 }
240
241 public static MemoryMapImpl mergeMemoryMaps(AbstractMergeNode merge, List<? extends MemoryMap> states) {
242 MemoryMapImpl newState = new MemoryMapImpl();
243
244 EconomicSet<LocationIdentity> keys = EconomicSet.create(Equivalence.DEFAULT);
|