You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2017/01/26 05:30:57 UTC

[23/50] groovy git commit: GROOVY-8019: allow better optimization for nested loops with unoptimzable parents

GROOVY-8019: allow better optimization for nested loops with unoptimzable parents


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/07994e13
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/07994e13
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/07994e13

Branch: refs/heads/GROOVY_2_4_X
Commit: 07994e13f28fb3e06435e8d995d8953e49fb9464
Parents: 6c41085
Author: Jochen Theodorou <bl...@gmx.org>
Authored: Sun Dec 11 11:31:49 2016 +0100
Committer: Jochen Theodorou <bl...@gmx.org>
Committed: Sun Dec 11 11:33:20 2016 +0100

----------------------------------------------------------------------
 .../classgen/asm/OptimizingStatementWriter.java | 16 +++--
 .../classgen/asm/MethodPatternsTest.groovy      | 64 ++++++++++++++++++++
 2 files changed, 75 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/07994e13/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java b/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
index 17a9810..0efbcfd 100644
--- a/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
+++ b/src/main/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
@@ -269,18 +269,18 @@ public class OptimizingStatementWriter extends StatementWriter {
 
     @Override
     public void writeIfElse(IfStatement statement) {
-        if (controller.isFastPath()) {
+        StatementMeta meta = statement.getNodeMetaData(StatementMeta.class);
+        FastPathData fastPathData = writeGuards(meta, statement);
+
+        if (fastPathData==null) {
             super.writeIfElse(statement);
         } else {
-            StatementMeta meta = (StatementMeta) statement.getNodeMetaData(StatementMeta.class);
-            FastPathData fastPathData = writeGuards(meta, statement);
-
             boolean oldFastPathBlock = fastPathBlocked;
             fastPathBlocked = true;
             super.writeIfElse(statement);
             fastPathBlocked = oldFastPathBlock;
 
-            if (fastPathData==null) return;
+            if (fastPathData == null) return;
             writeFastPathPrelude(fastPathData);
             super.writeIfElse(statement);
             writeFastPathEpilogue(fastPathData);
@@ -769,6 +769,12 @@ public class OptimizingStatementWriter extends StatementWriter {
             opt.pop(opt.shouldOptimize());
         }
 
+        /*@Override
+        public void visitConstantExpression(ConstantExpression expression) {
+            super.visitConstantExpression(expression);
+            opt.chainShouldOptimize(true);
+        }*/
+
         @Override
         public void visitStaticMethodCallExpression(StaticMethodCallExpression expression) {
             if (expression.getNodeMetaData(StatementMeta.class)!=null) return;

http://git-wip-us.apache.org/repos/asf/groovy/blob/07994e13/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy
index 6443f8b..ababe1b 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/MethodPatternsTest.groovy
@@ -24,6 +24,70 @@ import static org.codehaus.groovy.control.CompilerConfiguration.DEFAULT as confi
  */
 class MethodPatternsTest extends AbstractBytecodeTestCase {
 
+    void testUnoptimizedIfWithNestedOptimizedLoop(){
+        if (config.optimizationOptions.indy) return;
+        // in this example the if block contains statements that will not be optimized
+        // but we still want to optimize the for loops, which can.
+        // The test will check there is a optimized bytecode sequence for the loops.
+        assert compile('''
+
+            long sum = 0;
+            double m = 1;
+
+            if( true ) {
+
+                System.err.println( "START");
+                long t0 = System.currentTimeMillis();
+
+                for( int j=0; j<1000; j++ ) {
+                    for( int i=0; i<100_000; i++ ) {
+                       sum = sum + i;
+                       m = m*i;
+                    }
+                }
+
+                long t1 = System.currentTimeMillis();
+                System.err.println( "END - " + (t1-t0)+"ms");
+            }
+
+            System.err.println( "Done: "+sum+" "+m );
+        ''').hasSequence([
+                // for (int j=0; j<1000; j++) start and condition
+                'ICONST_0',
+                'SIPUSH 1000',
+                'IF_ICMPGE',
+                'ICONST_1',
+                // for (int i=0; i<100_000; i++) start and condition
+                'ICONST_0',
+                'LDC 100000',
+                'IF_ICMPGE',
+                'ICONST_1',
+                'GOTO',
+                'ICONST_0',
+                'IFEQ',
+                // sum = sum + i
+                'LLOAD',
+                'ILOAD',
+                'I2L',
+                'LADD',
+                // m = m * i
+                'DLOAD',
+                'ILOAD',
+                'I2D',
+                'DMUL',
+                // for (int i=0; i<100_000; i++) increment
+                'ILOAD',
+                'ICONST_1',
+                'IADD',
+                'ISTORE',
+                // for (int j=0; j<1000; j++) increment
+                'ILOAD',
+                'ICONST_1',
+                'IADD',
+                'ISTORE'
+        ])
+    }
+
     // make a test for native compilation of the ackerman function
     // and ensure the nested call is optimized
     void testAckerman() {