src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopTransformations.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.loop.phases/src/org/graalvm/compiler/loop/phases

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopTransformations.java

Print this page




  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.loop.phases;
  24 
  25 import static org.graalvm.compiler.core.common.GraalOptions.MaximumDesiredSize;
  26 
  27 import java.util.ArrayList;
  28 import java.util.Iterator;
  29 import java.util.List;
  30 
  31 import org.graalvm.compiler.graph.Graph.Mark;
  32 import org.graalvm.compiler.common.RetryableBailoutException;
  33 import org.graalvm.compiler.graph.Position;
  34 import org.graalvm.compiler.loop.LoopEx;
  35 import org.graalvm.compiler.loop.LoopFragmentWhole;
  36 import org.graalvm.compiler.nodeinfo.InputType;
  37 import org.graalvm.compiler.nodes.AbstractBeginNode;
  38 import org.graalvm.compiler.nodes.BeginNode;
  39 import org.graalvm.compiler.nodes.ControlSplitNode;
  40 import org.graalvm.compiler.nodes.IfNode;
  41 import org.graalvm.compiler.nodes.LoopBeginNode;
  42 import org.graalvm.compiler.nodes.StructuredGraph;
  43 import org.graalvm.compiler.nodes.ValueNode;
  44 import org.graalvm.compiler.nodes.extended.SwitchNode;
  45 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
  46 import org.graalvm.compiler.phases.tiers.PhaseContext;
  47 
  48 public abstract class LoopTransformations {
  49 
  50     private LoopTransformations() {
  51         // does not need to be instantiated
  52     }
  53 
  54     public static void peel(LoopEx loop) {
  55         loop.inside().duplicate().insertBefore(loop);
  56         loop.loopBegin().setLoopFrequency(Math.max(0.0, loop.loopBegin().loopFrequency() - 1));
  57     }
  58 
  59     public static void fullUnroll(LoopEx loop, PhaseContext context, CanonicalizerPhase canonicalizer) {
  60         // assert loop.isCounted(); //TODO (gd) strenghten : counted with known trip count
  61         LoopBeginNode loopBegin = loop.loopBegin();
  62         StructuredGraph graph = loopBegin.graph();
  63         int initialNodeCount = graph.getNodeCount();
  64         while (!loopBegin.isDeleted()) {
  65             Mark mark = graph.getMark();
  66             peel(loop);
  67             canonicalizer.applyIncremental(graph, context, mark);
  68             loop.invalidateFragments();
  69             if (graph.getNodeCount() > initialNodeCount + MaximumDesiredSize.getValue() * 2) {
  70                 throw new RetryableBailoutException("FullUnroll : Graph seems to grow out of proportion");
  71             }
  72         }
  73     }
  74 
  75     public static void unswitch(LoopEx loop, List<ControlSplitNode> controlSplitNodeSet) {
  76         ControlSplitNode firstNode = controlSplitNodeSet.iterator().next();
  77         LoopFragmentWhole originalLoop = loop.whole();
  78         StructuredGraph graph = firstNode.graph();
  79 
  80         loop.loopBegin().incrementUnswitches();
  81 
  82         // create new control split out of loop
  83         ControlSplitNode newControlSplit = (ControlSplitNode) firstNode.copyWithInputs();
  84         originalLoop.entryPoint().replaceAtPredecessor(newControlSplit);
  85 
  86         /*
  87          * The code below assumes that all of the control split nodes have the same successor
  88          * structure, which should have been enforced by findUnswitchable.
  89          */




  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.loop.phases;
  24 
  25 import static org.graalvm.compiler.core.common.GraalOptions.MaximumDesiredSize;
  26 
  27 import java.util.ArrayList;
  28 import java.util.Iterator;
  29 import java.util.List;
  30 
  31 import org.graalvm.compiler.graph.Graph.Mark;
  32 import org.graalvm.compiler.core.common.RetryableBailoutException;
  33 import org.graalvm.compiler.graph.Position;
  34 import org.graalvm.compiler.loop.LoopEx;
  35 import org.graalvm.compiler.loop.LoopFragmentWhole;
  36 import org.graalvm.compiler.nodeinfo.InputType;
  37 import org.graalvm.compiler.nodes.AbstractBeginNode;
  38 import org.graalvm.compiler.nodes.BeginNode;
  39 import org.graalvm.compiler.nodes.ControlSplitNode;
  40 import org.graalvm.compiler.nodes.IfNode;
  41 import org.graalvm.compiler.nodes.LoopBeginNode;
  42 import org.graalvm.compiler.nodes.StructuredGraph;
  43 import org.graalvm.compiler.nodes.ValueNode;
  44 import org.graalvm.compiler.nodes.extended.SwitchNode;
  45 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
  46 import org.graalvm.compiler.phases.tiers.PhaseContext;
  47 
  48 public abstract class LoopTransformations {
  49 
  50     private LoopTransformations() {
  51         // does not need to be instantiated
  52     }
  53 
  54     public static void peel(LoopEx loop) {
  55         loop.inside().duplicate().insertBefore(loop);
  56         loop.loopBegin().setLoopFrequency(Math.max(0.0, loop.loopBegin().loopFrequency() - 1));
  57     }
  58 
  59     public static void fullUnroll(LoopEx loop, PhaseContext context, CanonicalizerPhase canonicalizer) {
  60         // assert loop.isCounted(); //TODO (gd) strenghten : counted with known trip count
  61         LoopBeginNode loopBegin = loop.loopBegin();
  62         StructuredGraph graph = loopBegin.graph();
  63         int initialNodeCount = graph.getNodeCount();
  64         while (!loopBegin.isDeleted()) {
  65             Mark mark = graph.getMark();
  66             peel(loop);
  67             canonicalizer.applyIncremental(graph, context, mark);
  68             loop.invalidateFragments();
  69             if (graph.getNodeCount() > initialNodeCount + MaximumDesiredSize.getValue(graph.getOptions()) * 2) {
  70                 throw new RetryableBailoutException("FullUnroll : Graph seems to grow out of proportion");
  71             }
  72         }
  73     }
  74 
  75     public static void unswitch(LoopEx loop, List<ControlSplitNode> controlSplitNodeSet) {
  76         ControlSplitNode firstNode = controlSplitNodeSet.iterator().next();
  77         LoopFragmentWhole originalLoop = loop.whole();
  78         StructuredGraph graph = firstNode.graph();
  79 
  80         loop.loopBegin().incrementUnswitches();
  81 
  82         // create new control split out of loop
  83         ControlSplitNode newControlSplit = (ControlSplitNode) firstNode.copyWithInputs();
  84         originalLoop.entryPoint().replaceAtPredecessor(newControlSplit);
  85 
  86         /*
  87          * The code below assumes that all of the control split nodes have the same successor
  88          * structure, which should have been enforced by findUnswitchable.
  89          */


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