Disable DataflowOptimizer by default and emit a warning when used.

DataflowOptimizer is problematic, it performs unsafe numerical
optimizations, has no guarantee of termination and is expensive
considering its small codesize impact. Most of the work done by
this pass is already performed by DeadCodeElimination.

Bug: #7854
Bug-Link: https://github.com/gwtproject/gwt/issues/7854
Change-Id: I66307f99548d0bbcdd0e5bd376db7173e918ae44
diff --git a/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java b/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java
index 91e7a61..3dc0c9c 100644
--- a/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java
+++ b/dev/core/src/com/google/gwt/dev/PrecompileTaskArgProcessor.java
@@ -19,12 +19,12 @@
 import com.google.gwt.dev.util.arg.ArgHandlerClosureFormattedOutput;
 import com.google.gwt.dev.util.arg.ArgHandlerCompileReport;
 import com.google.gwt.dev.util.arg.ArgHandlerCompilerMetrics;
+import com.google.gwt.dev.util.arg.ArgHandlerDeprecatedOptimizeDataflow;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableCastChecking;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableClassMetadata;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableClusterSimilarFunctions;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableGeneratingOnShards;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableInlineLiteralParameters;
-import com.google.gwt.dev.util.arg.ArgHandlerDisableOptimizeDataflow;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableOrdinalizeEnums;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableRemoveDuplicateFunctions;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableRunAsync;
@@ -67,7 +67,7 @@
     registerHandler(new ArgHandlerDisableRemoveDuplicateFunctions(options));
     registerHandler(new ArgHandlerDisableGeneratingOnShards(options));
     registerHandler(new ArgHandlerDisableInlineLiteralParameters(options));
-    registerHandler(new ArgHandlerDisableOptimizeDataflow(options));
+    registerHandler(new ArgHandlerDeprecatedOptimizeDataflow(options));
     registerHandler(new ArgHandlerDisableOrdinalizeEnums(options));
     registerHandler(new ArgHandlerDisableRunAsync(options));
     registerHandler(new ArgHandlerDisableSoycHtml(options));
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
index 1304821..7a5c865 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
@@ -40,7 +40,7 @@
   private boolean jsonSoycEnabled = false;
   private JsNamespaceOption namespace = JsNamespaceOption.NONE;
   private int optimizationLevel = OptionOptimize.OPTIMIZE_LEVEL_DEFAULT;
-  private boolean optimizeDataflow = true;
+  private boolean optimizeDataflow = false;
   private boolean ordinalizeEnums = true;
   private JsOutputOption output = JsOutputOption.OBFUSCATED;
   private boolean removeDuplicateFunctions = true;
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 bf6274b..4e4304d 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -1447,6 +1447,8 @@
     }
 
     if (options.shouldOptimizeDataflow()) {
+      logger.log(TreeLogger.Type.WARN,
+          "Unsafe dataflow optimization enabled, diable with -XdisableOptimizeDataflow.");
       // Just run it once, because it is very time consuming
       allOptimizerStats.add(DataflowOptimizer.exec(jprogram));
     }
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDeprecatedOptimizeDataflow.java
similarity index 89%
rename from dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java
rename to dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDeprecatedOptimizeDataflow.java
index 7335196..125496a 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDisableOptimizeDataflow.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDeprecatedOptimizeDataflow.java
@@ -20,11 +20,11 @@
 /**
  * Analyzes and optimizes dataflow.
  */
-public final class ArgHandlerDisableOptimizeDataflow extends ArgHandlerFlag {
+public final class ArgHandlerDeprecatedOptimizeDataflow extends ArgHandlerFlag {
 
   private final OptionOptimizeDataflow option;
 
-  public ArgHandlerDisableOptimizeDataflow(OptionOptimizeDataflow option) {
+  public ArgHandlerDeprecatedOptimizeDataflow(OptionOptimizeDataflow option) {
     this.option = option;
 
     addTagValue("-XdisableOptimizeDataflow", false);
diff --git a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java
index 6b31541..940e9e5 100644
--- a/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java
+++ b/dev/core/src/com/google/gwt/dev/util/arg/ArgHandlerDraftCompile.java
@@ -64,7 +64,9 @@
     clusterSimilarFunctionsOption.setClusterSimilarFunctions(!value);
     inlineLiteralParametersOption.setInlineLiteralParameters(!value);
     namespaceOption.setNamespace(JsNamespaceOption.PACKAGE);
-    optimizeDataflowOption.setOptimizeDataflow(!value);
+    if (value) {
+      optimizeDataflowOption.setOptimizeDataflow(false);
+    }
     ordinalizeEnumsOption.setOrdinalizeEnums(!value);
     removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(!value);
 
diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
index 2ecf9e4..99a0b94 100644
--- a/dev/core/test/com/google/gwt/dev/CompilerTest.java
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -885,7 +885,7 @@
     assertTrue(options.isEnableAssertions());
     assertTrue(options.shouldClusterSimilarFunctions());
     assertTrue(options.shouldInlineLiteralParameters());
-    assertTrue(options.shouldOptimizeDataflow());
+    assertFalse(options.shouldOptimizeDataflow());
     assertTrue(options.shouldOrdinalizeEnums());
     assertTrue(options.shouldRemoveDuplicateFunctions());
     assertTrue(options.isIncrementalCompileEnabled());
@@ -914,7 +914,7 @@
     assertFalse(options.isEnableAssertions());
     assertTrue(options.shouldClusterSimilarFunctions());
     assertTrue(options.shouldInlineLiteralParameters());
-    assertTrue(options.shouldOptimizeDataflow());
+    assertFalse(options.shouldOptimizeDataflow());
     assertTrue(options.shouldOrdinalizeEnums());
     assertTrue(options.shouldRemoveDuplicateFunctions());
     assertFalse(options.isIncrementalCompileEnabled());
diff --git a/dev/core/test/com/google/gwt/dev/HostedModeTest.java b/dev/core/test/com/google/gwt/dev/HostedModeTest.java
index 371cb7a..1e48086 100644
--- a/dev/core/test/com/google/gwt/dev/HostedModeTest.java
+++ b/dev/core/test/com/google/gwt/dev/HostedModeTest.java
@@ -107,7 +107,7 @@
     assertFalse(options.isEnableAssertions());
     assertTrue(options.shouldClusterSimilarFunctions());
     assertTrue(options.shouldInlineLiteralParameters());
-    assertTrue(options.shouldOptimizeDataflow());
+    assertFalse(options.shouldOptimizeDataflow());
     assertTrue(options.shouldOrdinalizeEnums());
     assertTrue(options.shouldRemoveDuplicateFunctions());
 
diff --git a/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java b/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java
index 77c5bb3..e182dc1 100644
--- a/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java
+++ b/dev/core/test/com/google/gwt/dev/PrecompileTaskArgProcessorTest.java
@@ -39,7 +39,7 @@
     // Set a bunch of boolean flags using old-style tags.
     precompileTaskArgProcessor.processArgs("-workDir", "/tmp", "-XcompilerMetrics",
         "-XdisableClassMetadata", "-XdisableClusterSimilarFunctions",
-        "-XdisableInlineLiteralParameters", "-XdisableOptimizeDataflow", "-XdisableOrdinalizeEnums",
+        "-XdisableInlineLiteralParameters", "-XoptimizeDataflow", "-XdisableOrdinalizeEnums",
         "-XdisableRemoveDuplicateFunctions", "-XdisableRunAsync", "-XdisableSoycHtml",
         "-XdisableUpdateCheck", "-ea", "-soyc", "-XsoycDetailed",
         "-XenableJsonSoyc", "-strict", "com.google.gwt.dev.DevModule");
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 0a161fb..e0f228c 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -40,11 +40,11 @@
 import com.google.gwt.dev.shell.jetty.JettyLauncher;
 import com.google.gwt.dev.util.arg.ArgHandlerClosureFormattedOutput;
 import com.google.gwt.dev.util.arg.ArgHandlerDeployDir;
+import com.google.gwt.dev.util.arg.ArgHandlerDeprecatedOptimizeDataflow;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableCastChecking;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableClassMetadata;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableClusterSimilarFunctions;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableInlineLiteralParameters;
-import com.google.gwt.dev.util.arg.ArgHandlerDisableOptimizeDataflow;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableOrdinalizeEnums;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableRemoveDuplicateFunctions;
 import com.google.gwt.dev.util.arg.ArgHandlerDisableRunAsync;
@@ -288,7 +288,7 @@
       registerHandler(new ArgHandlerDisableClassMetadata(options));
       registerHandler(new ArgHandlerDisableClusterSimilarFunctions(options));
       registerHandler(new ArgHandlerDisableInlineLiteralParameters(options));
-      registerHandler(new ArgHandlerDisableOptimizeDataflow(options));
+      registerHandler(new ArgHandlerDeprecatedOptimizeDataflow(options));
       registerHandler(new ArgHandlerDisableOrdinalizeEnums(options));
       registerHandler(new ArgHandlerDisableRemoveDuplicateFunctions(options));
       registerHandler(new ArgHandlerDisableRunAsync(options));