Skip to content

Commit be001f7

Browse files
authored
[Parser] Re-use blocks instead of wrapping where possible (#6552)
When the input has branches to block scope, IR builder generally has to add a wrapper block with a label name for the branch to target. To reduce the parsed IR size, add a special case for when the wrapped expression is already an unnamed block. In that case we can simply add the label to the existing block instead of creating a new wrapper block.
1 parent dcc5b7b commit be001f7

File tree

4 files changed

+74
-81
lines changed

4 files changed

+74
-81
lines changed

src/wasm/wasm-ir-builder.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -929,13 +929,18 @@ Result<> IRBuilder::visitEnd() {
929929
auto maybeWrapForLabel = [&](Expression* curr) -> Expression* {
930930
bool isTry = scope.getTry() || scope.getCatch() || scope.getCatchAll();
931931
auto& label = isTry ? scope.branchLabel : scope.label;
932-
if (label) {
933-
return builder.makeBlock(label,
934-
{curr},
935-
scope.labelUsed ? originalScopeType
936-
: scope.getResultType());
932+
if (!label) {
933+
return curr;
937934
}
938-
return curr;
935+
auto blockType =
936+
scope.labelUsed ? originalScopeType : scope.getResultType();
937+
// We can re-use unnamed blocks instead of wrapping them.
938+
if (auto* block = curr->dynCast<Block>(); block && !block->name) {
939+
block->name = label;
940+
block->type = blockType;
941+
return block;
942+
}
943+
return builder.makeBlock(label, {curr}, blockType);
939944
};
940945

941946
if (auto* func = scope.getFunction()) {

test/lit/passes/type-merging-tnh.wast

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,20 @@
5656

5757
;; CHECK: (func $test (type $2) (param $a (ref $A)) (result (ref $B))
5858
;; CHECK-NEXT: (block $label (result (ref $B))
59-
;; CHECK-NEXT: (block (result (ref $B))
60-
;; CHECK-NEXT: (drop
61-
;; CHECK-NEXT: (br_on_cast $label (ref $A) (ref $B)
62-
;; CHECK-NEXT: (local.get $a)
63-
;; CHECK-NEXT: )
59+
;; CHECK-NEXT: (drop
60+
;; CHECK-NEXT: (br_on_cast $label (ref $A) (ref $B)
61+
;; CHECK-NEXT: (local.get $a)
6462
;; CHECK-NEXT: )
65-
;; CHECK-NEXT: (drop
66-
;; CHECK-NEXT: (block $l (result (ref $A))
67-
;; CHECK-NEXT: (br_on_non_null $l
68-
;; CHECK-NEXT: (local.get $a)
69-
;; CHECK-NEXT: )
70-
;; CHECK-NEXT: (unreachable)
63+
;; CHECK-NEXT: )
64+
;; CHECK-NEXT: (drop
65+
;; CHECK-NEXT: (block $l (result (ref $A))
66+
;; CHECK-NEXT: (br_on_non_null $l
67+
;; CHECK-NEXT: (local.get $a)
7168
;; CHECK-NEXT: )
69+
;; CHECK-NEXT: (unreachable)
7270
;; CHECK-NEXT: )
73-
;; CHECK-NEXT: (unreachable)
7471
;; CHECK-NEXT: )
72+
;; CHECK-NEXT: (unreachable)
7573
;; CHECK-NEXT: )
7674
;; CHECK-NEXT: )
7775
(func $test (param $a (ref $A)) (result (ref $B))

test/lit/passes/type-merging.wast

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,22 +1053,20 @@
10531053

10541054
;; CHECK: (func $test (type $2) (param $a (ref $A)) (result (ref $B))
10551055
;; CHECK-NEXT: (block $label (result (ref $B))
1056-
;; CHECK-NEXT: (block (result (ref $B))
1057-
;; CHECK-NEXT: (drop
1058-
;; CHECK-NEXT: (br_on_cast $label (ref $A) (ref $B)
1059-
;; CHECK-NEXT: (local.get $a)
1060-
;; CHECK-NEXT: )
1056+
;; CHECK-NEXT: (drop
1057+
;; CHECK-NEXT: (br_on_cast $label (ref $A) (ref $B)
1058+
;; CHECK-NEXT: (local.get $a)
10611059
;; CHECK-NEXT: )
1062-
;; CHECK-NEXT: (drop
1063-
;; CHECK-NEXT: (block $l (result (ref $A))
1064-
;; CHECK-NEXT: (br_on_non_null $l
1065-
;; CHECK-NEXT: (local.get $a)
1066-
;; CHECK-NEXT: )
1067-
;; CHECK-NEXT: (unreachable)
1060+
;; CHECK-NEXT: )
1061+
;; CHECK-NEXT: (drop
1062+
;; CHECK-NEXT: (block $l (result (ref $A))
1063+
;; CHECK-NEXT: (br_on_non_null $l
1064+
;; CHECK-NEXT: (local.get $a)
10681065
;; CHECK-NEXT: )
1066+
;; CHECK-NEXT: (unreachable)
10691067
;; CHECK-NEXT: )
1070-
;; CHECK-NEXT: (unreachable)
10711068
;; CHECK-NEXT: )
1069+
;; CHECK-NEXT: (unreachable)
10721070
;; CHECK-NEXT: )
10731071
;; CHECK-NEXT: )
10741072
(func $test (param $a (ref $A)) (result (ref $B))

test/lit/wat-kitchen-sink.wast

Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
(type $ret2 (func (result i32 i32)))
1414

1515
(rec
16-
;; CHECK: (type $3 (func (result i32 i64)))
17-
1816
;; CHECK: (type $pair (struct (field $first (mut i32)) (field $second (mut i64))))
1917

18+
;; CHECK: (type $4 (func (result i32 i64)))
19+
2020
;; CHECK: (type $5 (func (param i32 i64)))
2121

2222
;; CHECK: (type $a2 (array (mut f32)))
@@ -323,7 +323,7 @@
323323

324324
;; CHECK: (import "mod" "f5" (func $fimport$0 (type $void)))
325325

326-
;; CHECK: (import "mod" "imported-f" (func $fimport$1 (type $3) (result i32 i64)))
326+
;; CHECK: (import "mod" "imported-f" (func $fimport$1 (type $4) (result i32 i64)))
327327

328328
;; CHECK: (import "mod" "t0" (tag $imported (param i32 i64)))
329329

@@ -1877,8 +1877,8 @@
18771877
end
18781878
)
18791879

1880-
;; CHECK: (func $try-catch-params (type $3) (result i32 i64)
1881-
;; CHECK-NEXT: (try (type $3) (result i32 i64)
1880+
;; CHECK: (func $try-catch-params (type $4) (result i32 i64)
1881+
;; CHECK-NEXT: (try (type $4) (result i32 i64)
18821882
;; CHECK-NEXT: (do
18831883
;; CHECK-NEXT: (tuple.make 2
18841884
;; CHECK-NEXT: (i32.const 0)
@@ -1898,8 +1898,8 @@
18981898
end
18991899
)
19001900

1901-
;; CHECK: (func $try-catch-pop (type $3) (result i32 i64)
1902-
;; CHECK-NEXT: (try (type $3) (result i32 i64)
1901+
;; CHECK: (func $try-catch-pop (type $4) (result i32 i64)
1902+
;; CHECK-NEXT: (try (type $4) (result i32 i64)
19031903
;; CHECK-NEXT: (do
19041904
;; CHECK-NEXT: (tuple.make 2
19051905
;; CHECK-NEXT: (i32.const 0)
@@ -2670,13 +2670,11 @@
26702670

26712671
;; CHECK: (func $label-func (type $void)
26722672
;; CHECK-NEXT: (block $label
2673-
;; CHECK-NEXT: (block
2673+
;; CHECK-NEXT: (br $label)
2674+
;; CHECK-NEXT: (block $a
26742675
;; CHECK-NEXT: (br $label)
2675-
;; CHECK-NEXT: (block $a
2676+
;; CHECK-NEXT: (block $b
26762677
;; CHECK-NEXT: (br $label)
2677-
;; CHECK-NEXT: (block $b
2678-
;; CHECK-NEXT: (br $label)
2679-
;; CHECK-NEXT: )
26802678
;; CHECK-NEXT: )
26812679
;; CHECK-NEXT: )
26822680
;; CHECK-NEXT: )
@@ -2705,13 +2703,11 @@
27052703

27062704
;; CHECK: (func $br-value-drop (type $1) (result i32)
27072705
;; CHECK-NEXT: (block $label (result i32)
2708-
;; CHECK-NEXT: (block (result i32)
2709-
;; CHECK-NEXT: (drop
2710-
;; CHECK-NEXT: (f32.const 0)
2711-
;; CHECK-NEXT: )
2712-
;; CHECK-NEXT: (br $label
2713-
;; CHECK-NEXT: (i32.const 1)
2714-
;; CHECK-NEXT: )
2706+
;; CHECK-NEXT: (drop
2707+
;; CHECK-NEXT: (f32.const 0)
2708+
;; CHECK-NEXT: )
2709+
;; CHECK-NEXT: (br $label
2710+
;; CHECK-NEXT: (i32.const 1)
27152711
;; CHECK-NEXT: )
27162712
;; CHECK-NEXT: )
27172713
;; CHECK-NEXT: )
@@ -2721,8 +2717,8 @@
27212717
br 0
27222718
)
27232719

2724-
;; CHECK: (func $br-multivalue (type $3) (result i32 i64)
2725-
;; CHECK-NEXT: (block $label (type $3) (result i32 i64)
2720+
;; CHECK: (func $br-multivalue (type $4) (result i32 i64)
2721+
;; CHECK-NEXT: (block $label (type $4) (result i32 i64)
27262722
;; CHECK-NEXT: (br $label
27272723
;; CHECK-NEXT: (tuple.make 2
27282724
;; CHECK-NEXT: (i32.const 0)
@@ -2737,17 +2733,15 @@
27372733
br 0
27382734
)
27392735

2740-
;; CHECK: (func $br-multivalue-drop (type $3) (result i32 i64)
2741-
;; CHECK-NEXT: (block $label (type $3) (result i32 i64)
2742-
;; CHECK-NEXT: (block (type $3) (result i32 i64)
2743-
;; CHECK-NEXT: (drop
2744-
;; CHECK-NEXT: (f32.const 0)
2745-
;; CHECK-NEXT: )
2746-
;; CHECK-NEXT: (br $label
2747-
;; CHECK-NEXT: (tuple.make 2
2748-
;; CHECK-NEXT: (i32.const 1)
2749-
;; CHECK-NEXT: (i64.const 2)
2750-
;; CHECK-NEXT: )
2736+
;; CHECK: (func $br-multivalue-drop (type $4) (result i32 i64)
2737+
;; CHECK-NEXT: (block $label (type $4) (result i32 i64)
2738+
;; CHECK-NEXT: (drop
2739+
;; CHECK-NEXT: (f32.const 0)
2740+
;; CHECK-NEXT: )
2741+
;; CHECK-NEXT: (br $label
2742+
;; CHECK-NEXT: (tuple.make 2
2743+
;; CHECK-NEXT: (i32.const 1)
2744+
;; CHECK-NEXT: (i64.const 2)
27512745
;; CHECK-NEXT: )
27522746
;; CHECK-NEXT: )
27532747
;; CHECK-NEXT: )
@@ -2939,9 +2933,9 @@
29392933
end
29402934
)
29412935

2942-
;; CHECK: (func $br-table-multivalue (type $3) (result i32 i64)
2943-
;; CHECK-NEXT: (block $a (type $3) (result i32 i64)
2944-
;; CHECK-NEXT: (block $b (type $3) (result i32 i64)
2936+
;; CHECK: (func $br-table-multivalue (type $4) (result i32 i64)
2937+
;; CHECK-NEXT: (block $a (type $4) (result i32 i64)
2938+
;; CHECK-NEXT: (block $b (type $4) (result i32 i64)
29452939
;; CHECK-NEXT: (br_table $a $b
29462940
;; CHECK-NEXT: (tuple.make 2
29472941
;; CHECK-NEXT: (i32.const 42)
@@ -3669,7 +3663,7 @@
36693663
return
36703664
)
36713665

3672-
;; CHECK: (func $return-multivalue (type $3) (result i32 i64)
3666+
;; CHECK: (func $return-multivalue (type $4) (result i32 i64)
36733667
;; CHECK-NEXT: (return
36743668
;; CHECK-NEXT: (call $return-multivalue)
36753669
;; CHECK-NEXT: )
@@ -5086,26 +5080,24 @@
50865080
;; CHECK: (func $resume (type $91) (param $ct (ref $simple-cont))
50875081
;; CHECK-NEXT: (local $f f32)
50885082
;; CHECK-NEXT: (block $label
5089-
;; CHECK-NEXT: (block
5090-
;; CHECK-NEXT: (drop
5091-
;; CHECK-NEXT: (block $block (result (ref $to-f32-cont))
5092-
;; CHECK-NEXT: (tuple.drop 3
5093-
;; CHECK-NEXT: (block $block0 (type $37) (result i32 i64 (ref null $simple-cont))
5094-
;; CHECK-NEXT: (local.set $f
5095-
;; CHECK-NEXT: (resume $simple-cont (tag $empty $block) (tag $tag-pair-to-pair $block0)
5096-
;; CHECK-NEXT: (i32.const 0)
5097-
;; CHECK-NEXT: (i64.const 1)
5098-
;; CHECK-NEXT: (local.get $ct)
5099-
;; CHECK-NEXT: )
5083+
;; CHECK-NEXT: (drop
5084+
;; CHECK-NEXT: (block $block (result (ref $to-f32-cont))
5085+
;; CHECK-NEXT: (tuple.drop 3
5086+
;; CHECK-NEXT: (block $block0 (type $37) (result i32 i64 (ref null $simple-cont))
5087+
;; CHECK-NEXT: (local.set $f
5088+
;; CHECK-NEXT: (resume $simple-cont (tag $empty $block) (tag $tag-pair-to-pair $block0)
5089+
;; CHECK-NEXT: (i32.const 0)
5090+
;; CHECK-NEXT: (i64.const 1)
5091+
;; CHECK-NEXT: (local.get $ct)
51005092
;; CHECK-NEXT: )
5101-
;; CHECK-NEXT: (unreachable)
51025093
;; CHECK-NEXT: )
5094+
;; CHECK-NEXT: (unreachable)
51035095
;; CHECK-NEXT: )
5104-
;; CHECK-NEXT: (unreachable)
51055096
;; CHECK-NEXT: )
5097+
;; CHECK-NEXT: (unreachable)
51065098
;; CHECK-NEXT: )
5107-
;; CHECK-NEXT: (br $label)
51085099
;; CHECK-NEXT: )
5100+
;; CHECK-NEXT: (br $label)
51095101
;; CHECK-NEXT: )
51105102
;; CHECK-NEXT: )
51115103
(func $resume (param $ct (ref $simple-cont))
@@ -5148,7 +5140,7 @@
51485140
cont.bind $cont-bind-before $simple-cont
51495141
)
51505142

5151-
;; CHECK: (func $suspend (type $3) (result i32 i64)
5143+
;; CHECK: (func $suspend (type $4) (result i32 i64)
51525144
;; CHECK-NEXT: (suspend $tag-pair-to-pair
51535145
;; CHECK-NEXT: (i32.const 123)
51545146
;; CHECK-NEXT: (i64.const 456)

0 commit comments

Comments
 (0)