Don't allow constants folding and copy propagation optimizations to perform implicit type conversions. Review by: rice@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9959 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java index 32bcd22..17ec67e 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java
@@ -18,6 +18,7 @@ import com.google.gwt.dev.jjs.ast.JBooleanLiteral; import com.google.gwt.dev.jjs.ast.JExpression; import com.google.gwt.dev.jjs.ast.JLocal; +import com.google.gwt.dev.jjs.ast.JNullLiteral; import com.google.gwt.dev.jjs.ast.JParameter; import com.google.gwt.dev.jjs.ast.JValueLiteral; import com.google.gwt.dev.jjs.ast.JVariable; @@ -106,7 +107,14 @@ if (expression != null) { JValueLiteral valueLiteral = ExpressionEvaluator.evaluate(expression, assumption.unwrap()); - assumption.set(var, valueLiteral); + if (valueLiteral != null && + (valueLiteral.getType() == var.getType() || + valueLiteral instanceof JNullLiteral)) { + assumption.set(var, valueLiteral); + } else { + // Don't bother to try to get conversions right. + assumption.set(var, null); + } } else { assumption.set(var, null); }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java index 4257b00..3c0be2b 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java
@@ -66,7 +66,8 @@ if (original != targetVariable) { result.kill(targetVariable); - if (isSupportedVar(original)) { + if (isSupportedVar(original) && + original.getType() == targetVariable.getType()) { result.addCopy(original, targetVariable); } } else {
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java index 26f11da..ef88dd3 100644 --- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java +++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
@@ -262,6 +262,20 @@ ); } + public void testImplicitConversion() throws Exception { + optimize("long", + "int bar = 0x12345678;", + "bar = bar * 1234;", + "long lng = bar;", + "long lng8 = lng << 8;", + "return lng8;" + ).into( + " int bar;", + " long lng = -1068970384;", + " long lng8 = lng << 8;", + " return lng8;"); + } + @Override protected boolean optimizeMethod(JProgram program, JMethod method) { return DataflowOptimizer.exec(program, method).didChange();
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java index 840e7de..6b7af48 100644 --- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java +++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java
@@ -134,6 +134,21 @@ transform("boolean", "String s = baz(); if (s == null) return false; return s != null;").into( "String s = EntryPoint.baz();", "if (s == null)", " return false;", "return s != null;"); } + + public void testImplicitCasts() throws Exception { + transform("long", + "int bar = 0x12345678;", + "bar = bar * 1234;", + "long lng = bar;", + "long lng8 = lng << 8;", + "return lng8;" + ).into( + " int bar = 305419896;", + " bar = -1068970384;", + " long lng = -1068970384;", + " long lng8 = lng << 8;", + " return lng8;"); + } @Override protected IntegratedAnalysis<CfgNode<?>, CfgEdge, CfgTransformer, Cfg,
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java index e9c3030..617ea5b 100644 --- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java +++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java
@@ -62,6 +62,21 @@ "return i;"); } + public void testImplicitConversion() throws Exception { + transform("long", + "int bar = 0x12345678;", + "bar = bar * 1234;", + "long lng = bar;", + "long lng8 = lng << 8;", + "return lng8;" + ).into( + " int bar = 305419896;", + " bar = bar * 1234;", + " long lng = bar;", + " long lng8 = lng << 8;", + " return lng8;"); + } + @Override protected IntegratedAnalysis<CfgNode<?>, CfgEdge, CfgTransformer, Cfg, CopyAssumption> createIntegratedAnalysis() { return new CopyAnalysis();