Skip to content

Commit

Permalink
fix(es/minifier): Inline before cloning (#4338)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Apr 15, 2022
1 parent 075c7ff commit 4110fcb
Show file tree
Hide file tree
Showing 9 changed files with 501 additions and 6 deletions.
14 changes: 9 additions & 5 deletions crates/swc_ecma_minifier/src/compress/optimize/hoist_props.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,20 @@ where
return;
}

if let Some(Expr::Object(init)) = n.init.as_deref() {
for prop in &init.props {
if let Some(init) = n.init.as_deref() {
self.mode.store(name.to_id(), init);
}

if let Some(Expr::Object(init)) = n.init.as_deref_mut() {
for prop in &mut init.props {
let prop = match prop {
PropOrSpread::Spread(_) => continue,
PropOrSpread::Prop(prop) => prop,
};

if let Prop::KeyValue(p) = &**prop {
if let Prop::KeyValue(p) = &mut **prop {
self.vars.inline_with_multi_replacer(&mut p.value);

let value = match &*p.value {
Expr::Lit(..) => p.value.clone(),
Expr::Fn(..) | Expr::Arrow(..) => {
Expand All @@ -117,7 +123,6 @@ where
);
self.simple_props
.insert((name.to_id(), s.value.clone()), value);
self.mode.store(name.to_id(), n.init.as_deref().unwrap());
}
PropName::Ident(i) => {
trace_op!(
Expand All @@ -126,7 +131,6 @@ where
);
self.simple_props
.insert((name.to_id(), i.sym.clone()), value);
self.mode.store(name.to_id(), n.init.as_deref().unwrap());
}
_ => {}
}
Expand Down
4 changes: 4 additions & 0 deletions crates/swc_ecma_minifier/src/compress/optimize/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ where
return;
}

self.vars.inline_with_multi_replacer(init);

// TODO: Check for side effect between original decl position and inlined
// position

Expand Down Expand Up @@ -435,6 +437,8 @@ where
// Inline very simple functions.
match decl {
Decl::Fn(f) if self.options.inline >= 2 && f.ident.sym != *"arguments" => {
self.vars.inline_with_multi_replacer(&mut f.function.body);

match &f.function.body {
Some(body) => {
if !UsageFinder::find(&i, body)
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_minifier/src/compress/pure/dead_code.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ impl Pure<'_> {
}
}

/// Returns [Some] if the whole statement sohuld be replaced
/// Returns [Some] if the whole statement should be replaced
fn drop_useless_continue_inner(
&mut self,
label: Option<Ident>,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
TestSnapshot {
vars: [
(
(
Atom('String' type=static),
#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: true,
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: 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('check' type=inline),
#2,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 1,
cond_init: false,
declared: true,
declared_count: 1,
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: true,
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('code' type=inline),
#3,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 2,
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: 1,
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: false,
is_fn_local: true,
used_by_nested_fn: true,
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: true,
pure_fn: false,
infects: [],
},
),
(
(
Atom('regex' type=inline),
#2,
),
VarUsageInfo {
inline_prevented: false,
ref_count: 1,
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: 1,
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: false,
used_by_nested_fn: true,
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('regexCheck' type=dynamic),
#1,
),
VarUsageInfo {
inline_prevented: true,
ref_count: 0,
cond_init: false,
declared: true,
declared_count: 1,
declared_as_fn_param: false,
declared_as_fn_expr: false,
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: true,
used_by_nested_fn: false,
executed_multiple_time: false,
used_in_cond: false,
var_kind: None,
var_initialized: true,
declared_as_catch_param: false,
no_side_effect_for_member_access: false,
used_as_callee: false,
used_as_arg: false,
pure_fn: false,
infects: [],
},
),
],
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* Create a code check from a regex.
*
* @param {RegExp} regex
* @returns {(code: Code) => code is number}
*/
export function regexCheck(regex) {
return check

/**
* Check whether a code matches the bound regex.
*
* @param {Code} code Character code
* @returns {code is number} Whether the character code matches the bound regex
*/
function check(code) {
return code !== null && regex.test(String.fromCharCode(code))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export function regexCheck(regex) {
return function(code) {
return null !== code && regex.test(String.fromCharCode(code));
};
}

1 comment on commit 4110fcb

@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: 4110fcb Previous: 4c99730 Ratio
codegen_es3 34658 ns/iter (± 206) 35125 ns/iter (± 941) 0.99
codegen_es5 34658 ns/iter (± 318) 35197 ns/iter (± 2279) 0.98
codegen_es2015 34694 ns/iter (± 202) 35235 ns/iter (± 1358) 0.98
codegen_es2016 34708 ns/iter (± 236) 34521 ns/iter (± 2090) 1.01
codegen_es2017 34725 ns/iter (± 216) 35235 ns/iter (± 1106) 0.99
codegen_es2018 36179 ns/iter (± 2012) 35093 ns/iter (± 1494) 1.03
codegen_es2019 34636 ns/iter (± 324) 35065 ns/iter (± 1461) 0.99
codegen_es2020 34689 ns/iter (± 216) 35419 ns/iter (± 1717) 0.98
full_es3 215049167 ns/iter (± 2022423) 216266359 ns/iter (± 6930574) 0.99
full_es5 207110502 ns/iter (± 9342094) 203093727 ns/iter (± 4451889) 1.02
full_es2015 164757309 ns/iter (± 3261081) 162978798 ns/iter (± 4934215) 1.01
full_es2016 164068921 ns/iter (± 3118123) 163168590 ns/iter (± 5040345) 1.01
full_es2017 163355476 ns/iter (± 3984277) 162611440 ns/iter (± 7139193) 1.00
full_es2018 163599945 ns/iter (± 6356205) 158800049 ns/iter (± 6712229) 1.03
full_es2019 160088836 ns/iter (± 3033889) 159829211 ns/iter (± 4295205) 1.00
full_es2020 154273845 ns/iter (± 4047767) 154465697 ns/iter (± 3962093) 1.00
parser 674756 ns/iter (± 18388) 729570 ns/iter (± 54495) 0.92
base_tr_fixer 27891 ns/iter (± 346) 32001 ns/iter (± 1215) 0.87
base_tr_resolver_and_hygiene 146465 ns/iter (± 2308) 160874 ns/iter (± 12527) 0.91
serialization of ast node 163 ns/iter (± 0) 169 ns/iter (± 6) 0.96
serialization of serde 176 ns/iter (± 0) 171 ns/iter (± 6) 1.03
colors 66048 ns/iter (± 574) 72810 ns/iter (± 5500) 0.91
large 376063 ns/iter (± 5272) 404658 ns/iter (± 24050) 0.93
colors 61609 ns/iter (± 699) 72810 ns/iter (± 5500) 0.85
large 664093 ns/iter (± 7142) 404658 ns/iter (± 24050) 1.64
libs/antd 2411276813 ns/iter (± 34860524) 2500081840 ns/iter (± 18090850) 0.96
libs/d3 326148502 ns/iter (± 5139659) 323249044 ns/iter (± 11614001) 1.01
libs/echarts 1683876180 ns/iter (± 10700091) 1812791879 ns/iter (± 43154410) 0.93
libs/jquery 82046623 ns/iter (± 2113515) 81030407 ns/iter (± 2022083) 1.01
libs/lodash 94794531 ns/iter (± 2224512) 90928224 ns/iter (± 2158592) 1.04
libs/moment 49606355 ns/iter (± 2391079) 47750968 ns/iter (± 1636971) 1.04
libs/react 16632506 ns/iter (± 313243) 16761534 ns/iter (± 294955) 0.99
libs/terser 478332545 ns/iter (± 10391404) 669546897 ns/iter (± 23468505) 0.71
libs/three 498192689 ns/iter (± 9928164) 518765325 ns/iter (± 26731695) 0.96
libs/typescript 5298588674 ns/iter (± 105545371) 5703778365 ns/iter (± 89325348) 0.93
libs/victory 883024717 ns/iter (± 19268592) 898407922 ns/iter (± 19474974) 0.98
libs/vue 114622413 ns/iter (± 1491950) 111860181 ns/iter (± 3080938) 1.02
clone 2890856 ns/iter (± 127023) 2771546 ns/iter (± 178968) 1.04
visit_mut_span 3483813 ns/iter (± 143919) 3361899 ns/iter (± 235793) 1.04
visit_mut_span_panic 3354569 ns/iter (± 46497) 3419580 ns/iter (± 248318) 0.98
fold_span 4578790 ns/iter (± 77651) 4751907 ns/iter (± 285168) 0.96
fold_span_panic 5001078 ns/iter (± 209690) 4848794 ns/iter (± 246324) 1.03
colors 25274 ns/iter (± 82) 72810 ns/iter (± 5500) 0.35
angular 12490543 ns/iter (± 500843) 11465500 ns/iter (± 497163) 1.09
backbone 1604336 ns/iter (± 16793) 1560767 ns/iter (± 46558) 1.03
jquery 8668725 ns/iter (± 33709) 8328067 ns/iter (± 279439) 1.04
jquery mobile 14014057 ns/iter (± 66903) 13294012 ns/iter (± 364225) 1.05
mootools 6652603 ns/iter (± 30143) 6501662 ns/iter (± 232974) 1.02
underscore 1344371 ns/iter (± 7305) 1319126 ns/iter (± 52137) 1.02
three 39479287 ns/iter (± 214090) 38529466 ns/iter (± 1310387) 1.02
yui 7606324 ns/iter (± 224035) 7079669 ns/iter (± 233106) 1.07
colors 42169 ns/iter (± 2746) 72810 ns/iter (± 5500) 0.58
angular 21223711 ns/iter (± 291745) 11465500 ns/iter (± 497163) 1.85
backbone 2925168 ns/iter (± 24858) 1560767 ns/iter (± 46558) 1.87
jquery 15810797 ns/iter (± 294542) 8328067 ns/iter (± 279439) 1.90
jquery mobile 25366685 ns/iter (± 688949) 13294012 ns/iter (± 364225) 1.91
mootools 12284879 ns/iter (± 214052) 6501662 ns/iter (± 232974) 1.89
underscore 2483781 ns/iter (± 22050) 1319126 ns/iter (± 52137) 1.88
three 75649430 ns/iter (± 924309) 38529466 ns/iter (± 1310387) 1.96
yui 12469580 ns/iter (± 157007) 7079669 ns/iter (± 233106) 1.76
usage_builtin_type 150154 ns/iter (± 6551) 166322 ns/iter (± 10135) 0.90
usage_property 36682 ns/iter (± 2991) 42202 ns/iter (± 1613) 0.87
resolver 176062 ns/iter (± 2220) 188701 ns/iter (± 7514) 0.93
fixer 156941 ns/iter (± 7951) 162420 ns/iter (± 6649) 0.97
hygiene 431135 ns/iter (± 2548) 440745 ns/iter (± 14806) 0.98
resolver_with_hygiene 511431 ns/iter (± 7407) 533400 ns/iter (± 24411) 0.96
module_clone 116683 ns/iter (± 6052) 122845 ns/iter (± 8111) 0.95
fold_empty 127575 ns/iter (± 2526) 137802 ns/iter (± 11571) 0.93
fold_noop_impl_all 128669 ns/iter (± 2610) 135326 ns/iter (± 5489) 0.95
fold_noop_impl_vec 128445 ns/iter (± 2149) 142751 ns/iter (± 9885) 0.90
boxing_boxed_clone 82 ns/iter (± 0) 77 ns/iter (± 3) 1.06
boxing_unboxed_clone 127 ns/iter (± 0) 127 ns/iter (± 11) 1
boxing_boxed 160 ns/iter (± 0) 148 ns/iter (± 4) 1.08
boxing_unboxed 195 ns/iter (± 0) 192 ns/iter (± 13) 1.02
visit_contains_this 4369 ns/iter (± 127) 4584 ns/iter (± 348) 0.95
time 5 127 ns/iter (± 7) 113 ns/iter (± 26) 1.12
time 10 369 ns/iter (± 1) 346 ns/iter (± 17) 1.07
time 15 796 ns/iter (± 18) 758 ns/iter (± 30) 1.05
time 20 1370 ns/iter (± 20) 1409 ns/iter (± 75) 0.97
time 40 4913 ns/iter (± 164) 5128 ns/iter (± 243) 0.96
time 60 10351 ns/iter (± 17) 10541 ns/iter (± 413) 0.98
es2016 303872 ns/iter (± 1666) 302615 ns/iter (± 10872) 1.00
es2017 285980 ns/iter (± 1903) 288513 ns/iter (± 12035) 0.99
es2018 272450 ns/iter (± 2312) 273489 ns/iter (± 15107) 1.00
es2020_nullish_coalescing 139631 ns/iter (± 1256) 147857 ns/iter (± 5420) 0.94
es2020_optional_chaining 183196 ns/iter (± 8186) 183026 ns/iter (± 7224) 1.00
es2022_class_properties 186758 ns/iter (± 7402) 187015 ns/iter (± 9245) 1.00
es2018_object_rest_spread 129033 ns/iter (± 2220) 137075 ns/iter (± 5856) 0.94
es2019_optional_catch_binding 118826 ns/iter (± 4755) 125848 ns/iter (± 4657) 0.94
es2017_async_to_generator 112741 ns/iter (± 2051) 123976 ns/iter (± 4977) 0.91
es2016_exponentiation 137939 ns/iter (± 971) 146056 ns/iter (± 7691) 0.94
es2015_arrow 140531 ns/iter (± 913) 153068 ns/iter (± 5522) 0.92
es2015_block_scoped_fn 139431 ns/iter (± 785) 147476 ns/iter (± 12431) 0.95
es2015_block_scoping 236882 ns/iter (± 1625) 243591 ns/iter (± 12579) 0.97
es2015_classes 199966 ns/iter (± 1725) 212775 ns/iter (± 8401) 0.94
es2015_computed_props 114376 ns/iter (± 2266) 124342 ns/iter (± 5005) 0.92
es2015_destructuring 209209 ns/iter (± 1589) 217725 ns/iter (± 8930) 0.96
es2015_duplicate_keys 119010 ns/iter (± 2756) 130091 ns/iter (± 5333) 0.91
es2015_parameters 148648 ns/iter (± 966) 161629 ns/iter (± 5296) 0.92
es2015_fn_name 117915 ns/iter (± 2408) 130117 ns/iter (± 5302) 0.91
es2015_for_of 136069 ns/iter (± 838) 144564 ns/iter (± 4852) 0.94
es2015_instanceof 127290 ns/iter (± 915) 134225 ns/iter (± 6050) 0.95
es2015_shorthand_property 112642 ns/iter (± 2415) 127112 ns/iter (± 5763) 0.89
es2015_spread 114616 ns/iter (± 9442) 127669 ns/iter (± 4696) 0.90
es2015_sticky_regex 114903 ns/iter (± 2466) 127260 ns/iter (± 4730) 0.90
es2015_typeof_symbol 115685 ns/iter (± 2727) 128726 ns/iter (± 8351) 0.90
base 99408 ns/iter (± 2328) 112190 ns/iter (± 5349) 0.89
common_reserved_word 115889 ns/iter (± 2661) 129983 ns/iter (± 9579) 0.89
common_typescript 249910 ns/iter (± 1676) 255922 ns/iter (± 9245) 0.98
es3 306067 ns/iter (± 1144) 318455 ns/iter (± 38049) 0.96
es2015 885381 ns/iter (± 3314) 868951 ns/iter (± 28538) 1.02
es2016 #2 138602 ns/iter (± 762) 149618 ns/iter (± 7582) 0.93
es2017 #2 112924 ns/iter (± 2499) 125863 ns/iter (± 5972) 0.90
es2018 #2 142538 ns/iter (± 2158) 150086 ns/iter (± 7225) 0.95
es2020 218000 ns/iter (± 1749) 227798 ns/iter (± 10932) 0.96
babelify_only 798448 ns/iter (± 8497) 814395 ns/iter (± 36687) 0.98
parse_and_babelify_angular 81315126 ns/iter (± 1286073) 75614467 ns/iter (± 2135065) 1.08
parse_and_babelify_backbone 8068431 ns/iter (± 185667) 7814353 ns/iter (± 325488) 1.03
parse_and_babelify_jquery 54176932 ns/iter (± 939720) 55032860 ns/iter (± 2092019) 0.98
parse_and_babelify_jquery_mobile 96507467 ns/iter (± 1574454) 97926698 ns/iter (± 2751745) 0.99
parse_and_babelify_mootools 41964436 ns/iter (± 1689324) 44338461 ns/iter (± 1403224) 0.95
parse_and_babelify_underscore 6989435 ns/iter (± 257467) 6843237 ns/iter (± 287735) 1.02
parse_and_babelify_yui 40947203 ns/iter (± 1417220) 45406184 ns/iter (± 1536965) 0.90

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

Please sign in to comment.