fixup for #1553 (#1555)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 5 Mar 2017 09:15:37 +0000 (17:15 +0800)
committerGitHub <noreply@github.com>
Sun, 5 Mar 2017 09:15:37 +0000 (17:15 +0800)
- `++a` is the one that is foldable
- transform `a++` into `++a` for better optimisation

lib/compress.js
test/compress/issue-368.js

index f1409d9..d9a67c1 100644 (file)
@@ -2833,7 +2833,7 @@ merge(Compressor.prototype, {
             if (self.car instanceof AST_Assign
                 && !self.car.left.has_side_effects(compressor)) {
                 left = self.car.left;
-            } else if (self.car instanceof AST_UnaryPostfix
+            } else if (self.car instanceof AST_Unary
                 && (self.car.operator == "++" || self.car.operator == "--")) {
                 left = self.car.expression;
             }
@@ -2842,11 +2842,15 @@ merge(Compressor.prototype, {
                 var cdr = self.cdr;
                 while (true) {
                     if (cdr.equivalent_to(left)) {
+                        var car = self.car instanceof AST_UnaryPostfix ? make_node(AST_UnaryPrefix, self.car, {
+                            operator: self.car.operator,
+                            expression: left
+                        }) : self.car;
                         if (parent) {
-                            parent[field] = self.car;
+                            parent[field] = car;
                             return self.cdr;
                         }
-                        return self.car;
+                        return car;
                     }
                     if (cdr instanceof AST_Binary && !(cdr instanceof AST_Assign)) {
                         field = cdr.left.is_constant() ? "right" : "left";
index 8c41a89..5960aa6 100644 (file)
@@ -21,6 +21,16 @@ collapse: {
             var a;
             a = b(a / 2);
             if (a < 0) {
+                a++;
+                ++c;
+                return c / 2;
+            }
+        }
+        function f4(c) {
+            var a;
+            a = b(a / 2);
+            if (a < 0) {
+                a++;
                 c++;
                 return c / 2;
             }
@@ -35,7 +45,11 @@ collapse: {
         }
         function f3(c) {
             var a;
-            if ((a = b(a / 2)) < 0) return c++ / 2;
+            if ((a = b(a / 2)) < 0) return a++, ++c / 2;
+        }
+        function f4(c) {
+            var a;
+            if ((a = b(a / 2)) < 0) return a++, ++c / 2;
         }
     }
 }