hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/LoopBeginNode.java
--- 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.