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

Reply via email to