changeset 6309:6f8b6fc03c96

Add a maximum number of unswitching per loop Enable Loop unswitching
author Gilles Duboscq <duboscq@ssw.jku.at>
date Mon, 03 Sep 2012 15:12:28 +0200
parents 1bb742086acd
children b2b0ec1a6a39
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopPolicies.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java
diffstat 4 files changed, 14 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java	Mon Sep 03 12:52:41 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalOptions.java	Mon Sep 03 15:12:28 2012 +0200
@@ -106,10 +106,11 @@
     public static boolean LoopPeeling                        = true;
     public static boolean ReassociateInvariants              = true;
     public static boolean FullUnroll                         = true;
-    public static boolean LoopUnswitch                       = ____;
+    public static boolean LoopUnswitch                       = true;
     public static int     FullUnrollMaxNodes                 = 150;
     public static int     ExactFullUnrollMaxNodes            = 600;
     public static float   MinimumPeelProbability             = 0.35f;
+    public static int     LoopMaxUnswitch                    = 3;
     public static int     LoopUnswitchMaxIncrease            = 50;
     public static int     LoopUnswitchUncertaintyBoost       = 5;
 
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopPolicies.java	Mon Sep 03 12:52:41 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopPolicies.java	Mon Sep 03 15:12:28 2012 +0200
@@ -52,9 +52,8 @@
         return size * exactTrips <= maxNodes;
     }
 
-    public static boolean shouldTryUnswitch(@SuppressWarnings("unused") LoopEx loop) {
-        // TODO (gd) maybe there should be a max number of unswitching per loop
-        return true;
+    public static boolean shouldTryUnswitch(LoopEx loop) {
+        return loop.loopBegin().unswitches() <= GraalOptions.LoopMaxUnswitch;
     }
 
     public static boolean shouldUnswitch(LoopEx loop, IfNode ifNode) {
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java	Mon Sep 03 12:52:41 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java	Mon Sep 03 15:12:28 2012 +0200
@@ -94,6 +94,7 @@
 
     public static void unswitch(LoopEx loop, IfNode ifNode) {
         // duplicate will be true case, original will be false case
+        loop.loopBegin().incUnswitches();
         LoopFragmentWhole originalLoop = loop.whole();
         LoopFragmentWhole duplicateLoop = originalLoop.duplicate();
         StructuredGraph graph = (StructuredGraph) ifNode.graph();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Mon Sep 03 12:52:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Mon Sep 03 15:12:28 2012 +0200
@@ -34,6 +34,7 @@
 public class LoopBeginNode extends MergeNode implements Node.IterableNodeType, LIRLowerable {
     private double loopFrequency;
     private int nextEndIndex;
+    private int unswitches;
 
     public LoopBeginNode() {
         loopFrequency = 1;
@@ -144,6 +145,14 @@
         return nextEndIndex++;
     }
 
+    public int unswitches() {
+        return unswitches;
+    }
+
+    public void incUnswitches() {
+        unswitches++;
+    }
+
     @Override
     public void simplify(SimplifierTool tool) {
         // nothing yet