Skip to content

Commit 31de19e

Browse files
authoredAug 17, 2023
fix(es/minifier): Preserve more analysis data upon inlining (#7823)
**Related issue:** - Closes #7821.
1 parent 9dbfadb commit 31de19e

File tree

7 files changed

+225
-1
lines changed

7 files changed

+225
-1
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "typescript",
5+
"tsx": true
6+
},
7+
"target": "es5",
8+
"loose": false,
9+
"minify": {
10+
"compress": {
11+
"arguments": false,
12+
"arrows": true,
13+
"booleans": true,
14+
"booleans_as_integers": false,
15+
"collapse_vars": true,
16+
"comparisons": true,
17+
"computed_props": true,
18+
"conditionals": true,
19+
"dead_code": true,
20+
"directives": true,
21+
"drop_console": false,
22+
"drop_debugger": true,
23+
"evaluate": true,
24+
"expression": false,
25+
"hoist_funs": false,
26+
"hoist_props": true,
27+
"hoist_vars": false,
28+
"if_return": true,
29+
"join_vars": true,
30+
"keep_classnames": false,
31+
"keep_fargs": true,
32+
"keep_fnames": false,
33+
"keep_infinity": false,
34+
"loops": true,
35+
"negate_iife": true,
36+
"properties": true,
37+
"reduce_funcs": false,
38+
"reduce_vars": false,
39+
"side_effects": true,
40+
"switches": true,
41+
"typeofs": true,
42+
"unsafe": false,
43+
"unsafe_arrows": false,
44+
"unsafe_comps": false,
45+
"unsafe_Function": false,
46+
"unsafe_math": false,
47+
"unsafe_symbols": false,
48+
"unsafe_methods": false,
49+
"unsafe_proto": false,
50+
"unsafe_regexp": false,
51+
"unsafe_undefined": false,
52+
"unused": true,
53+
"const_to_let": true,
54+
"pristine_globals": true
55+
},
56+
"mangle": {
57+
"toplevel": false,
58+
"keep_classnames": false,
59+
"keep_fnames": false,
60+
"keep_private_props": false,
61+
"ie8": false,
62+
"safari10": false
63+
}
64+
}
65+
},
66+
"module": {
67+
"type": "es6"
68+
},
69+
"minify": false,
70+
"isModule": true
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const Blocks = {
2+
Block1: () => {
3+
return <>'Block1xx'</>;
4+
},
5+
Block2: () => {
6+
return <>'Block2xx'</>;
7+
},
8+
Layout1: () => {
9+
// In the final code, Blocks does not have a 'Block1' key
10+
return RenderLayout(Blocks, ['Block1'])
11+
}
12+
};
13+
14+
function RenderLayout(Comps, items) {
15+
return items.map((item) => {
16+
return Comps[item]
17+
})
18+
}
19+
20+
export function render() {
21+
return <Blocks.Layout1 />
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
var Blocks = {
2+
Block1: function() {
3+
return React.createElement(React.Fragment, null, "'Block1xx'");
4+
},
5+
Block2: function() {
6+
return React.createElement(React.Fragment, null, "'Block2xx'");
7+
},
8+
Layout1: function() {
9+
return [
10+
"Block1"
11+
].map(function(e) {
12+
return Blocks[e];
13+
});
14+
}
15+
};
16+
export function render() {
17+
return React.createElement(Blocks.Layout1, null);
18+
}

‎crates/swc_ecma_minifier/src/compress/optimize/inline.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,35 @@ impl Optimizer<'_> {
245245
{
246246
self.mode.store(id.clone(), &*init);
247247

248-
let usage_count = usage.usage_count;
248+
let VarUsageInfo {
249+
used_as_arg,
250+
used_as_ref,
251+
indexed_with_dynamic_key,
252+
usage_count,
253+
has_property_access,
254+
has_property_mutation,
255+
used_above_decl,
256+
executed_multiple_time,
257+
used_in_cond,
258+
used_recursively,
259+
no_side_effect_for_member_access,
260+
..
261+
} = *usage;
249262
let mut inc_usage = || {
250263
if let Expr::Ident(i) = &*init {
251264
if let Some(u) = self.data.vars.get_mut(&i.to_id()) {
265+
u.used_as_arg |= used_as_arg;
266+
u.used_as_ref |= used_as_ref;
267+
u.indexed_with_dynamic_key |= indexed_with_dynamic_key;
268+
u.has_property_access |= has_property_access;
269+
u.has_property_mutation |= has_property_mutation;
270+
u.used_above_decl |= used_above_decl;
271+
u.executed_multiple_time |= executed_multiple_time;
272+
u.used_in_cond |= used_in_cond;
273+
u.used_recursively |= used_recursively;
274+
275+
u.no_side_effect_for_member_access &= no_side_effect_for_member_access;
276+
252277
u.ref_count += ref_count;
253278
u.usage_count += usage_count;
254279
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"arguments": false,
3+
"arrows": true,
4+
"booleans": true,
5+
"booleans_as_integers": false,
6+
"collapse_vars": true,
7+
"comparisons": true,
8+
"computed_props": true,
9+
"conditionals": true,
10+
"dead_code": true,
11+
"directives": true,
12+
"drop_console": false,
13+
"drop_debugger": true,
14+
"evaluate": true,
15+
"expression": false,
16+
"hoist_funs": false,
17+
"hoist_props": true,
18+
"hoist_vars": false,
19+
"if_return": true,
20+
"join_vars": true,
21+
"keep_classnames": false,
22+
"keep_fargs": true,
23+
"keep_fnames": false,
24+
"keep_infinity": false,
25+
"loops": true,
26+
"negate_iife": true,
27+
"properties": true,
28+
"reduce_funcs": false,
29+
"reduce_vars": false,
30+
"side_effects": true,
31+
"switches": true,
32+
"typeofs": true,
33+
"unsafe": false,
34+
"unsafe_arrows": false,
35+
"unsafe_comps": false,
36+
"unsafe_Function": false,
37+
"unsafe_math": false,
38+
"unsafe_symbols": false,
39+
"unsafe_methods": false,
40+
"unsafe_proto": false,
41+
"unsafe_regexp": false,
42+
"unsafe_undefined": false,
43+
"unused": true,
44+
"const_to_let": true,
45+
"pristine_globals": true
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
var Blocks = {
2+
Block1: function () {
3+
return React.createElement(React.Fragment, null, "'Block1xx'");
4+
},
5+
Block2: function () {
6+
return React.createElement(React.Fragment, null, "'Block2xx'");
7+
},
8+
Layout1: function () {
9+
return RenderLayout(Blocks, [
10+
"Block1"
11+
]);
12+
}
13+
};
14+
function RenderLayout(Comps, items) {
15+
return items.map(function (item) {
16+
return Comps[item];
17+
});
18+
}
19+
export function render() {
20+
return React.createElement(Blocks.Layout1, null);
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
var Blocks = {
2+
Block1: function() {
3+
return React.createElement(React.Fragment, null, "'Block1xx'");
4+
},
5+
Block2: function() {
6+
return React.createElement(React.Fragment, null, "'Block2xx'");
7+
},
8+
Layout1: function() {
9+
return RenderLayout(Blocks, [
10+
"Block1"
11+
]);
12+
}
13+
};
14+
function RenderLayout(Comps, items) {
15+
return items.map(function(item) {
16+
return Comps[item];
17+
});
18+
}
19+
export function render() {
20+
return React.createElement(Blocks.Layout1, null);
21+
}

1 commit comments

Comments
 (1)

github-actions[bot] commented on Aug 17, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 31de19e Previous: 9099883 Ratio
es/full/bugs-1 288888 ns/iter (± 7371) 293738 ns/iter (± 14685) 0.98
es/full/minify/libraries/antd 1440777976 ns/iter (± 19501405) 1296700916 ns/iter (± 12577669) 1.11
es/full/minify/libraries/d3 301814182 ns/iter (± 3559360) 271041513 ns/iter (± 2465526) 1.11
es/full/minify/libraries/echarts 1151736906 ns/iter (± 12888717) 1038827232 ns/iter (± 4025243) 1.11
es/full/minify/libraries/jquery 86602713 ns/iter (± 365685) 83020024 ns/iter (± 274875) 1.04
es/full/minify/libraries/lodash 100690191 ns/iter (± 589648) 95973533 ns/iter (± 274387) 1.05
es/full/minify/libraries/moment 50850294 ns/iter (± 297064) 49128718 ns/iter (± 45639) 1.04
es/full/minify/libraries/react 18378926 ns/iter (± 178817) 17834193 ns/iter (± 80975) 1.03
es/full/minify/libraries/terser 233873080 ns/iter (± 1439189) 217504520 ns/iter (± 2207134) 1.08
es/full/minify/libraries/three 418759004 ns/iter (± 5231659) 379141097 ns/iter (± 1079641) 1.10
es/full/minify/libraries/typescript 2802884599 ns/iter (± 13575477) 2639666147 ns/iter (± 17164587) 1.06
es/full/minify/libraries/victory 616626693 ns/iter (± 4623576) 556521307 ns/iter (± 2830884) 1.11
es/full/minify/libraries/vue 123099563 ns/iter (± 1005388) 117812164 ns/iter (± 474991) 1.04
es/full/codegen/es3 33825 ns/iter (± 173) 36267 ns/iter (± 75) 0.93
es/full/codegen/es5 33719 ns/iter (± 104) 36271 ns/iter (± 83) 0.93
es/full/codegen/es2015 33810 ns/iter (± 100) 36434 ns/iter (± 63) 0.93
es/full/codegen/es2016 33815 ns/iter (± 91) 36277 ns/iter (± 139) 0.93
es/full/codegen/es2017 33767 ns/iter (± 96) 36379 ns/iter (± 117) 0.93
es/full/codegen/es2018 33753 ns/iter (± 43) 36273 ns/iter (± 71) 0.93
es/full/codegen/es2019 33884 ns/iter (± 129) 36334 ns/iter (± 107) 0.93
es/full/codegen/es2020 33797 ns/iter (± 87) 36282 ns/iter (± 93) 0.93
es/full/all/es3 170024181 ns/iter (± 1117642) 167678535 ns/iter (± 1286363) 1.01
es/full/all/es5 163486679 ns/iter (± 979386) 160114035 ns/iter (± 817207) 1.02
es/full/all/es2015 122546691 ns/iter (± 657678) 119058934 ns/iter (± 924795) 1.03
es/full/all/es2016 121098965 ns/iter (± 635981) 117783746 ns/iter (± 912457) 1.03
es/full/all/es2017 120747714 ns/iter (± 471863) 117014298 ns/iter (± 502499) 1.03
es/full/all/es2018 119056899 ns/iter (± 1050751) 115318664 ns/iter (± 492105) 1.03
es/full/all/es2019 118879300 ns/iter (± 402132) 114394922 ns/iter (± 599357) 1.04
es/full/all/es2020 113624171 ns/iter (± 857443) 110069756 ns/iter (± 532523) 1.03
es/full/parser 503201 ns/iter (± 7490) 505907 ns/iter (± 4463) 0.99
es/full/base/fixer 18158 ns/iter (± 181) 18360 ns/iter (± 117) 0.99
es/full/base/resolver_and_hygiene 80687 ns/iter (± 252) 81156 ns/iter (± 257) 0.99
serialization of serde 297 ns/iter (± 1) 294 ns/iter (± 0) 1.01
css/minify/libraries/bootstrap 29530937 ns/iter (± 169509) 29488908 ns/iter (± 98890) 1.00
css/visitor/compare/clone 1651280 ns/iter (± 1500) 1642426 ns/iter (± 14112) 1.01
css/visitor/compare/visit_mut_span 1776300 ns/iter (± 5196) 1779596 ns/iter (± 8531) 1.00
css/visitor/compare/visit_mut_span_panic 1853610 ns/iter (± 5637) 1837334 ns/iter (± 8819) 1.01
css/visitor/compare/fold_span 2595885 ns/iter (± 15068) 2560154 ns/iter (± 11366) 1.01
css/visitor/compare/fold_span_panic 2762014 ns/iter (± 10982) 2758409 ns/iter (± 17666) 1.00
css/lexer/bootstrap_5_1_3 4535696 ns/iter (± 3404) 4440780 ns/iter (± 6017) 1.02
css/lexer/foundation_6_7_4 3796597 ns/iter (± 4023) 3786068 ns/iter (± 6710) 1.00
css/lexer/tailwind_3_1_1 720451 ns/iter (± 535) 726070 ns/iter (± 1079) 0.99
css/parser/bootstrap_5_1_3 19661634 ns/iter (± 137160) 19725747 ns/iter (± 41883) 1.00
css/parser/foundation_6_7_4 15652036 ns/iter (± 92666) 15289360 ns/iter (± 22158) 1.02
css/parser/tailwind_3_1_1 2989627 ns/iter (± 7757) 2999754 ns/iter (± 5925) 1.00
es/codegen/colors 728201 ns/iter (± 395807) 730116 ns/iter (± 397179) 1.00
es/codegen/large 2921836 ns/iter (± 1539750) 2912228 ns/iter (± 1533243) 1.00
es/codegen/with-parser/colors 46074 ns/iter (± 204) 45933 ns/iter (± 325) 1.00
es/codegen/with-parser/large 492115 ns/iter (± 850) 487556 ns/iter (± 2308) 1.01
es/minify/libraries/antd 1237934638 ns/iter (± 17722450) 1136488192 ns/iter (± 6888493) 1.09
es/minify/libraries/d3 259621171 ns/iter (± 4304534) 237661251 ns/iter (± 948581) 1.09
es/minify/libraries/echarts 993989081 ns/iter (± 6501112) 904774683 ns/iter (± 7064071) 1.10
es/minify/libraries/jquery 75455389 ns/iter (± 332611) 72860508 ns/iter (± 100984) 1.04
es/minify/libraries/lodash 89674894 ns/iter (± 610750) 86934528 ns/iter (± 130499) 1.03
es/minify/libraries/moment 44424354 ns/iter (± 211510) 43129045 ns/iter (± 53427) 1.03
es/minify/libraries/react 16421101 ns/iter (± 138817) 15976378 ns/iter (± 64676) 1.03
es/minify/libraries/terser 198583037 ns/iter (± 3176059) 185146959 ns/iter (± 469707) 1.07
es/minify/libraries/three 359901487 ns/iter (± 6818052) 320228381 ns/iter (± 1651591) 1.12
es/minify/libraries/typescript 2391411565 ns/iter (± 19483847) 2230754973 ns/iter (± 6933240) 1.07
es/minify/libraries/victory 529815633 ns/iter (± 6283729) 467576736 ns/iter (± 1128265) 1.13
es/minify/libraries/vue 110041105 ns/iter (± 762630) 105574571 ns/iter (± 167035) 1.04
es/visitor/compare/clone 1960817 ns/iter (± 4904) 1980886 ns/iter (± 14878) 0.99
es/visitor/compare/visit_mut_span 2272690 ns/iter (± 7675) 2291178 ns/iter (± 7604) 0.99
es/visitor/compare/visit_mut_span_panic 2345323 ns/iter (± 6120) 2345898 ns/iter (± 7118) 1.00
es/visitor/compare/fold_span 3403365 ns/iter (± 13294) 3417081 ns/iter (± 7300) 1.00
es/visitor/compare/fold_span_panic 3512131 ns/iter (± 26252) 3511772 ns/iter (± 4390) 1.00
es/lexer/colors 13299 ns/iter (± 11) 13086 ns/iter (± 146) 1.02
es/lexer/angular 6179611 ns/iter (± 12060) 6088156 ns/iter (± 36850) 1.02
es/lexer/backbone 801786 ns/iter (± 1898) 792586 ns/iter (± 493) 1.01
es/lexer/jquery 4548012 ns/iter (± 8231) 4498618 ns/iter (± 4188) 1.01
es/lexer/jquery mobile 6909346 ns/iter (± 12536) 6832736 ns/iter (± 5002) 1.01
es/lexer/mootools 3615117 ns/iter (± 3568) 3562215 ns/iter (± 2408) 1.01
es/lexer/underscore 674001 ns/iter (± 3642) 661748 ns/iter (± 634) 1.02
es/lexer/three 21843158 ns/iter (± 47808) 21306895 ns/iter (± 26404) 1.03
es/lexer/yui 3873952 ns/iter (± 10378) 3826707 ns/iter (± 1044) 1.01
es/parser/colors 27238 ns/iter (± 61) 27058 ns/iter (± 136) 1.01
es/parser/angular 13586161 ns/iter (± 80110) 13358149 ns/iter (± 56518) 1.02
es/parser/backbone 2007146 ns/iter (± 9771) 1985347 ns/iter (± 47973) 1.01
es/parser/jquery 11003278 ns/iter (± 57435) 10829431 ns/iter (± 42704) 1.02
es/parser/jquery mobile 17095188 ns/iter (± 171775) 16588943 ns/iter (± 150382) 1.03
es/parser/mootools 8408011 ns/iter (± 29679) 8314240 ns/iter (± 27141) 1.01
es/parser/underscore 1740111 ns/iter (± 9957) 1716827 ns/iter (± 8650) 1.01
es/parser/three 49417778 ns/iter (± 895291) 46336673 ns/iter (± 185872) 1.07
es/parser/yui 8302778 ns/iter (± 61532) 8192951 ns/iter (± 32279) 1.01
es/preset-env/usage/builtin_type 140923 ns/iter (± 32326) 136135 ns/iter (± 31623) 1.04
es/preset-env/usage/property 16574 ns/iter (± 85) 17608 ns/iter (± 125) 0.94
es/resolver/typescript 90632190 ns/iter (± 1930510) 88484799 ns/iter (± 1032378) 1.02
es/fixer/typescript 65090685 ns/iter (± 632300) 63247686 ns/iter (± 1307190) 1.03
es/hygiene/typescript 136302884 ns/iter (± 1575401) 129159775 ns/iter (± 473086) 1.06
es/resolver_with_hygiene/typescript 250282916 ns/iter (± 3792915) 239048431 ns/iter (± 879584) 1.05
es/visitor/base-perf/module_clone 59948 ns/iter (± 196) 60002 ns/iter (± 271) 1.00
es/visitor/base-perf/fold_empty 64065 ns/iter (± 255) 64430 ns/iter (± 305) 0.99
es/visitor/base-perf/fold_noop_impl_all 64142 ns/iter (± 282) 64073 ns/iter (± 270) 1.00
es/visitor/base-perf/fold_noop_impl_vec 64645 ns/iter (± 343) 64758 ns/iter (± 305) 1.00
es/visitor/base-perf/boxing_boxed_clone 63 ns/iter (± 0) 56 ns/iter (± 0) 1.13
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 40 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 109 ns/iter (± 0) 108 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 79 ns/iter (± 0) 1
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2613 ns/iter (± 8) 2780 ns/iter (± 15) 0.94
es/base/parallel/resolver/typescript 4548648139 ns/iter (± 277902658) 4207289015 ns/iter (± 201312857) 1.08
es/base/parallel/hygiene/typescript 1432803095 ns/iter (± 15206152) 1457577490 ns/iter (± 17887184) 0.98
misc/visitors/time-complexity/time 5 131 ns/iter (± 1) 138 ns/iter (± 2) 0.95
misc/visitors/time-complexity/time 10 317 ns/iter (± 6) 389 ns/iter (± 2) 0.81
misc/visitors/time-complexity/time 15 726 ns/iter (± 4) 732 ns/iter (± 9) 0.99
misc/visitors/time-complexity/time 20 931 ns/iter (± 53) 1104 ns/iter (± 56) 0.84
misc/visitors/time-complexity/time 40 3511 ns/iter (± 4) 4094 ns/iter (± 14) 0.86
misc/visitors/time-complexity/time 60 7312 ns/iter (± 30) 7329 ns/iter (± 22) 1.00
es/full-target/es2016 233936 ns/iter (± 883) 237909 ns/iter (± 1014) 0.98
es/full-target/es2017 222533 ns/iter (± 689) 226763 ns/iter (± 943) 0.98
es/full-target/es2018 210688 ns/iter (± 972) 213661 ns/iter (± 821) 0.99
es2020_nullish_coalescing 72075 ns/iter (± 420) 71262 ns/iter (± 246) 1.01
es2020_optional_chaining 84958 ns/iter (± 244) 82879 ns/iter (± 218) 1.03
es2022_class_properties 114846 ns/iter (± 324) 116704 ns/iter (± 518) 0.98
es2018_object_rest_spread 77044 ns/iter (± 460) 76087 ns/iter (± 251) 1.01
es2019_optional_catch_binding 65879 ns/iter (± 236) 65037 ns/iter (± 346) 1.01
es2017_async_to_generator 63253 ns/iter (± 206) 65147 ns/iter (± 143) 0.97
es2016_exponentiation 69124 ns/iter (± 268) 68725 ns/iter (± 212) 1.01
es2015_arrow 72868 ns/iter (± 173) 72174 ns/iter (± 210) 1.01
es2015_block_scoped_fn 69405 ns/iter (± 556) 68309 ns/iter (± 142) 1.02
es2015_block_scoping 123659 ns/iter (± 579) 125877 ns/iter (± 879) 0.98

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

Please sign in to comment.