Revision: 9959
Author: [email protected]
Date: Thu Apr 7 13:47:10 2011
Log: Don't allow constants folding and copy propagation optimizations
to perform implicit type conversions.
Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=9959
Modified:
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java
=======================================
---
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java
Tue Mar 9 10:54:56 2010
+++
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsFlowFunction.java
Thu Apr 7 13:47:10 2011
@@ -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);
}
=======================================
---
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java
Tue Mar 9 10:54:56 2010
+++
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/copy/CopyFlowFunction.java
Thu Apr 7 13:47:10 2011
@@ -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 {
=======================================
---
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
Thu Sep 9 00:20:17 2010
+++
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
Thu Apr 7 13:47:10 2011
@@ -261,6 +261,20 @@
"return results;"
);
}
+
+ 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) {
=======================================
---
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java
Mon Jun 7 12:20:31 2010
+++
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/constants/ConstantsAnalysisTransformationTest.java
Thu Apr 7 13:47:10 2011
@@ -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,
=======================================
---
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java
Fri Apr 2 14:35:01 2010
+++
/trunk/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/copy/CopyAnalysisTransformationTest.java
Thu Apr 7 13:47:10 2011
@@ -61,6 +61,21 @@
"i = i;",
"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() {
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors