Skip to content

Commit 25b8e6a

Browse files
authored
Use hints when generating fresh labels in IRBuilder (#7086)
IRBuilder often has to generate new label names for blocks and other scopes. Previously it would generate each new name by starting with "block" or "label" and incrementing a suffix until finding a fresh name, but this made name generation quadratic in the number of names to generate. To spend less time generating names, track a hint index at which to start looking for a fresh name and increment it every time a name is generated. This speeds up a version of the binary parser that uses IRBuilder by about 15%.
1 parent 08b7496 commit 25b8e6a

File tree

8 files changed

+87
-82
lines changed

8 files changed

+87
-82
lines changed

src/wasm-ir-builder.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,16 +507,19 @@ class IRBuilder : public UnifiedExpressionVisitor<IRBuilder, Result<>> {
507507
// its stack.
508508
std::unordered_map<Name, std::vector<Index>> labelDepths;
509509

510-
Name makeFresh(Name label) {
510+
Name makeFresh(Name label, Index hint = 0) {
511511
return Names::getValidName(
512512
label,
513513
[&](Name candidate) {
514514
return labelDepths.insert({candidate, {}}).second;
515515
},
516-
0,
516+
hint,
517517
"");
518518
}
519519

520+
Index blockHint = 0;
521+
Index labelHint = 0;
522+
520523
void pushScope(ScopeCtx scope) {
521524
if (auto label = scope.getOriginalLabel()) {
522525
// Assign a fresh label to the scope, if necessary.

src/wasm/wasm-ir-builder.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,8 @@ Result<> IRBuilder::visitEnd() {
987987
EHUtils::handleBlockNestedPops(func, wasm);
988988
}
989989
this->func = nullptr;
990+
blockHint = 0;
991+
labelHint = 0;
990992
} else if (auto* block = scope.getBlock()) {
991993
assert(*expr == block);
992994
block->name = scope.label;
@@ -1073,9 +1075,9 @@ Result<Name> IRBuilder::getLabelName(Index label, bool forDelegate) {
10731075
if (!scopeLabel) {
10741076
// The scope does not already have a name, so we need to create one.
10751077
if ((*scope)->getBlock()) {
1076-
scopeLabel = makeFresh("block");
1078+
scopeLabel = makeFresh("block", blockHint++);
10771079
} else {
1078-
scopeLabel = makeFresh("label");
1080+
scopeLabel = makeFresh("label", labelHint++);
10791081
}
10801082
}
10811083
if (!forDelegate) {

test/lit/basic/reference-types.wast

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -361,88 +361,88 @@
361361
;; CHECK-TEXT-NEXT: )
362362
;; CHECK-TEXT-NEXT: )
363363
;; CHECK-TEXT-NEXT: (drop
364-
;; CHECK-TEXT-NEXT: (block $block0 (result eqref)
365-
;; CHECK-TEXT-NEXT: (br_if $block0
366-
;; CHECK-TEXT-NEXT: (global.get $global_eqref)
367-
;; CHECK-TEXT-NEXT: (i32.const 1)
368-
;; CHECK-TEXT-NEXT: )
369-
;; CHECK-TEXT-NEXT: )
370-
;; CHECK-TEXT-NEXT: )
371-
;; CHECK-TEXT-NEXT: (drop
372364
;; CHECK-TEXT-NEXT: (block $block1 (result eqref)
373365
;; CHECK-TEXT-NEXT: (br_if $block1
374-
;; CHECK-TEXT-NEXT: (ref.null none)
366+
;; CHECK-TEXT-NEXT: (global.get $global_eqref)
375367
;; CHECK-TEXT-NEXT: (i32.const 1)
376368
;; CHECK-TEXT-NEXT: )
377369
;; CHECK-TEXT-NEXT: )
378370
;; CHECK-TEXT-NEXT: )
379371
;; CHECK-TEXT-NEXT: (drop
380-
;; CHECK-TEXT-NEXT: (block $block2 (result funcref)
372+
;; CHECK-TEXT-NEXT: (block $block2 (result eqref)
381373
;; CHECK-TEXT-NEXT: (br_if $block2
382-
;; CHECK-TEXT-NEXT: (local.get $local_funcref)
374+
;; CHECK-TEXT-NEXT: (ref.null none)
383375
;; CHECK-TEXT-NEXT: (i32.const 1)
384376
;; CHECK-TEXT-NEXT: )
385377
;; CHECK-TEXT-NEXT: )
386378
;; CHECK-TEXT-NEXT: )
387379
;; CHECK-TEXT-NEXT: (drop
388380
;; CHECK-TEXT-NEXT: (block $block3 (result funcref)
389381
;; CHECK-TEXT-NEXT: (br_if $block3
390-
;; CHECK-TEXT-NEXT: (global.get $global_funcref)
382+
;; CHECK-TEXT-NEXT: (local.get $local_funcref)
391383
;; CHECK-TEXT-NEXT: (i32.const 1)
392384
;; CHECK-TEXT-NEXT: )
393385
;; CHECK-TEXT-NEXT: )
394386
;; CHECK-TEXT-NEXT: )
395387
;; CHECK-TEXT-NEXT: (drop
396388
;; CHECK-TEXT-NEXT: (block $block4 (result funcref)
397389
;; CHECK-TEXT-NEXT: (br_if $block4
398-
;; CHECK-TEXT-NEXT: (ref.null nofunc)
390+
;; CHECK-TEXT-NEXT: (global.get $global_funcref)
399391
;; CHECK-TEXT-NEXT: (i32.const 1)
400392
;; CHECK-TEXT-NEXT: )
401393
;; CHECK-TEXT-NEXT: )
402394
;; CHECK-TEXT-NEXT: )
403395
;; CHECK-TEXT-NEXT: (drop
404396
;; CHECK-TEXT-NEXT: (block $block5 (result funcref)
405397
;; CHECK-TEXT-NEXT: (br_if $block5
406-
;; CHECK-TEXT-NEXT: (ref.func $foo)
398+
;; CHECK-TEXT-NEXT: (ref.null nofunc)
407399
;; CHECK-TEXT-NEXT: (i32.const 1)
408400
;; CHECK-TEXT-NEXT: )
409401
;; CHECK-TEXT-NEXT: )
410402
;; CHECK-TEXT-NEXT: )
411403
;; CHECK-TEXT-NEXT: (drop
412-
;; CHECK-TEXT-NEXT: (block $block6 (result anyref)
404+
;; CHECK-TEXT-NEXT: (block $block6 (result funcref)
413405
;; CHECK-TEXT-NEXT: (br_if $block6
414-
;; CHECK-TEXT-NEXT: (local.get $local_anyref)
406+
;; CHECK-TEXT-NEXT: (ref.func $foo)
415407
;; CHECK-TEXT-NEXT: (i32.const 1)
416408
;; CHECK-TEXT-NEXT: )
417409
;; CHECK-TEXT-NEXT: )
418410
;; CHECK-TEXT-NEXT: )
419411
;; CHECK-TEXT-NEXT: (drop
420412
;; CHECK-TEXT-NEXT: (block $block7 (result anyref)
421413
;; CHECK-TEXT-NEXT: (br_if $block7
422-
;; CHECK-TEXT-NEXT: (global.get $global_anyref)
414+
;; CHECK-TEXT-NEXT: (local.get $local_anyref)
423415
;; CHECK-TEXT-NEXT: (i32.const 1)
424416
;; CHECK-TEXT-NEXT: )
425417
;; CHECK-TEXT-NEXT: )
426418
;; CHECK-TEXT-NEXT: )
427419
;; CHECK-TEXT-NEXT: (drop
428420
;; CHECK-TEXT-NEXT: (block $block8 (result anyref)
429421
;; CHECK-TEXT-NEXT: (br_if $block8
430-
;; CHECK-TEXT-NEXT: (ref.null none)
422+
;; CHECK-TEXT-NEXT: (global.get $global_anyref)
431423
;; CHECK-TEXT-NEXT: (i32.const 1)
432424
;; CHECK-TEXT-NEXT: )
433425
;; CHECK-TEXT-NEXT: )
434426
;; CHECK-TEXT-NEXT: )
435427
;; CHECK-TEXT-NEXT: (drop
436428
;; CHECK-TEXT-NEXT: (block $block9 (result anyref)
437429
;; CHECK-TEXT-NEXT: (br_if $block9
438-
;; CHECK-TEXT-NEXT: (local.get $local_eqref)
430+
;; CHECK-TEXT-NEXT: (ref.null none)
439431
;; CHECK-TEXT-NEXT: (i32.const 1)
440432
;; CHECK-TEXT-NEXT: )
441433
;; CHECK-TEXT-NEXT: )
442434
;; CHECK-TEXT-NEXT: )
443435
;; CHECK-TEXT-NEXT: (drop
444436
;; CHECK-TEXT-NEXT: (block $block10 (result anyref)
445437
;; CHECK-TEXT-NEXT: (br_if $block10
438+
;; CHECK-TEXT-NEXT: (local.get $local_eqref)
439+
;; CHECK-TEXT-NEXT: (i32.const 1)
440+
;; CHECK-TEXT-NEXT: )
441+
;; CHECK-TEXT-NEXT: )
442+
;; CHECK-TEXT-NEXT: )
443+
;; CHECK-TEXT-NEXT: (drop
444+
;; CHECK-TEXT-NEXT: (block $block11 (result anyref)
445+
;; CHECK-TEXT-NEXT: (br_if $block11
446446
;; CHECK-TEXT-NEXT: (ref.null none)
447447
;; CHECK-TEXT-NEXT: (i32.const 1)
448448
;; CHECK-TEXT-NEXT: )

test/lit/passes/outlining.wast

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -675,8 +675,8 @@
675675
;; CHECK: (func $a (type $1) (param $0 i32) (result i32)
676676
;; CHECK-NEXT: (call $outline$)
677677
;; CHECK-NEXT: (block $block
678-
;; CHECK-NEXT: (block $block0
679-
;; CHECK-NEXT: (br_table $block $block0
678+
;; CHECK-NEXT: (block $block1
679+
;; CHECK-NEXT: (br_table $block $block1
680680
;; CHECK-NEXT: (local.get $0)
681681
;; CHECK-NEXT: )
682682
;; CHECK-NEXT: (return

test/lit/wat-kitchen-sink.wast

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2570,14 +2570,14 @@
25702570
)
25712571

25722572
;; CHECK: (func $label-index (type $0)
2573-
;; CHECK-NEXT: (block $block1
2573+
;; CHECK-NEXT: (block $block2
25742574
;; CHECK-NEXT: (block $block
2575-
;; CHECK-NEXT: (block $block0
2575+
;; CHECK-NEXT: (block $block1
25762576
;; CHECK-NEXT: (block $l
25772577
;; CHECK-NEXT: (br $block)
2578-
;; CHECK-NEXT: (br $block0)
2579-
;; CHECK-NEXT: (br $l)
25802578
;; CHECK-NEXT: (br $block1)
2579+
;; CHECK-NEXT: (br $l)
2580+
;; CHECK-NEXT: (br $block2)
25812581
;; CHECK-NEXT: )
25822582
;; CHECK-NEXT: )
25832583
;; CHECK-NEXT: )
@@ -2844,9 +2844,9 @@
28442844
;; CHECK: (func $br-table-index (type $0)
28452845
;; CHECK-NEXT: (block $block
28462846
;; CHECK-NEXT: (block $l
2847-
;; CHECK-NEXT: (block $block1
2848-
;; CHECK-NEXT: (block $block0
2849-
;; CHECK-NEXT: (br_table $block $l $block0 $block1
2847+
;; CHECK-NEXT: (block $block2
2848+
;; CHECK-NEXT: (block $block1
2849+
;; CHECK-NEXT: (br_table $block $l $block1 $block2
28502850
;; CHECK-NEXT: (i32.const 0)
28512851
;; CHECK-NEXT: )
28522852
;; CHECK-NEXT: )
@@ -4821,9 +4821,9 @@
48214821
;; CHECK-NEXT: (drop
48224822
;; CHECK-NEXT: (block $block (result (ref $to-f32-cont))
48234823
;; CHECK-NEXT: (tuple.drop 3
4824-
;; CHECK-NEXT: (block $block0 (type $34) (result i32 i64 (ref null $simple-cont))
4824+
;; CHECK-NEXT: (block $block1 (type $34) (result i32 i64 (ref null $simple-cont))
48254825
;; CHECK-NEXT: (local.set $f
4826-
;; CHECK-NEXT: (resume $simple-cont (on $empty $block) (on $tag-pair-to-pair $block0)
4826+
;; CHECK-NEXT: (resume $simple-cont (on $empty $block) (on $tag-pair-to-pair $block1)
48274827
;; CHECK-NEXT: (i32.const 0)
48284828
;; CHECK-NEXT: (i64.const 1)
48294829
;; CHECK-NEXT: (local.get $ct)

0 commit comments

Comments
 (0)