Skip to content

Commit d8bcf64

Browse files
authored
Optimize away sets of the same local (#1940)
1 parent 1a5b410 commit d8bcf64

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+226
-941
lines changed

auto_update_tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,11 @@ def main():
428428
update_example_tests()
429429
update_wasm_dis_tests()
430430
update_wasm_merge_tests()
431-
update_binaryen_js_tests()
432431
update_ctor_eval_tests()
433432
update_wasm2js_tests()
434433
update_metadce_tests()
435434
update_reduce_tests()
435+
update_binaryen_js_tests()
436436

437437
print '\n[ success! ]'
438438

src/ir/local-utils.h

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ struct GetLocalCounter : public PostWalker<GetLocalCounter> {
4646
}
4747
};
4848

49+
// Removes trivially unneeded sets: sets for whom there is no possible get, and
50+
// sets of the same value immediately.
4951
struct UnneededSetRemover : public PostWalker<UnneededSetRemover> {
5052
PassOptions& passOptions;
5153

@@ -64,19 +66,42 @@ struct UnneededSetRemover : public PostWalker<UnneededSetRemover> {
6466
bool removed = false;
6567

6668
void visitSetLocal(SetLocal *curr) {
69+
// If no possible uses, remove.
6770
if (getLocalCounter->num[curr->index] == 0) {
68-
auto* value = curr->value;
69-
if (curr->isTee()) {
70-
this->replaceCurrent(value);
71-
} else if (EffectAnalyzer(passOptions, curr->value).hasSideEffects()) {
72-
Drop* drop = ExpressionManipulator::convert<SetLocal, Drop>(curr);
73-
drop->value = value;
74-
drop->finalize();
75-
} else {
76-
ExpressionManipulator::nop(curr);
71+
remove(curr);
72+
}
73+
// If setting the same value as we already have, remove.
74+
auto* value = curr->value;
75+
while (true) {
76+
if (auto* set = value->dynCast<SetLocal>()) {
77+
if (set->index == curr->index) {
78+
remove(curr);
79+
} else {
80+
// Handle tee chains.
81+
value = set->value;
82+
continue;
83+
}
84+
} else if (auto* get = value->dynCast<GetLocal>()) {
85+
if (get->index == curr->index) {
86+
remove(curr);
87+
}
7788
}
78-
removed = true;
89+
break;
90+
}
91+
}
92+
93+
void remove(SetLocal* set) {
94+
auto* value = set->value;
95+
if (set->isTee()) {
96+
replaceCurrent(value);
97+
} else if (EffectAnalyzer(passOptions, set->value).hasSideEffects()) {
98+
Drop* drop = ExpressionManipulator::convert<SetLocal, Drop>(set);
99+
drop->value = value;
100+
drop->finalize();
101+
} else {
102+
ExpressionManipulator::nop(set);
79103
}
104+
removed = true;
80105
}
81106
};
82107

src/passes/CoalesceLocals.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ struct CoalesceLocals : public WalkerPass<LivenessWalker<CoalesceLocals, Visitor
7575
interferences[low * numLocals + high] = 1;
7676
}
7777

78+
void unInterfere(Index i, Index j) {
79+
interferences[std::min(i, j) * numLocals + std::max(i, j)] = 0;
80+
}
81+
7882
bool interferes(Index i, Index j) {
7983
return interferences[std::min(i, j) * numLocals + std::max(i, j)];
8084
}

test/emcc_hello_world.fromasm

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,6 +2033,9 @@
20332033
(local $48 i32)
20342034
(local $49 i32)
20352035
(local $50 i32)
2036+
(local.set $4
2037+
(i32.const 672)
2038+
)
20362039
(local.set $28
20372040
(global.get $STACKTOP)
20382041
)
@@ -2078,7 +2081,7 @@
20782081
(local.set $38
20792082
(local.tee $25
20802083
(i32.add
2081-
(local.tee $4
2084+
(local.tee $19
20822085
(i32.add
20832086
(local.get $13)
20842087
(i32.const 536)
@@ -2090,13 +2093,13 @@
20902093
)
20912094
(local.set $39
20922095
(i32.add
2093-
(local.get $4)
2096+
(local.get $19)
20942097
(i32.const 39)
20952098
)
20962099
)
20972100
(local.set $33
20982101
(i32.add
2099-
(local.tee $4
2102+
(local.tee $19
21002103
(i32.add
21012104
(local.get $13)
21022105
(i32.const 576)
@@ -2107,7 +2110,7 @@
21072110
)
21082111
(local.set $40
21092112
(i32.add
2110-
(local.get $4)
2113+
(local.get $19)
21112114
(i32.const 11)
21122115
)
21132116
)
@@ -2163,8 +2166,8 @@
21632166
(i32.const 8)
21642167
)
21652168
)
2166-
(local.set $4
2167-
(i32.const 672)
2169+
(local.set $19
2170+
(i32.const 0)
21682171
)
21692172
(block $label$break$L343
21702173
(block $__rjti$9
@@ -6623,7 +6626,7 @@
66236626
)
66246627
(loop $while-in130
66256628
(if
6626-
(local.tee $19
6629+
(local.tee $4
66276630
(i32.load
66286631
(i32.add
66296632
(i32.shl
@@ -6643,7 +6646,7 @@
66436646
)
66446647
(local.get $2)
66456648
)
6646-
(local.get $19)
6649+
(local.get $4)
66476650
(local.get $1)
66486651
)
66496652
(br_if $while-in130

test/emcc_hello_world.fromasm.clamp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,6 +2083,9 @@
20832083
(local $48 i32)
20842084
(local $49 i32)
20852085
(local $50 i32)
2086+
(local.set $4
2087+
(i32.const 672)
2088+
)
20862089
(local.set $28
20872090
(global.get $STACKTOP)
20882091
)
@@ -2128,7 +2131,7 @@
21282131
(local.set $38
21292132
(local.tee $25
21302133
(i32.add
2131-
(local.tee $4
2134+
(local.tee $19
21322135
(i32.add
21332136
(local.get $13)
21342137
(i32.const 536)
@@ -2140,13 +2143,13 @@
21402143
)
21412144
(local.set $39
21422145
(i32.add
2143-
(local.get $4)
2146+
(local.get $19)
21442147
(i32.const 39)
21452148
)
21462149
)
21472150
(local.set $33
21482151
(i32.add
2149-
(local.tee $4
2152+
(local.tee $19
21502153
(i32.add
21512154
(local.get $13)
21522155
(i32.const 576)
@@ -2157,7 +2160,7 @@
21572160
)
21582161
(local.set $40
21592162
(i32.add
2160-
(local.get $4)
2163+
(local.get $19)
21612164
(i32.const 11)
21622165
)
21632166
)
@@ -2213,8 +2216,8 @@
22132216
(i32.const 8)
22142217
)
22152218
)
2216-
(local.set $4
2217-
(i32.const 672)
2219+
(local.set $19
2220+
(i32.const 0)
22182221
)
22192222
(block $label$break$L343
22202223
(block $__rjti$9
@@ -6673,7 +6676,7 @@
66736676
)
66746677
(loop $while-in130
66756678
(if
6676-
(local.tee $19
6679+
(local.tee $4
66776680
(i32.load
66786681
(i32.add
66796682
(i32.shl
@@ -6693,7 +6696,7 @@
66936696
)
66946697
(local.get $2)
66956698
)
6696-
(local.get $19)
6699+
(local.get $4)
66976700
(local.get $1)
66986701
)
66996702
(br_if $while-in130

test/emcc_hello_world.fromasm.imprecise

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1967,6 +1967,9 @@
19671967
(local $47 i32)
19681968
(local $48 i32)
19691969
(local $49 i32)
1970+
(local.set $4
1971+
(i32.const 672)
1972+
)
19701973
(local.set $28
19711974
(global.get $STACKTOP)
19721975
)
@@ -2012,7 +2015,7 @@
20122015
(local.set $38
20132016
(local.tee $25
20142017
(i32.add
2015-
(local.tee $4
2018+
(local.tee $19
20162019
(i32.add
20172020
(local.get $13)
20182021
(i32.const 536)
@@ -2024,13 +2027,13 @@
20242027
)
20252028
(local.set $39
20262029
(i32.add
2027-
(local.get $4)
2030+
(local.get $19)
20282031
(i32.const 39)
20292032
)
20302033
)
20312034
(local.set $33
20322035
(i32.add
2033-
(local.tee $4
2036+
(local.tee $19
20342037
(i32.add
20352038
(local.get $13)
20362039
(i32.const 576)
@@ -2041,7 +2044,7 @@
20412044
)
20422045
(local.set $40
20432046
(i32.add
2044-
(local.get $4)
2047+
(local.get $19)
20452048
(i32.const 11)
20462049
)
20472050
)
@@ -2097,8 +2100,8 @@
20972100
(i32.const 8)
20982101
)
20992102
)
2100-
(local.set $4
2101-
(i32.const 672)
2103+
(local.set $19
2104+
(i32.const 0)
21022105
)
21032106
(block $label$break$L343
21042107
(block $__rjti$9
@@ -6519,7 +6522,7 @@
65196522
)
65206523
(loop $while-in130
65216524
(if
6522-
(local.tee $19
6525+
(local.tee $4
65236526
(i32.load
65246527
(i32.add
65256528
(i32.shl
@@ -6539,7 +6542,7 @@
65396542
)
65406543
(local.get $2)
65416544
)
6542-
(local.get $19)
6545+
(local.get $4)
65436546
(local.get $1)
65446547
)
65456548
(br_if $while-in130

test/passes/flatten_dfo_O3.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
)
4141
(func $4 (; 4 ;) (; has Stack IR ;) (type $3) (param $0 f64) (result f64)
4242
(local $1 i32)
43-
(local $2 i32)
4443
(loop $label$1
4544
(br $label$1)
4645
)

test/passes/flatten_simplify-locals-nonesting_souperify-single-use.txt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3571,9 +3571,7 @@ infer %4
35713571
)
35723572
(nop)
35733573
(nop)
3574-
(local.set $y
3575-
(local.get $y)
3576-
)
3574+
(nop)
35773575
(nop)
35783576
(nop)
35793577
(br_if $loopy
@@ -4324,9 +4322,7 @@ infer %4
43244322
(nop)
43254323
)
43264324
(nop)
4327-
(local.set $var$0
4328-
(local.get $var$0)
4329-
)
4325+
(nop)
43304326
(nop)
43314327
(loop $label$6
43324328
(block $label$7
@@ -4370,9 +4366,7 @@ infer %4
43704366
(nop)
43714367
)
43724368
(nop)
4373-
(local.set $var$1
4374-
(local.get $var$1)
4375-
)
4369+
(nop)
43764370
(nop)
43774371
(br $label$1)
43784372
(unreachable)
@@ -5055,9 +5049,7 @@ infer %4
50555049
(nop)
50565050
(nop)
50575051
(nop)
5058-
(local.set $var$2
5059-
(local.get $var$2)
5060-
)
5052+
(nop)
50615053
(nop)
50625054
(br $label$1)
50635055
(unreachable)

0 commit comments

Comments
 (0)