Skip to content

Commit

Permalink
fix(es/minifier): Fix infinite loops (#4250)
Browse files Browse the repository at this point in the history
 - We now don't mark changes due to `negate_cost` as a change.
  • Loading branch information
kdy1 committed Apr 5, 2022
1 parent ea871e2 commit 350a195
Show file tree
Hide file tree
Showing 9 changed files with 245 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"jsc": {
"minify": {
"compress": true
}
}
}
17 changes: 17 additions & 0 deletions crates/swc/tests/fixture/issues-4xxx/issue-4249/1/input/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
foo({
bar: function bar(data, baz) {
if (
!(baz ? data.quxA : data.quxB) &&
!(baz ? data.corgeA : data.corgeB) &&
(baz ? data.get("waldo") : data.waldo)
) {
pass();
} else if (
!(baz ? data.quxA : data.quxB) &&
!(baz ? data.get("waldo") : data.waldo) &&
(baz ? data.corgeA : data.corgeB)
) {
pass();
}
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
foo({
bar: function(data, baz) {
!(!(baz ? data.quxA : data.quxB) && !(baz ? data.corgeA : data.corgeB) && (baz ? data.get("waldo") : data.waldo)) ? (baz ? data.quxA : data.quxB) || (baz ? data.get("waldo") : data.waldo) || (baz ? !data.corgeA : !data.corgeB) || pass() : pass();
}
});
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ where
}

if negate_cost(&stmt.test, true, false) < 0 {
self.changed = true;
tracing::debug!("if_return: Negating `cond` of an if statement which has cons and alt");
let ctx = Ctx {
in_bool_ctx: true,
Expand Down
1 change: 0 additions & 1 deletion crates/swc_ecma_minifier/src/compress/pure/bools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ impl Pure<'_> {
return;
}
tracing::debug!("bools: Optimizing `!(a && b)` as `!a || !b`");
self.changed = true;
self.negate(arg, false, false);
*e = *arg.take();
}
Expand Down
1 change: 0 additions & 1 deletion crates/swc_ecma_minifier/src/compress/pure/conds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@ impl Pure<'_> {
return;
}

self.changed = true;
tracing::debug!("conditionals: `a ? foo : bar` => `!a ? bar : foo` (considered cost)");
let start_str = dump(&*cond, false);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
TestSnapshot {
vars: [
(
(
Atom('bar' type=inline),
#2,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 0,
cond_init: false,
declared: false,
declared_count: 0,
declared_as_fn_param: false,
declared_as_fn_expr: true,
assign_count: 0,
mutation_by_call_count: 0,
usage_count: 0,
reassigned_with_assignment: false,
reassigned_with_var_decl: false,
mutated: false,
has_property_access: false,
has_property_mutation: false,
accessed_props: {},
exported: false,
used_above_decl: false,
is_fn_local: false,
used_by_nested_fn: false,
executed_multiple_time: false,
used_in_cond: false,
var_kind: None,
var_initialized: false,
declared_as_catch_param: false,
no_side_effect_for_member_access: false,
used_as_callee: false,
used_as_arg: false,
pure_fn: false,
infects: [],
},
),
(
(
Atom('baz' type=inline),
#2,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 6,
cond_init: false,
declared: true,
declared_count: 1,
declared_as_fn_param: true,
declared_as_fn_expr: false,
assign_count: 0,
mutation_by_call_count: 6,
usage_count: 6,
reassigned_with_assignment: false,
reassigned_with_var_decl: false,
mutated: true,
has_property_access: false,
has_property_mutation: false,
accessed_props: {},
exported: false,
used_above_decl: false,
is_fn_local: true,
used_by_nested_fn: true,
executed_multiple_time: false,
used_in_cond: true,
var_kind: None,
var_initialized: false,
declared_as_catch_param: false,
no_side_effect_for_member_access: false,
used_as_callee: false,
used_as_arg: false,
pure_fn: false,
infects: [],
},
),
(
(
Atom('data' type=inline),
#2,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 12,
cond_init: false,
declared: true,
declared_count: 1,
declared_as_fn_param: true,
declared_as_fn_expr: false,
assign_count: 0,
mutation_by_call_count: 0,
usage_count: 12,
reassigned_with_assignment: false,
reassigned_with_var_decl: false,
mutated: false,
has_property_access: true,
has_property_mutation: false,
accessed_props: {},
exported: false,
used_above_decl: false,
is_fn_local: true,
used_by_nested_fn: true,
executed_multiple_time: false,
used_in_cond: true,
var_kind: None,
var_initialized: false,
declared_as_catch_param: false,
no_side_effect_for_member_access: false,
used_as_callee: false,
used_as_arg: false,
pure_fn: false,
infects: [],
},
),
(
(
Atom('foo' type=inline),
#1,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 1,
cond_init: false,
declared: false,
declared_count: 0,
declared_as_fn_param: false,
declared_as_fn_expr: false,
assign_count: 0,
mutation_by_call_count: 0,
usage_count: 1,
reassigned_with_assignment: false,
reassigned_with_var_decl: false,
mutated: false,
has_property_access: false,
has_property_mutation: false,
accessed_props: {},
exported: false,
used_above_decl: true,
is_fn_local: true,
used_by_nested_fn: false,
executed_multiple_time: false,
used_in_cond: false,
var_kind: None,
var_initialized: false,
declared_as_catch_param: false,
no_side_effect_for_member_access: false,
used_as_callee: true,
used_as_arg: false,
pure_fn: false,
infects: [],
},
),
(
(
Atom('pass' type=inline),
#1,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 2,
cond_init: false,
declared: false,
declared_count: 0,
declared_as_fn_param: false,
declared_as_fn_expr: false,
assign_count: 0,
mutation_by_call_count: 2,
usage_count: 2,
reassigned_with_assignment: false,
reassigned_with_var_decl: false,
mutated: true,
has_property_access: false,
has_property_mutation: false,
accessed_props: {},
exported: false,
used_above_decl: true,
is_fn_local: true,
used_by_nested_fn: true,
executed_multiple_time: false,
used_in_cond: true,
var_kind: None,
var_initialized: false,
declared_as_catch_param: false,
no_side_effect_for_member_access: false,
used_as_callee: true,
used_as_arg: false,
pure_fn: false,
infects: [],
},
),
],
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
foo({
bar: function bar(data, baz) {
if (
!(baz ? data.quxA : data.quxB) &&
!(baz ? data.corgeA : data.corgeB) &&
(baz ? data.get("waldo") : data.waldo)
) {
pass();
} else if (
!(baz ? data.quxA : data.quxB) &&
!(baz ? data.get("waldo") : data.waldo) &&
(baz ? data.corgeA : data.corgeB)
) {
pass();
}
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
foo({
bar: function(data, baz) {
!(!(baz ? data.quxA : data.quxB) && !(baz ? data.corgeA : data.corgeB) && (baz ? data.get("waldo") : data.waldo)) ? (baz ? data.quxA : data.quxB) || (baz ? data.get("waldo") : data.waldo) || (baz ? !data.corgeA : !data.corgeB) || pass() : pass();
}
});

1 comment on commit 350a195

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 350a195 Previous: 4701da5 Ratio
codegen_es3 33696 ns/iter (± 607) 35300 ns/iter (± 388) 0.95
codegen_es5 33354 ns/iter (± 2002) 35317 ns/iter (± 251) 0.94
codegen_es2015 33034 ns/iter (± 1023) 35323 ns/iter (± 127) 0.94
codegen_es2016 33085 ns/iter (± 900) 35243 ns/iter (± 155) 0.94
codegen_es2017 33812 ns/iter (± 754) 35309 ns/iter (± 162) 0.96
codegen_es2018 32689 ns/iter (± 1133) 35322 ns/iter (± 141) 0.93
codegen_es2019 33094 ns/iter (± 1045) 35258 ns/iter (± 170) 0.94
codegen_es2020 33545 ns/iter (± 657) 35304 ns/iter (± 168) 0.95
full_es3 218044529 ns/iter (± 4521904) 229857048 ns/iter (± 5121914) 0.95
full_es5 206960224 ns/iter (± 3089211) 218786445 ns/iter (± 5027284) 0.95
full_es2015 166015146 ns/iter (± 3804143) 173523264 ns/iter (± 5610129) 0.96
full_es2016 162805089 ns/iter (± 6234616) 170156543 ns/iter (± 1443933) 0.96
full_es2017 164268955 ns/iter (± 3830853) 170198152 ns/iter (± 3829867) 0.97
full_es2018 162074755 ns/iter (± 4852738) 168121576 ns/iter (± 4386460) 0.96
full_es2019 161072613 ns/iter (± 4340952) 166976793 ns/iter (± 2859112) 0.96
full_es2020 153911143 ns/iter (± 2921122) 162245547 ns/iter (± 4920916) 0.95
parser 668799 ns/iter (± 19320) 715239 ns/iter (± 14729) 0.94
base_tr_fixer 27821 ns/iter (± 554) 28887 ns/iter (± 228) 0.96
base_tr_resolver_and_hygiene 146888 ns/iter (± 4053) 154301 ns/iter (± 1850) 0.95
serialization of ast node 164 ns/iter (± 6) 172 ns/iter (± 0) 0.95
serialization of serde 162 ns/iter (± 2) 172 ns/iter (± 0) 0.94
colors 64802 ns/iter (± 5328) 65485 ns/iter (± 672) 0.99
large 369205 ns/iter (± 11725) 402490 ns/iter (± 3187) 0.92
colors 60509 ns/iter (± 1436) 65485 ns/iter (± 672) 0.92
large 660172 ns/iter (± 12516) 402490 ns/iter (± 3187) 1.64
libs/antd 2280308470 ns/iter (± 70909207) 2462726454 ns/iter (± 65184476) 0.93
libs/d3 315149016 ns/iter (± 4824423) 340706599 ns/iter (± 4868160) 0.92
libs/echarts 1606962773 ns/iter (± 25420309) 1711316850 ns/iter (± 8811030) 0.94
libs/jquery 82019567 ns/iter (± 1050668) 86934190 ns/iter (± 383673) 0.94
libs/lodash 88335026 ns/iter (± 1971560) 95160165 ns/iter (± 1472385) 0.93
libs/moment 46237354 ns/iter (± 641025) 49709661 ns/iter (± 887450) 0.93
libs/react 15991842 ns/iter (± 490160) 16725962 ns/iter (± 131405) 0.96
libs/terser 462961980 ns/iter (± 15975959) 490034782 ns/iter (± 5834786) 0.94
libs/three 494665646 ns/iter (± 12983577) 511149941 ns/iter (± 14346742) 0.97
libs/typescript 5379862398 ns/iter (± 36671873) 5750135367 ns/iter (± 77160903) 0.94
libs/victory 848826433 ns/iter (± 14435231) 921597652 ns/iter (± 12677385) 0.92
libs/vue 107201848 ns/iter (± 1918135) 118908956 ns/iter (± 3507537) 0.90
clone 2818315 ns/iter (± 99132) 2960053 ns/iter (± 60641) 0.95
visit_mut_span 3435024 ns/iter (± 133655) 3767843 ns/iter (± 124760) 0.91
visit_mut_span_panic 3468930 ns/iter (± 136615) 3808948 ns/iter (± 108818) 0.91
fold_span 4868521 ns/iter (± 224970) 5259787 ns/iter (± 252700) 0.93
fold_span_panic 5733684 ns/iter (± 217948) 5334886 ns/iter (± 191761) 1.07
colors 24589 ns/iter (± 529) 65485 ns/iter (± 672) 0.38
angular 11848092 ns/iter (± 249159) 12523903 ns/iter (± 14619) 0.95
backbone 1576128 ns/iter (± 43775) 1667773 ns/iter (± 2074) 0.95
jqeury 8555059 ns/iter (± 159543) 8968857 ns/iter (± 6606) 0.95
jquery mobile 13888251 ns/iter (± 242348) 14552341 ns/iter (± 43653) 0.95
mootools 6693373 ns/iter (± 54471) 6910401 ns/iter (± 5633) 0.97
underscore 1338967 ns/iter (± 22946) 1388293 ns/iter (± 923) 0.96
three 39270812 ns/iter (± 635832) 40877830 ns/iter (± 263657) 0.96
yui 7392498 ns/iter (± 53156) 7651791 ns/iter (± 4047) 0.97
colors 40442 ns/iter (± 2013) 65485 ns/iter (± 672) 0.62
angular 22278380 ns/iter (± 493185) 12523903 ns/iter (± 14619) 1.78
backbone 2971823 ns/iter (± 37506) 1667773 ns/iter (± 2074) 1.78
jqeury 16571674 ns/iter (± 469276) 8968857 ns/iter (± 6606) 1.85
jquery mobile 26954979 ns/iter (± 564003) 14552341 ns/iter (± 43653) 1.85
mootools 12492224 ns/iter (± 462408) 6910401 ns/iter (± 5633) 1.81
underscore 2464009 ns/iter (± 62750) 1388293 ns/iter (± 923) 1.77
three 76258323 ns/iter (± 1477580) 40877830 ns/iter (± 263657) 1.87
yui 12643905 ns/iter (± 366819) 7651791 ns/iter (± 4047) 1.65
usage_builtin_type 150091 ns/iter (± 7273) 158916 ns/iter (± 7001) 0.94
usage_property 33437 ns/iter (± 853) 38233 ns/iter (± 271) 0.87
resolver 179004 ns/iter (± 3321) 186251 ns/iter (± 1369) 0.96
fixer 151844 ns/iter (± 2654) 159134 ns/iter (± 945) 0.95
hygiene 430590 ns/iter (± 9028) 451459 ns/iter (± 4310) 0.95
resolver_with_hygiene 499662 ns/iter (± 12961) 539492 ns/iter (± 3831) 0.93
module_clone 111572 ns/iter (± 3393) 119013 ns/iter (± 2379) 0.94
fold_empty 123960 ns/iter (± 3679) 134777 ns/iter (± 2588) 0.92
fold_noop_impl_all 126208 ns/iter (± 3554) 134789 ns/iter (± 2251) 0.94
fold_noop_impl_vec 126363 ns/iter (± 4072) 135018 ns/iter (± 2381) 0.94
boxing_boxed_clone 82 ns/iter (± 0) 86 ns/iter (± 0) 0.95
boxing_unboxed_clone 126 ns/iter (± 2) 133 ns/iter (± 0) 0.95
boxing_boxed 157 ns/iter (± 2) 165 ns/iter (± 0) 0.95
boxing_unboxed 194 ns/iter (± 3) 205 ns/iter (± 0) 0.95
visit_contains_this 4503 ns/iter (± 125) 4430 ns/iter (± 95) 1.02
time 5 117 ns/iter (± 1) 127 ns/iter (± 4) 0.92
time 10 361 ns/iter (± 2) 393 ns/iter (± 1) 0.92
time 15 724 ns/iter (± 6) 783 ns/iter (± 9) 0.92
time 20 1339 ns/iter (± 36) 1468 ns/iter (± 82) 0.91
time 40 4611 ns/iter (± 76) 4821 ns/iter (± 11) 0.96
time 60 9794 ns/iter (± 180) 10733 ns/iter (± 260) 0.91
es2016 303138 ns/iter (± 3350) 313696 ns/iter (± 2347) 0.97
es2017 285186 ns/iter (± 2740) 296841 ns/iter (± 5887) 0.96
es2018 272217 ns/iter (± 2476) 282084 ns/iter (± 1619) 0.97
es2020_nullish_coalescing 139649 ns/iter (± 1692) 146733 ns/iter (± 9055) 0.95
es2020_optional_chaining 175494 ns/iter (± 1514) 180748 ns/iter (± 974) 0.97
es2022_class_properties 172673 ns/iter (± 1455) 182087 ns/iter (± 1022) 0.95
es2018_object_rest_spread 125624 ns/iter (± 2293) 132276 ns/iter (± 2412) 0.95
es2019_optional_catch_binding 111707 ns/iter (± 2441) 116560 ns/iter (± 2769) 0.96
es2017_async_to_generator 110955 ns/iter (± 2516) 116933 ns/iter (± 2446) 0.95
es2016_exponentation 135670 ns/iter (± 1822) 142838 ns/iter (± 740) 0.95
es2015_arrow 138563 ns/iter (± 1627) 145559 ns/iter (± 923) 0.95
es2015_block_scoped_fn 137175 ns/iter (± 1902) 144727 ns/iter (± 701) 0.95
es2015_block_scoping 231433 ns/iter (± 3198) 244618 ns/iter (± 1735) 0.95
es2015_classes 199341 ns/iter (± 1961) 206168 ns/iter (± 1634) 0.97
es2015_computed_props 114729 ns/iter (± 2429) 117877 ns/iter (± 2863) 0.97
es2015_destructuring 210197 ns/iter (± 1459) 218213 ns/iter (± 1148) 0.96
es2015_duplicate_keys 117404 ns/iter (± 3602) 121674 ns/iter (± 2931) 0.96
es2015_parameters 148493 ns/iter (± 2075) 153976 ns/iter (± 1900) 0.96
es2015_fn_name 117045 ns/iter (± 2642) 121558 ns/iter (± 2235) 0.96
es2015_for_of 136232 ns/iter (± 1449) 141257 ns/iter (± 725) 0.96
es2015_instanceof 127225 ns/iter (± 3313) 130217 ns/iter (± 901) 0.98
es2015_shorthand_property 112618 ns/iter (± 2558) 116867 ns/iter (± 2417) 0.96
es2015_spread 113616 ns/iter (± 2612) 117161 ns/iter (± 2305) 0.97
es2015_sticky_regex 114441 ns/iter (± 3027) 119529 ns/iter (± 2397) 0.96
es2015_typeof_symbol 115401 ns/iter (± 3103) 118751 ns/iter (± 2901) 0.97
base 99396 ns/iter (± 2878) 102937 ns/iter (± 2532) 0.97
common_reserved_word 115376 ns/iter (± 2727) 120983 ns/iter (± 2506) 0.95
common_typescript 249836 ns/iter (± 3304) 261328 ns/iter (± 842) 0.96
es3 303691 ns/iter (± 5249) 315409 ns/iter (± 1547) 0.96
es2015 885741 ns/iter (± 11590) 923986 ns/iter (± 7886) 0.96
es2016 #2 137996 ns/iter (± 2046) 143237 ns/iter (± 783) 0.96
es2017 #2 113497 ns/iter (± 2488) 116985 ns/iter (± 2551) 0.97
es2018 #2 141315 ns/iter (± 2773) 147079 ns/iter (± 2560) 0.96
es2020 217468 ns/iter (± 2775) 225243 ns/iter (± 1306) 0.97
babelify_only 798235 ns/iter (± 11583) 839060 ns/iter (± 7714) 0.95
parse_and_babelify_angular 81044721 ns/iter (± 9231421) 81080699 ns/iter (± 1291402) 1.00
parse_and_babelify_backbone 8743225 ns/iter (± 206579) 8456274 ns/iter (± 252380) 1.03
parse_and_babelify_jquery 57655532 ns/iter (± 1332832) 55018058 ns/iter (± 2225374) 1.05
parse_and_babelify_jquery_mobile 100998036 ns/iter (± 6028261) 99645071 ns/iter (± 1445766) 1.01
parse_and_babelify_mootools 44809249 ns/iter (± 1566448) 43635696 ns/iter (± 830820) 1.03
parse_and_babelify_underscore 7305972 ns/iter (± 259749) 7248649 ns/iter (± 127873) 1.01
parse_and_babelify_yui 46288467 ns/iter (± 1111847) 42932729 ns/iter (± 987240) 1.08

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.