implement optimization: (x = 2 * x) ---> (x *= 2)
This commit is contained in:
@@ -2655,16 +2655,26 @@ merge(Compressor.prototype, {
|
||||
});
|
||||
|
||||
var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
|
||||
var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ];
|
||||
OPT(AST_Assign, function(self, compressor){
|
||||
self = self.lift_sequences(compressor);
|
||||
if (self.operator == "="
|
||||
&& self.left instanceof AST_SymbolRef
|
||||
&& self.right instanceof AST_Binary
|
||||
&& self.right.left instanceof AST_SymbolRef
|
||||
&& self.right.left.name == self.left.name
|
||||
&& member(self.right.operator, ASSIGN_OPS)) {
|
||||
self.operator = self.right.operator + "=";
|
||||
self.right = self.right.right;
|
||||
if (self.operator == "=" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) {
|
||||
// x = expr1 OP expr2
|
||||
if (self.right.left instanceof AST_SymbolRef
|
||||
&& self.right.left.name == self.left.name
|
||||
&& member(self.right.operator, ASSIGN_OPS)) {
|
||||
// x = x - 2 ---> x -= 2
|
||||
self.operator = self.right.operator + "=";
|
||||
self.right = self.right.right;
|
||||
}
|
||||
else if (self.right.right instanceof AST_SymbolRef
|
||||
&& self.right.right.name == self.left.name
|
||||
&& member(self.right.operator, ASSIGN_OPS_COMMUTATIVE)
|
||||
&& !self.right.left.has_side_effects(compressor)) {
|
||||
// x = 2 & x ---> x &= 2
|
||||
self.operator = self.right.operator + "=";
|
||||
self.right = self.right.left;
|
||||
}
|
||||
}
|
||||
return self;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user