During precompile, only do a draft optimize due to superlinear optimization performance.

This makes precompile faster at the expense of each sharded compile being slower.  This is a win if youc can properly parallelize the individual compile shards, but we should revisit this change for users who only have a single build machine, as it could be a net loss for them.

This also makes draft compiles (as a feature) faster by doing even fewer optimizations.

Review by: spoon

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5338 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index a1d50fc..b35872b 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -187,12 +187,17 @@
       ResolveRebinds.exec(jprogram, rebindAnswers);
 
       // (4) Optimize the normalized Java AST for each permutation.
-      optimize(options, jprogram);
-      
+      if (options.isDraftCompile()) {
+        draftOptimize(jprogram);
+      } else {
+        optimize(options, jprogram);
+      }
+
       // (4.5) Choose an initial load order sequence for runAsync's
       LinkedHashSet<Integer> initialLoadSequence = new LinkedHashSet<Integer>();
       if (options.isAggressivelyOptimize() && options.isRunAsyncEnabled()) {
-        initialLoadSequence = CodeSplitter.pickInitialLoadSequence(logger, jprogram);
+        initialLoadSequence = CodeSplitter.pickInitialLoadSequence(logger,
+            jprogram);
       }
 
       // (5) "Normalize" the high-level Java tree into a lower-level tree more
@@ -466,15 +471,17 @@
       JavaScriptObjectNormalizer.exec(jprogram);
 
       /*
-       * (4) Optimize the normalized Java AST for the common AST. By doing
-       * optimizations early in the multiple permutation scenario, we're saving
-       * work. However, we can't fully optimize because we don't yet know the
+       * (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.
        * 
        * Don't bother optimizing early if there's only one permutation.
        */
       if (!singlePermutation) {
-        optimize(options, jprogram);
+        draftOptimize(jprogram);
       }
 
       Set<String> rebindRequests = new HashSet<String>();
@@ -489,6 +496,25 @@
     }
   }
 
+  protected static void draftOptimize(JProgram jprogram) {
+    /*
+     * Record the beginning of optimizations; this turns on certain checks that
+     * guard against problematic late construction of things like class
+     * literals.
+     */
+    jprogram.beginOptimizations();
+
+    PerfLogger.start("draft optimize");
+    Pruner.exec(jprogram, true);
+    /*
+     * Ensure that references to dead clinits are removed. Otherwise, the
+     * application won't run reliably.
+     */
+    jprogram.typeOracle.recomputeAfterOptimizations();
+    DeadCodeElimination.exec(jprogram);
+    PerfLogger.end();
+  }
+
   protected static void optimize(JJSOptions options, JProgram jprogram)
       throws InterruptedException {
     /*
@@ -498,14 +524,18 @@
      */
     jprogram.beginOptimizations();
 
+    PerfLogger.start("optimize");
     boolean didChange;
     do {
       if (Thread.interrupted()) {
+        PerfLogger.end();
         throw new InterruptedException();
       }
 
       maybeDumpAST(jprogram);
 
+      PerfLogger.start("optimize loop");
+
       // Recompute clinits each time, they can become empty.
       jprogram.typeOracle.recomputeAfterOptimizations();
       didChange = false;
@@ -537,16 +567,10 @@
       }
       // prove that any types that have been culled from the main tree are
       // unreferenced due to type tightening?
-    } while (didChange && !options.isDraftCompile());
 
-    if (options.isDraftCompile()) {
-      /*
-       * Ensure that references to dead clinits are removed. Otherwise, the
-       * application won't run reliably.
-       */
-      jprogram.typeOracle.recomputeAfterOptimizations();
-      DeadCodeElimination.exec(jprogram);
-    }
+      PerfLogger.end();
+    } while (didChange);
+    PerfLogger.end();
   }
 
   private static JavaToJavaScriptMap addStringLiteralMap(