src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java

Print this page




   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.phases.schedule;
  24 








  25 import org.graalvm.compiler.core.common.GraalOptions;
  26 import org.graalvm.compiler.core.common.SuppressFBWarnings;
  27 import org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph;
  28 import org.graalvm.compiler.core.common.cfg.BlockMap;
  29 import org.graalvm.compiler.debug.Assertions;
  30 import org.graalvm.compiler.debug.Debug;
  31 import org.graalvm.compiler.graph.Graph.NodeEvent;
  32 import org.graalvm.compiler.graph.Graph.NodeEventListener;
  33 import org.graalvm.compiler.graph.Graph.NodeEventScope;
  34 import org.graalvm.compiler.graph.Node;
  35 import org.graalvm.compiler.graph.NodeBitMap;
  36 import org.graalvm.compiler.graph.NodeMap;
  37 import org.graalvm.compiler.graph.NodeStack;
  38 import org.graalvm.compiler.nodes.AbstractBeginNode;
  39 import org.graalvm.compiler.nodes.AbstractEndNode;
  40 import org.graalvm.compiler.nodes.AbstractMergeNode;
  41 import org.graalvm.compiler.nodes.ControlSinkNode;
  42 import org.graalvm.compiler.nodes.ControlSplitNode;
  43 import org.graalvm.compiler.nodes.DeoptimizeNode;
  44 import org.graalvm.compiler.nodes.FixedNode;
  45 import org.graalvm.compiler.nodes.FixedWithNextNode;
  46 import org.graalvm.compiler.nodes.GuardNode;
  47 import org.graalvm.compiler.nodes.IfNode;
  48 import org.graalvm.compiler.nodes.KillingBeginNode;
  49 import org.graalvm.compiler.nodes.LoopBeginNode;
  50 import org.graalvm.compiler.nodes.LoopExitNode;


  52 import org.graalvm.compiler.nodes.ProxyNode;
  53 import org.graalvm.compiler.nodes.StartNode;
  54 import org.graalvm.compiler.nodes.StructuredGraph;
  55 import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
  56 import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult;
  57 import org.graalvm.compiler.nodes.ValueNode;
  58 import org.graalvm.compiler.nodes.VirtualState;
  59 import org.graalvm.compiler.nodes.calc.ConvertNode;
  60 import org.graalvm.compiler.nodes.calc.IsNullNode;
  61 import org.graalvm.compiler.nodes.cfg.Block;
  62 import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
  63 import org.graalvm.compiler.nodes.cfg.HIRLoop;
  64 import org.graalvm.compiler.nodes.cfg.LocationSet;
  65 import org.graalvm.compiler.nodes.memory.FloatingReadNode;
  66 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
  67 import org.graalvm.compiler.nodes.spi.ValueProxy;
  68 import org.graalvm.compiler.options.OptionValues;
  69 import org.graalvm.compiler.phases.Phase;
  70 import org.graalvm.word.LocationIdentity;
  71 
  72 import java.util.ArrayList;
  73 import java.util.Arrays;
  74 import java.util.Formatter;
  75 import java.util.List;
  76 
  77 import static org.graalvm.compiler.core.common.GraalOptions.OptScheduleOutOfLoops;
  78 import static org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph.strictlyDominates;
  79 
  80 public final class SchedulePhase extends Phase {
  81 
  82     public enum SchedulingStrategy {
  83         EARLIEST,
  84         LATEST,
  85         LATEST_OUT_OF_LOOPS,
  86         FINAL_SCHEDULE
  87     }
  88 
  89     private final SchedulingStrategy selectedStrategy;
  90 
  91     private final boolean immutableGraph;
  92 
  93     public SchedulePhase(OptionValues options) {
  94         this(false, options);
  95     }
  96 
  97     public SchedulePhase(boolean immutableGraph, OptionValues options) {
  98         this(OptScheduleOutOfLoops.getValue(options) ? SchedulingStrategy.LATEST_OUT_OF_LOOPS : SchedulingStrategy.LATEST, immutableGraph);
  99     }


 997         }
 998 
 999         private static void printNode(Node n) {
1000             Formatter buf = new Formatter();
1001             buf.format("%s", n);
1002             if (n instanceof MemoryCheckpoint.Single) {
1003                 buf.format(" // kills %s", ((MemoryCheckpoint.Single) n).getLocationIdentity());
1004             } else if (n instanceof MemoryCheckpoint.Multi) {
1005                 buf.format(" // kills ");
1006                 for (LocationIdentity locid : ((MemoryCheckpoint.Multi) n).getLocationIdentities()) {
1007                     buf.format("%s, ", locid);
1008                 }
1009             } else if (n instanceof FloatingReadNode) {
1010                 FloatingReadNode frn = (FloatingReadNode) n;
1011                 buf.format(" // from %s", frn.getLocationIdentity());
1012                 buf.format(", lastAccess: %s", frn.getLastLocationAccess());
1013                 buf.format(", address: %s", frn.getAddress());
1014             } else if (n instanceof GuardNode) {
1015                 buf.format(", anchor: %s", ((GuardNode) n).getAnchor());
1016             }
1017             Debug.log("%s", buf);
1018         }
1019 
1020         public ControlFlowGraph getCFG() {
1021             return cfg;
1022         }
1023 
1024         /**
1025          * Gets the nodes in a given block.
1026          */
1027         public List<Node> nodesFor(Block block) {
1028             return blockToNodesMap.get(block);
1029         }
1030     }
1031 
1032 }


   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.phases.schedule;
  24 
  25 import static org.graalvm.compiler.core.common.GraalOptions.OptScheduleOutOfLoops;
  26 import static org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph.strictlyDominates;
  27 
  28 import java.util.ArrayList;
  29 import java.util.Arrays;
  30 import java.util.Formatter;
  31 import java.util.List;
  32 
  33 import org.graalvm.compiler.core.common.GraalOptions;
  34 import org.graalvm.compiler.core.common.SuppressFBWarnings;
  35 import org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph;
  36 import org.graalvm.compiler.core.common.cfg.BlockMap;
  37 import org.graalvm.compiler.debug.Assertions;

  38 import org.graalvm.compiler.graph.Graph.NodeEvent;
  39 import org.graalvm.compiler.graph.Graph.NodeEventListener;
  40 import org.graalvm.compiler.graph.Graph.NodeEventScope;
  41 import org.graalvm.compiler.graph.Node;
  42 import org.graalvm.compiler.graph.NodeBitMap;
  43 import org.graalvm.compiler.graph.NodeMap;
  44 import org.graalvm.compiler.graph.NodeStack;
  45 import org.graalvm.compiler.nodes.AbstractBeginNode;
  46 import org.graalvm.compiler.nodes.AbstractEndNode;
  47 import org.graalvm.compiler.nodes.AbstractMergeNode;
  48 import org.graalvm.compiler.nodes.ControlSinkNode;
  49 import org.graalvm.compiler.nodes.ControlSplitNode;
  50 import org.graalvm.compiler.nodes.DeoptimizeNode;
  51 import org.graalvm.compiler.nodes.FixedNode;
  52 import org.graalvm.compiler.nodes.FixedWithNextNode;
  53 import org.graalvm.compiler.nodes.GuardNode;
  54 import org.graalvm.compiler.nodes.IfNode;
  55 import org.graalvm.compiler.nodes.KillingBeginNode;
  56 import org.graalvm.compiler.nodes.LoopBeginNode;
  57 import org.graalvm.compiler.nodes.LoopExitNode;


  59 import org.graalvm.compiler.nodes.ProxyNode;
  60 import org.graalvm.compiler.nodes.StartNode;
  61 import org.graalvm.compiler.nodes.StructuredGraph;
  62 import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
  63 import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult;
  64 import org.graalvm.compiler.nodes.ValueNode;
  65 import org.graalvm.compiler.nodes.VirtualState;
  66 import org.graalvm.compiler.nodes.calc.ConvertNode;
  67 import org.graalvm.compiler.nodes.calc.IsNullNode;
  68 import org.graalvm.compiler.nodes.cfg.Block;
  69 import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
  70 import org.graalvm.compiler.nodes.cfg.HIRLoop;
  71 import org.graalvm.compiler.nodes.cfg.LocationSet;
  72 import org.graalvm.compiler.nodes.memory.FloatingReadNode;
  73 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
  74 import org.graalvm.compiler.nodes.spi.ValueProxy;
  75 import org.graalvm.compiler.options.OptionValues;
  76 import org.graalvm.compiler.phases.Phase;
  77 import org.graalvm.word.LocationIdentity;
  78 








  79 public final class SchedulePhase extends Phase {
  80 
  81     public enum SchedulingStrategy {
  82         EARLIEST,
  83         LATEST,
  84         LATEST_OUT_OF_LOOPS,
  85         FINAL_SCHEDULE
  86     }
  87 
  88     private final SchedulingStrategy selectedStrategy;
  89 
  90     private final boolean immutableGraph;
  91 
  92     public SchedulePhase(OptionValues options) {
  93         this(false, options);
  94     }
  95 
  96     public SchedulePhase(boolean immutableGraph, OptionValues options) {
  97         this(OptScheduleOutOfLoops.getValue(options) ? SchedulingStrategy.LATEST_OUT_OF_LOOPS : SchedulingStrategy.LATEST, immutableGraph);
  98     }


 996         }
 997 
 998         private static void printNode(Node n) {
 999             Formatter buf = new Formatter();
1000             buf.format("%s", n);
1001             if (n instanceof MemoryCheckpoint.Single) {
1002                 buf.format(" // kills %s", ((MemoryCheckpoint.Single) n).getLocationIdentity());
1003             } else if (n instanceof MemoryCheckpoint.Multi) {
1004                 buf.format(" // kills ");
1005                 for (LocationIdentity locid : ((MemoryCheckpoint.Multi) n).getLocationIdentities()) {
1006                     buf.format("%s, ", locid);
1007                 }
1008             } else if (n instanceof FloatingReadNode) {
1009                 FloatingReadNode frn = (FloatingReadNode) n;
1010                 buf.format(" // from %s", frn.getLocationIdentity());
1011                 buf.format(", lastAccess: %s", frn.getLastLocationAccess());
1012                 buf.format(", address: %s", frn.getAddress());
1013             } else if (n instanceof GuardNode) {
1014                 buf.format(", anchor: %s", ((GuardNode) n).getAnchor());
1015             }
1016             n.getDebug().log("%s", buf);
1017         }
1018 
1019         public ControlFlowGraph getCFG() {
1020             return cfg;
1021         }
1022 
1023         /**
1024          * Gets the nodes in a given block.
1025          */
1026         public List<Node> nodesFor(Block block) {
1027             return blockToNodesMap.get(block);
1028         }
1029     }
1030 
1031 }
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File