changeset 19622:0e90dbf0b9fd

Add merge boolean property to ExplodeLoop annotation to indicate that backward branches should be merged if possible.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 27 Feb 2015 14:06:36 +0100
parents 34e984e9560e
children 490f2c54c28a
files graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/BytecodeInterpreterPartialEvaluationTest.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/ExplodeLoop.java
diffstat 5 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Fri Feb 27 14:02:15 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Fri Feb 27 14:06:36 2015 +0100
@@ -203,6 +203,7 @@
 
             private FixedWithNextNode lastInstr;                 // the last instruction added
             private final boolean explodeLoops;
+            private final boolean mergeExplosions;
             private Stack<ExplodedLoopContext> explodeLoopsContext;
             private int nextPeelIteration = 1;
             private boolean controlFlowSplit;
@@ -230,8 +231,14 @@
                 LoopExplosionPlugin loopExplosionPlugin = graphBuilderConfig.getLoopExplosionPlugin();
                 if (loopExplosionPlugin != null) {
                     explodeLoops = loopExplosionPlugin.shouldExplodeLoops(method);
+                    if (explodeLoops) {
+                        mergeExplosions = loopExplosionPlugin.shouldMergeExplosions(method);
+                    } else {
+                        mergeExplosions = false;
+                    }
                 } else {
                     explodeLoops = false;
+                    mergeExplosions = false;
                 }
             }
 
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java	Fri Feb 27 14:02:15 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java	Fri Feb 27 14:06:36 2015 +0100
@@ -73,6 +73,8 @@
 
     public interface LoopExplosionPlugin extends GraphBuilderPlugin {
         boolean shouldExplodeLoops(ResolvedJavaMethod method);
+
+        boolean shouldMergeExplosions(ResolvedJavaMethod method);
     }
 
     public interface ParameterPlugin extends GraphBuilderPlugin {
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/BytecodeInterpreterPartialEvaluationTest.java	Fri Feb 27 14:02:15 2015 +0100
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/BytecodeInterpreterPartialEvaluationTest.java	Fri Feb 27 14:06:36 2015 +0100
@@ -41,15 +41,11 @@
 
     public static class Program extends RootNode {
         @CompilationFinal final byte[] bytecodes;
-        private final int maxStack;
-        private final int maxLocals;
         @CompilationFinal private final FrameSlot[] locals;
         @CompilationFinal private final FrameSlot[] stack;
 
         public Program(byte[] bytecodes, int maxLocals, int maxStack) {
             this.bytecodes = bytecodes;
-            this.maxLocals = maxLocals;
-            this.maxStack = maxStack;
             locals = new FrameSlot[maxLocals];
             stack = new FrameSlot[maxStack];
             for (int i = 0; i < maxLocals; ++i) {
@@ -80,7 +76,7 @@
         }
 
         @Override
-        @ExplodeLoop
+        @ExplodeLoop(merge = true)
         public Object execute(VirtualFrame frame) {
             int topOfStack = -1;
             int bci = 0;
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Fri Feb 27 14:02:15 2015 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Fri Feb 27 14:06:36 2015 +0100
@@ -238,6 +238,14 @@
             return method.getAnnotation(ExplodeLoop.class) != null;
         }
 
+        public boolean shouldMergeExplosions(ResolvedJavaMethod method) {
+            ExplodeLoop explodeLoop = method.getAnnotation(ExplodeLoop.class);
+            if (explodeLoop != null) {
+                return explodeLoop.merge();
+            }
+            return false;
+        }
+
     }
 
     @SuppressWarnings("unused")
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/ExplodeLoop.java	Fri Feb 27 14:02:15 2015 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/ExplodeLoop.java	Fri Feb 27 14:06:36 2015 +0100
@@ -33,4 +33,5 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
 public @interface ExplodeLoop {
+    boolean merge() default false;
 }