< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/FloatingReadPhase.java

Print this page
rev 52509 : [mq]: graal


  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);


< prev index next >