hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java
changeset 46640 70bdce04c59b
parent 46344 694c102fd8ed
child 46762 f7defa99f173
--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java	Fri Jul 07 10:37:52 2017 +0200
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java	Fri Jul 07 09:40:47 2017 -0700
@@ -43,9 +43,20 @@
 
     public static final NodeClass<LoopBeginNode> TYPE = NodeClass.create(LoopBeginNode.class);
     protected double loopFrequency;
+    protected double loopOrigFrequency;
     protected int nextEndIndex;
     protected int unswitches;
+    protected int splits;
     protected int inversionCount;
+    protected LoopType loopType;
+    protected int unrollFactor;
+
+    public enum LoopType {
+        SIMPLE_LOOP,
+        PRE_LOOP,
+        MAIN_LOOP,
+        POST_LOOP
+    }
 
     /** See {@link LoopEndNode#canSafepoint} for more information. */
     boolean canEndsSafepoint;
@@ -55,7 +66,51 @@
     public LoopBeginNode() {
         super(TYPE);
         loopFrequency = 1;
+        loopOrigFrequency = 1;
+        unswitches = 0;
+        splits = 0;
         this.canEndsSafepoint = true;
+        loopType = LoopType.SIMPLE_LOOP;
+        unrollFactor = 1;
+    }
+
+    public boolean isSimpleLoop() {
+        return (loopType == LoopType.SIMPLE_LOOP);
+    }
+
+    public void setPreLoop() {
+        assert isSimpleLoop();
+        loopType = LoopType.PRE_LOOP;
+    }
+
+    public boolean isPreLoop() {
+        return (loopType == LoopType.PRE_LOOP);
+    }
+
+    public void setMainLoop() {
+        assert isSimpleLoop();
+        loopType = LoopType.MAIN_LOOP;
+    }
+
+    public boolean isMainLoop() {
+        return (loopType == LoopType.MAIN_LOOP);
+    }
+
+    public void setPostLoop() {
+        assert isSimpleLoop();
+        loopType = LoopType.POST_LOOP;
+    }
+
+    public boolean isPostLoop() {
+        return (loopType == LoopType.POST_LOOP);
+    }
+
+    public int getUnrollFactor() {
+        return unrollFactor;
+    }
+
+    public void setUnrollFactor(int currentUnrollFactor) {
+        unrollFactor = currentUnrollFactor;
     }
 
     /** Disables safepoint for the whole loop, i.e., for all {@link LoopEndNode loop ends}. */
@@ -68,6 +123,15 @@
         }
     }
 
+    public double loopOrigFrequency() {
+        return loopOrigFrequency;
+    }
+
+    public void setLoopOrigFrequency(double loopOrigFrequency) {
+        assert loopOrigFrequency >= 0;
+        this.loopOrigFrequency = loopOrigFrequency;
+    }
+
     public double loopFrequency() {
         return loopFrequency;
     }
@@ -122,11 +186,23 @@
         return result;
     }
 
+    public boolean isSingleEntryLoop() {
+        return (forwardEndCount() == 1);
+    }
+
     public AbstractEndNode forwardEnd() {
         assert forwardEndCount() == 1;
         return forwardEndAt(0);
     }
 
+    public int splits() {
+        return splits;
+    }
+
+    public void incrementSplits() {
+        splits++;
+    }
+
     @Override
     public void generate(NodeLIRBuilderTool gen) {
         // Nothing to emit, since this is node is used for structural purposes only.