-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(es/minifier): Fix infinite loops (#4250)
- We now don't mark changes due to `negate_cost` as a change.
- Loading branch information
Showing
9 changed files
with
245 additions
and
3 deletions.
There are no files selected for viewing
7 changes: 7 additions & 0 deletions
7
crates/swc/tests/fixture/issues-4xxx/issue-4249/1/input/.swcrc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"jsc": { | ||
"minify": { | ||
"compress": true | ||
} | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
crates/swc/tests/fixture/issues-4xxx/issue-4249/1/input/index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} | ||
}); |
5 changes: 5 additions & 0 deletions
5
crates/swc/tests/fixture/issues-4xxx/issue-4249/1/output/index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
194 changes: 194 additions & 0 deletions
194
crates/swc_ecma_minifier/tests/compress/fixture/issues/4249/analysis-snapshot.rust-debug
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: [], | ||
}, | ||
), | ||
], | ||
} |
17 changes: 17 additions & 0 deletions
17
crates/swc_ecma_minifier/tests/compress/fixture/issues/4249/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} | ||
}); |
5 changes: 5 additions & 0 deletions
5
crates/swc_ecma_minifier/tests/compress/fixture/issues/4249/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
}); |
350a195
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Benchmark
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.