# HG changeset patch # User Lukas Stadler # Date 1389798537 -3600 # Node ID 056d9d7dc0614e3ea180f19eef2f3babac380f68 # Parent 08f58bfde0dd33eb502fd4b300da0e7ffc95b1d3 expose memory map merging functionality in FloatingReadPhase diff -r 08f58bfde0dd -r 056d9d7dc061 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java Wed Jan 15 16:07:01 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryMapNode.java Wed Jan 15 16:08:57 2014 +0100 @@ -22,6 +22,8 @@ */ package com.oracle.graal.nodes; +import java.util.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; @@ -34,4 +36,6 @@ } public abstract MemoryNode getLastLocationAccess(LocationIdentity locationIdentity); + + public abstract Set getLocations(); } diff -r 08f58bfde0dd -r 056d9d7dc061 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Wed Jan 15 16:07:01 2014 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Wed Jan 15 16:08:57 2014 +0100 @@ -84,6 +84,7 @@ return false; } + @Override public Set getLocations() { return lastMemorySnapshot.keySet(); } @@ -111,6 +112,46 @@ } } + public static MemoryMapImpl mergeMemoryMaps(MergeNode merge, List states) { + MemoryMapImpl newState = new MemoryMapImpl(); + + Set keys = new HashSet<>(); + for (MemoryMapNode other : states) { + keys.addAll(other.getLocations()); + } + assert !keys.contains(FINAL_LOCATION); + + for (LocationIdentity key : keys) { + int mergedStatesCount = 0; + boolean isPhi = false; + MemoryNode merged = null; + for (MemoryMapNode state : states) { + MemoryNode last = state.getLastLocationAccess(key); + if (isPhi) { + merged.asMemoryPhi().addInput(ValueNodeUtil.asNode(last)); + } else { + if (merged == last) { + // nothing to do + } else if (merged == null) { + merged = last; + } else { + MemoryPhiNode phi = merge.graph().addWithoutUnique(new MemoryPhiNode(merge, key)); + for (int j = 0; j < mergedStatesCount; j++) { + phi.addInput(ValueNodeUtil.asNode(merged)); + } + phi.addInput(ValueNodeUtil.asNode(last)); + merged = phi; + isPhi = true; + } + } + mergedStatesCount++; + } + newState.lastMemorySnapshot.put(key, merged); + } + return newState; + + } + private static class CollectMemoryCheckpointsClosure extends NodeIteratorClosure> { private final Map> modifiedInLoops; @@ -238,42 +279,7 @@ @Override protected MemoryMapImpl merge(MergeNode merge, List states) { - MemoryMapImpl newState = new MemoryMapImpl(); - - Set keys = new HashSet<>(); - for (MemoryMapImpl other : states) { - keys.addAll(other.lastMemorySnapshot.keySet()); - } - assert !keys.contains(FINAL_LOCATION); - - for (LocationIdentity key : keys) { - int mergedStatesCount = 0; - boolean isPhi = false; - MemoryNode merged = null; - for (MemoryMapImpl state : states) { - MemoryNode last = state.getLastLocationAccess(key); - if (isPhi) { - merged.asMemoryPhi().addInput(ValueNodeUtil.asNode(last)); - } else { - if (merged == last) { - // nothing to do - } else if (merged == null) { - merged = last; - } else { - MemoryPhiNode phi = merge.graph().addWithoutUnique(new MemoryPhiNode(merge, key)); - for (int j = 0; j < mergedStatesCount; j++) { - phi.addInput(ValueNodeUtil.asNode(merged)); - } - phi.addInput(ValueNodeUtil.asNode(last)); - merged = phi; - isPhi = true; - } - } - mergedStatesCount++; - } - newState.lastMemorySnapshot.put(key, merged); - } - return newState; + return mergeMemoryMaps(merge, states); } @Override diff -r 08f58bfde0dd -r 056d9d7dc061 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Wed Jan 15 16:07:01 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Wed Jan 15 16:08:57 2014 +0100 @@ -720,7 +720,7 @@ /** * Nodes that inherit the {@link DeoptimizingNode#getDeoptimizationState()} from the replacee - * during insantiation. + * during instantiation. */ private final ArrayList deoptNodes; @@ -876,7 +876,7 @@ // MemoryCheckPoint inside the snippet graph MemoryNode lastAccess = mmap.getLastLocationAccess(identity); - assert lastAccess != null : "no mapping found for lowerable node " + oldNode + ". (No node in the snippet kill the same location as the lowerable node?)"; + assert lastAccess != null : "no mapping found for lowerable node " + oldNode + ". (No node in the snippet kills the same location as the lowerable node?)"; if (usage instanceof MemoryAccess) { MemoryAccess access = (MemoryAccess) usage; if (access.getLastLocationAccess() == oldNode) { @@ -961,6 +961,11 @@ return (MemoryNode) duplicates.get(ValueNodeUtil.asNode(lastLocationAccess)); } } + + @Override + public Set getLocations() { + return memoryMap.getLocations(); + } } /**