Skip to content

Commit

Permalink
Disable DataflowOptimizer by default and emit a warning when used.
Browse files Browse the repository at this point in the history
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: #7854
Change-Id: I66307f99548d0bbcdd0e5bd376db7173e918ae44
  • Loading branch information
rluble committed Oct 27, 2017
1 parent 65bd67f commit ea7228a
Show file tree
Hide file tree
Showing 9 changed files with 16 additions and 12 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -67,7 +67,7 @@ public PrecompileTaskArgProcessor(PrecompileTaskOptions options) {
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));
Expand Down
2 changes: 1 addition & 1 deletion dev/core/src/com/google/gwt/dev/jjs/JJSOptionsImpl.java
Expand Up @@ -40,7 +40,7 @@ public class JJSOptionsImpl implements JJSOptions, Serializable {
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;
Expand Down
Expand Up @@ -1447,6 +1447,8 @@ private void optimizeJavaToFixedPoint() throws InterruptedException {
}

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));
}
Expand Down
Expand Up @@ -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);
Expand Down
Expand Up @@ -64,7 +64,9 @@ public boolean setFlag(boolean value) {
clusterSimilarFunctionsOption.setClusterSimilarFunctions(!value);
inlineLiteralParametersOption.setInlineLiteralParameters(!value);
namespaceOption.setNamespace(JsNamespaceOption.PACKAGE);
optimizeDataflowOption.setOptimizeDataflow(!value);
if (value) {
optimizeDataflowOption.setOptimizeDataflow(false);
}
ordinalizeEnumsOption.setOrdinalizeEnums(!value);
removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(!value);

Expand Down
4 changes: 2 additions & 2 deletions dev/core/test/com/google/gwt/dev/CompilerTest.java
Expand Up @@ -885,7 +885,7 @@ public void testAllValidArgs() {
assertTrue(options.isEnableAssertions());
assertTrue(options.shouldClusterSimilarFunctions());
assertTrue(options.shouldInlineLiteralParameters());
assertTrue(options.shouldOptimizeDataflow());
assertFalse(options.shouldOptimizeDataflow());
assertTrue(options.shouldOrdinalizeEnums());
assertTrue(options.shouldRemoveDuplicateFunctions());
assertTrue(options.isIncrementalCompileEnabled());
Expand Down Expand Up @@ -914,7 +914,7 @@ public void testDefaultArgs() {
assertFalse(options.isEnableAssertions());
assertTrue(options.shouldClusterSimilarFunctions());
assertTrue(options.shouldInlineLiteralParameters());
assertTrue(options.shouldOptimizeDataflow());
assertFalse(options.shouldOptimizeDataflow());
assertTrue(options.shouldOrdinalizeEnums());
assertTrue(options.shouldRemoveDuplicateFunctions());
assertFalse(options.isIncrementalCompileEnabled());
Expand Down
2 changes: 1 addition & 1 deletion dev/core/test/com/google/gwt/dev/HostedModeTest.java
Expand Up @@ -107,7 +107,7 @@ public void testDefaultArgs() {
assertFalse(options.isEnableAssertions());
assertTrue(options.shouldClusterSimilarFunctions());
assertTrue(options.shouldInlineLiteralParameters());
assertTrue(options.shouldOptimizeDataflow());
assertFalse(options.shouldOptimizeDataflow());
assertTrue(options.shouldOrdinalizeEnums());
assertTrue(options.shouldRemoveDuplicateFunctions());

Expand Down
Expand Up @@ -39,7 +39,7 @@ public void testFlagBackwardCompatibility() {
// 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");
Expand Down
4 changes: 2 additions & 2 deletions user/src/com/google/gwt/junit/JUnitShell.java
Expand Up @@ -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;
Expand Down Expand Up @@ -288,7 +288,7 @@ public int handle(String[] args, int tagIndex) {
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));
Expand Down

0 comments on commit ea7228a

Please sign in to comment.