Author: [email protected]
Date: Thu Jun 11 15:21:46 2009
New Revision: 5546

Added:
     
trunk/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimizePrecompile.java    
(contents, props changed)
Modified:
    trunk/dev/core/src/com/google/gwt/dev/Compiler.java
    trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java
    trunk/dev/core/src/com/google/gwt/dev/Precompile.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java

Log:
Conditionally optimize precompile based on entry point.

This change yields a net savings in the Compiler command line entry point by
doing more optimization in the precompile phase.  The Precompile entry point
will continue to do minimal optimization.  In additional, -draftCompile will
prevent the optimization loop that happened during the precompile as well.

Review by: spoon

Modified: trunk/dev/core/src/com/google/gwt/dev/Compiler.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/Compiler.java (original)
+++ trunk/dev/core/src/com/google/gwt/dev/Compiler.java Thu Jun 11 15:21:46  
2009
@@ -188,6 +188,8 @@
            TreeLogger branch = logger.branch(TreeLogger.INFO,
                "Compiling module " + moduleName);

+          // Optimize early since permutation compiles will run in process.
+          options.setOptimizePrecompile(true);
            Precompilation precompilation = Precompile.precompile(branch,
                options, module, options.getGenDir(), compilerWorkDir,
                options.getDumpSignatureFile());

Modified: trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java      (original)
+++ trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java      Thu Jun 11  
15:21:46 2009
@@ -181,6 +181,8 @@
            logger = logger.branch(TreeLogger.INFO, "Compiling module "
                + moduleName);

+          // Optimize early since permutation compiles will run in process.
+          options.setOptimizePrecompile(true);
            Precompilation precompilation = Precompile.precompile(logger,
                options, module, options.getGenDir(), compilerWorkDir,
                options.getDumpSignatureFile());

Modified: trunk/dev/core/src/com/google/gwt/dev/Precompile.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/Precompile.java       (original)
+++ trunk/dev/core/src/com/google/gwt/dev/Precompile.java       Thu Jun 11  
15:21:46 2009
@@ -180,6 +180,10 @@
        return jjsOptions.isEnableAssertions();
      }

+    public boolean isOptimizePrecompile() {
+      return jjsOptions.isOptimizePrecompile();
+    }
+
      public boolean isRunAsyncEnabled() {
        return jjsOptions.isRunAsyncEnabled();
      }
@@ -236,6 +240,10 @@
        this.maxPermsPerPrecompile = maxPermsPerPrecompile;
      }

+    public void setOptimizePrecompile(boolean optimize) {
+      jjsOptions.setOptimizePrecompile(optimize);
+    }
+
      public void setOutput(JsOutputOption output) {
        jjsOptions.setOutput(output);
      }
@@ -427,6 +435,8 @@
            module, compilationState, generatorArtifacts,
            new PropertyPermutations(module.getProperties()), genDir,
            generatorResourcesDir);
+      // Never optimize on a validation run.
+      jjsOptions.setOptimizePrecompile(false);
        JavaToJavaScriptCompiler.precompile(logger, module, rpo,  
declEntryPts,
            additionalRootTypes, jjsOptions, true);
        return true;
@@ -500,6 +510,8 @@

    public boolean run(TreeLogger logger) throws UnableToCompleteException {
      boolean originalCompilationStateRetained =  
options.isCompilationStateRetained();
+    // Avoid early optimizations since permutation compiles will run  
separately.
+    options.setOptimizePrecompile(false);

      for (String moduleName : options.getModuleNames()) {
        File compilerWorkDir = options.getCompilerWorkDir(moduleName);

Modified: trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java   (original)
+++ trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptions.java   Thu Jun 11  
15:21:46 2009
@@ -21,6 +21,7 @@
  import com.google.gwt.dev.util.arg.OptionDisableClassMetadata;
  import com.google.gwt.dev.util.arg.OptionDraftCompile;
  import com.google.gwt.dev.util.arg.OptionEnableAssertions;
+import com.google.gwt.dev.util.arg.OptionOptimizePrecompile;
  import com.google.gwt.dev.util.arg.OptionRunAsyncEnabled;
  import com.google.gwt.dev.util.arg.OptionScriptStyle;
  import com.google.gwt.dev.util.arg.OptionSoycEnabled;
@@ -31,5 +32,5 @@
  public interface JJSOptions extends OptionAggressivelyOptimize,
      OptionDisableClassMetadata, OptionDisableCastChecking,  
OptionDraftCompile,
      OptionEnableAssertions, OptionRunAsyncEnabled, OptionScriptStyle,
-    OptionSoycEnabled, OptionCompilationStateRetained {
+    OptionSoycEnabled, OptionCompilationStateRetained,  
OptionOptimizePrecompile {
  }

Modified: trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java       
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java       Thu Jun 
 
11 15:21:46 2009
@@ -28,6 +28,7 @@
    private boolean disableClassMetadata = false;
    private boolean draftCompile = false;
    private boolean enableAssertions;
+  private boolean optimizePrecompile = false;
    private JsOutputOption output = JsOutputOption.OBFUSCATED;
    private boolean runAsyncEnabled = true;
    private boolean soycEnabled = false;
@@ -79,6 +80,10 @@
      return enableAssertions;
    }

+  public boolean isOptimizePrecompile() {
+    return optimizePrecompile;
+  }
+
    public boolean isRunAsyncEnabled() {
      return runAsyncEnabled;
    }
@@ -109,6 +114,10 @@

    public void setEnableAssertions(boolean enableAssertions) {
      this.enableAssertions = enableAssertions;
+  }
+
+  public void setOptimizePrecompile(boolean optimize) {
+    optimizePrecompile = optimize;
    }

    public void setOutput(JsOutputOption output) {

Modified:  
trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java     
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java     
 
Thu Jun 11 15:21:46 2009
@@ -517,17 +517,31 @@
        JavaScriptObjectNormalizer.exec(jprogram);

        /*
-       * (4) Minimally optimize the normalized Java AST for the common  
AST. By
-       * doing a few optimizations early in the multiple permutation  
scenario,
-       * we can save some work. However, we don't do full optimizations  
because
-       * our optimizer is currently superlinear, which can lead to net  
losses
-       * for big apps. We can't fully optimize because we don't yet know  
the
-       * deferred binding decisions.
+       * 4) Possibly optimize some.
         *
-       * Don't bother optimizing early if there's only one permutation.
+       * Don't optimizing early if this is a draft compile, or if there's  
only
+       * one permutation.
         */
-      if (!singlePermutation) {
-        optimizeLoop(jprogram, false);
+      if (!options.isDraftCompile() && !singlePermutation) {
+        if (options.isOptimizePrecompile()) {
+          /*
+           * Go ahead and optimize early, so that each permutation will run
+           * faster. This code path is used by the Compiler entry point. We
+           * assume that we will not be able to perfectly parallelize the
+           * permutation compiles, so let's optimize as much as possible  
the
+           * common AST. In some cases, this might also have the side  
benefit of
+           * reducing the total permutation count.
+           */
+          optimize(options, jprogram);
+        } else {
+          /*
+           * Do only minimal early optimizations. This code path is used  
by the
+           * Precompile entry point. The external system might be able to
+           * perfectly parallelize the permutation compiles, so let's avoid
+           * doing potentially superlinear optimizations on the unified  
AST.
+           */
+          optimizeLoop(jprogram, false);
+        }
        }

        Set<String> rebindRequests = new HashSet<String>();

Added:  
trunk/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimizePrecompile.java
==============================================================================
--- (empty file)
+++  
trunk/dev/core/src/com/google/gwt/dev/util/arg/OptionOptimizePrecompile.java    
 
Thu Jun 11 15:21:46 2009
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may  
not
+ * use this file except in compliance with the License. You may obtain a  
copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations  
under
+ * the License.
+ */
+package com.google.gwt.dev.util.arg;
+
+/**
+ * Option to early optimize the unified AST during a precompile. Does not
+ * correspond to any command line option. This is used directly by compiler
+ * clients to specify whether or not to optimize early.
+ */
+public interface OptionOptimizePrecompile {
+  boolean isOptimizePrecompile();
+
+  void setOptimizePrecompile(boolean optimize);
+}

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to