diff options
-rw-r--r-- | src/wasm-ir-builder.h | 7 | ||||
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 6 | ||||
-rw-r--r-- | test/lit/basic/reference-types.wast | 38 | ||||
-rw-r--r-- | test/lit/passes/outlining.wast | 4 | ||||
-rw-r--r-- | test/lit/wat-kitchen-sink.wast | 18 | ||||
-rw-r--r-- | test/wasm2js/br_table_temp.2asm.js | 68 | ||||
-rw-r--r-- | test/wasm2js/br_table_temp.2asm.js.opt | 20 | ||||
-rw-r--r-- | test/wasm2js/labels.2asm.js | 8 |
8 files changed, 87 insertions, 82 deletions
diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index d6e453149..30e770e28 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -507,16 +507,19 @@ private: // its stack. std::unordered_map<Name, std::vector<Index>> labelDepths; - Name makeFresh(Name label) { + Name makeFresh(Name label, Index hint = 0) { return Names::getValidName( label, [&](Name candidate) { return labelDepths.insert({candidate, {}}).second; }, - 0, + hint, ""); } + Index blockHint = 0; + Index labelHint = 0; + void pushScope(ScopeCtx scope) { if (auto label = scope.getOriginalLabel()) { // Assign a fresh label to the scope, if necessary. diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 5253c91ee..a73c7f2ac 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -987,6 +987,8 @@ Result<> IRBuilder::visitEnd() { EHUtils::handleBlockNestedPops(func, wasm); } this->func = nullptr; + blockHint = 0; + labelHint = 0; } else if (auto* block = scope.getBlock()) { assert(*expr == block); block->name = scope.label; @@ -1073,9 +1075,9 @@ Result<Name> IRBuilder::getLabelName(Index label, bool forDelegate) { if (!scopeLabel) { // The scope does not already have a name, so we need to create one. if ((*scope)->getBlock()) { - scopeLabel = makeFresh("block"); + scopeLabel = makeFresh("block", blockHint++); } else { - scopeLabel = makeFresh("label"); + scopeLabel = makeFresh("label", labelHint++); } } if (!forDelegate) { diff --git a/test/lit/basic/reference-types.wast b/test/lit/basic/reference-types.wast index 6ef51c23d..44494c80d 100644 --- a/test/lit/basic/reference-types.wast +++ b/test/lit/basic/reference-types.wast @@ -361,25 +361,17 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (drop - ;; CHECK-TEXT-NEXT: (block $block0 (result eqref) - ;; CHECK-TEXT-NEXT: (br_if $block0 - ;; CHECK-TEXT-NEXT: (global.get $global_eqref) - ;; CHECK-TEXT-NEXT: (i32.const 1) - ;; CHECK-TEXT-NEXT: ) - ;; CHECK-TEXT-NEXT: ) - ;; CHECK-TEXT-NEXT: ) - ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block1 (result eqref) ;; CHECK-TEXT-NEXT: (br_if $block1 - ;; CHECK-TEXT-NEXT: (ref.null none) + ;; CHECK-TEXT-NEXT: (global.get $global_eqref) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (drop - ;; CHECK-TEXT-NEXT: (block $block2 (result funcref) + ;; CHECK-TEXT-NEXT: (block $block2 (result eqref) ;; CHECK-TEXT-NEXT: (br_if $block2 - ;; CHECK-TEXT-NEXT: (local.get $local_funcref) + ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -387,7 +379,7 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block3 (result funcref) ;; CHECK-TEXT-NEXT: (br_if $block3 - ;; CHECK-TEXT-NEXT: (global.get $global_funcref) + ;; CHECK-TEXT-NEXT: (local.get $local_funcref) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -395,7 +387,7 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block4 (result funcref) ;; CHECK-TEXT-NEXT: (br_if $block4 - ;; CHECK-TEXT-NEXT: (ref.null nofunc) + ;; CHECK-TEXT-NEXT: (global.get $global_funcref) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -403,15 +395,15 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block5 (result funcref) ;; CHECK-TEXT-NEXT: (br_if $block5 - ;; CHECK-TEXT-NEXT: (ref.func $foo) + ;; CHECK-TEXT-NEXT: (ref.null nofunc) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (drop - ;; CHECK-TEXT-NEXT: (block $block6 (result anyref) + ;; CHECK-TEXT-NEXT: (block $block6 (result funcref) ;; CHECK-TEXT-NEXT: (br_if $block6 - ;; CHECK-TEXT-NEXT: (local.get $local_anyref) + ;; CHECK-TEXT-NEXT: (ref.func $foo) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -419,7 +411,7 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block7 (result anyref) ;; CHECK-TEXT-NEXT: (br_if $block7 - ;; CHECK-TEXT-NEXT: (global.get $global_anyref) + ;; CHECK-TEXT-NEXT: (local.get $local_anyref) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -427,7 +419,7 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block8 (result anyref) ;; CHECK-TEXT-NEXT: (br_if $block8 - ;; CHECK-TEXT-NEXT: (ref.null none) + ;; CHECK-TEXT-NEXT: (global.get $global_anyref) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -435,7 +427,7 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block9 (result anyref) ;; CHECK-TEXT-NEXT: (br_if $block9 - ;; CHECK-TEXT-NEXT: (local.get $local_eqref) + ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -443,6 +435,14 @@ ;; CHECK-TEXT-NEXT: (drop ;; CHECK-TEXT-NEXT: (block $block10 (result anyref) ;; CHECK-TEXT-NEXT: (br_if $block10 + ;; CHECK-TEXT-NEXT: (local.get $local_eqref) + ;; CHECK-TEXT-NEXT: (i32.const 1) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (drop + ;; CHECK-TEXT-NEXT: (block $block11 (result anyref) + ;; CHECK-TEXT-NEXT: (br_if $block11 ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: ) diff --git a/test/lit/passes/outlining.wast b/test/lit/passes/outlining.wast index 5119572b3..a02e6f2cd 100644 --- a/test/lit/passes/outlining.wast +++ b/test/lit/passes/outlining.wast @@ -675,8 +675,8 @@ ;; CHECK: (func $a (type $1) (param $0 i32) (result i32) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: (block $block - ;; CHECK-NEXT: (block $block0 - ;; CHECK-NEXT: (br_table $block $block0 + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: (br_table $block $block1 ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast index 97d9f57e8..8b77de74d 100644 --- a/test/lit/wat-kitchen-sink.wast +++ b/test/lit/wat-kitchen-sink.wast @@ -2570,14 +2570,14 @@ ) ;; CHECK: (func $label-index (type $0) - ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: (block $block2 ;; CHECK-NEXT: (block $block - ;; CHECK-NEXT: (block $block0 + ;; CHECK-NEXT: (block $block1 ;; CHECK-NEXT: (block $l ;; CHECK-NEXT: (br $block) - ;; CHECK-NEXT: (br $block0) - ;; CHECK-NEXT: (br $l) ;; CHECK-NEXT: (br $block1) + ;; CHECK-NEXT: (br $l) + ;; CHECK-NEXT: (br $block2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2844,9 +2844,9 @@ ;; CHECK: (func $br-table-index (type $0) ;; CHECK-NEXT: (block $block ;; CHECK-NEXT: (block $l - ;; CHECK-NEXT: (block $block1 - ;; CHECK-NEXT: (block $block0 - ;; CHECK-NEXT: (br_table $block $l $block0 $block1 + ;; CHECK-NEXT: (block $block2 + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: (br_table $block $l $block1 $block2 ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4821,9 +4821,9 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $block (result (ref $to-f32-cont)) ;; CHECK-NEXT: (tuple.drop 3 - ;; CHECK-NEXT: (block $block0 (type $34) (result i32 i64 (ref null $simple-cont)) + ;; CHECK-NEXT: (block $block1 (type $34) (result i32 i64 (ref null $simple-cont)) ;; CHECK-NEXT: (local.set $f - ;; CHECK-NEXT: (resume $simple-cont (on $empty $block) (on $tag-pair-to-pair $block0) + ;; CHECK-NEXT: (resume $simple-cont (on $empty $block) (on $tag-pair-to-pair $block1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (local.get $ct) diff --git a/test/wasm2js/br_table_temp.2asm.js b/test/wasm2js/br_table_temp.2asm.js index 9bc6cafa4..a8592a186 100644 --- a/test/wasm2js/br_table_temp.2asm.js +++ b/test/wasm2js/br_table_temp.2asm.js @@ -115,7 +115,7 @@ function asmFunc(imports) { function $11($0_1) { $0_1 = $0_1 | 0; var $2_1 = 0, $4_1 = 0, $3_1 = 0; - block0 : { + block1 : { block : { $2_1 = 33; $3_1 = $2_1; @@ -124,7 +124,7 @@ function asmFunc(imports) { case 0: break block; default: - break block0; + break block1; }; } $4_1 = 32; @@ -134,7 +134,7 @@ function asmFunc(imports) { function $12($0_1) { $0_1 = $0_1 | 0; - block3 : { + block4 : { switch ($0_1 | 0) { case 3: return 100 | 0; @@ -145,7 +145,7 @@ function asmFunc(imports) { case 0: return 103 | 0; default: - break block3; + break block4; }; } return 104 | 0; @@ -154,11 +154,11 @@ function asmFunc(imports) { function $13($0_1) { $0_1 = $0_1 | 0; var $1_1 = 0, $3_1 = 0, $4_1 = 0, $5_1 = 0, $6_1 = 0, $7_1 = 0, $8_1 = 0; - block3 : { + block4 : { block : { - block0 : { - block1 : { - block2 : { + block1 : { + block2 : { + block3 : { $3_1 = 200; $4_1 = $3_1; $5_1 = $3_1; @@ -169,13 +169,13 @@ function asmFunc(imports) { case 0: break block; case 1: - break block0; - case 2: break block1; - case 3: + case 2: break block2; - default: + case 3: break block3; + default: + break block4; }; } $1_1 = $7_1; @@ -196,7 +196,7 @@ function asmFunc(imports) { function $14($0_1) { $0_1 = $0_1 | 0; - block0 : { + block1 : { switch ($0_1 | 0) { case 0: case 2: @@ -12508,7 +12508,7 @@ function asmFunc(imports) { case 24614: return 0 | 0; default: - break block0; + break block1; }; } return 1 | 0; @@ -13052,8 +13052,8 @@ function asmFunc(imports) { function $58($0_1) { $0_1 = $0_1 | 0; var $2_1 = 0, $4_1 = 0, $5_1 = 0, $3_1 = 0; - block1 : { - block0 : { + block2 : { + block1 : { block : { $2_1 = 16; $3_1 = $2_1; @@ -13063,9 +13063,9 @@ function asmFunc(imports) { case 0: break block; case 1: - break block0; - default: break block1; + default: + break block2; }; } $4_1 = 2 + $3_1 | 0; @@ -13079,8 +13079,8 @@ function asmFunc(imports) { $0_1 = $0_1 | 0; var $2_1 = 0, $3_1 = 0, $4_1 = 0, $5_1 = 0; block : { - block0 : { - block1 : { + block1 : { + block2 : { $2_1 = 8; $3_1 = $2_1; $4_1 = $2_1; @@ -13089,9 +13089,9 @@ function asmFunc(imports) { case 0: break block; case 1: - break block0; - default: break block1; + default: + break block2; }; } $4_1 = 16; @@ -13104,8 +13104,8 @@ function asmFunc(imports) { function $60($0_1) { $0_1 = $0_1 | 0; var $2_1 = 0, $3_1 = 0, $4_1 = 0, $5_1 = 0; - block1 : { - block0 : { + block2 : { + block1 : { block : { $2_1 = 8; $3_1 = $2_1; @@ -13115,9 +13115,9 @@ function asmFunc(imports) { case 0: break block; case 1: - break block0; - default: break block1; + default: + break block2; }; } $4_1 = 16; @@ -13130,14 +13130,14 @@ function asmFunc(imports) { function $61($0_1) { $0_1 = $0_1 | 0; var $3_1 = 0, $2_1 = 0, $4_1 = 0; - block0 : { + block1 : { block : { $2_1 = 8; $3_1 = $2_1; $4_1 = $2_1; switch ($0_1 | 0) { case 1: - break block0; + break block1; default: break block; }; @@ -13150,8 +13150,8 @@ function asmFunc(imports) { function $62($0_1) { $0_1 = $0_1 | 0; var $2_1 = 0, $3_1 = 0, $4_1 = 0, $5_1 = 0; - block1 : { - block0 : { + block2 : { + block1 : { block : { $2_1 = 8; $3_1 = $2_1; @@ -13161,9 +13161,9 @@ function asmFunc(imports) { case 0: break block; case 1: - break block0; - default: break block1; + default: + break block2; }; } $4_1 = 16; @@ -13176,14 +13176,14 @@ function asmFunc(imports) { function $63($0_1) { $0_1 = $0_1 | 0; var $3_1 = 0, $2_1 = 0, $4_1 = 0; - block0 : { + block1 : { block : { $2_1 = 8; $3_1 = $2_1; $4_1 = $2_1; switch ($0_1 | 0) { case 1: - break block0; + break block1; default: break block; }; diff --git a/test/wasm2js/br_table_temp.2asm.js.opt b/test/wasm2js/br_table_temp.2asm.js.opt index b64e46a77..f1dad0ab2 100644 --- a/test/wasm2js/br_table_temp.2asm.js.opt +++ b/test/wasm2js/br_table_temp.2asm.js.opt @@ -60,7 +60,7 @@ function asmFunc(imports) { function $12($0) { $0 = $0 | 0; - block3 : { + block4 : { switch ($0 | 0) { case 3: return 100; @@ -71,7 +71,7 @@ function asmFunc(imports) { case 0: return 103; default: - break block3; + break block4; }; } return 104; @@ -79,7 +79,7 @@ function asmFunc(imports) { function $13($0) { $0 = $0 | 0; - block3 : { + block4 : { switch ($0 | 0) { case 3: return 210; @@ -90,7 +90,7 @@ function asmFunc(imports) { case 0: return 213; default: - break block3; + break block4; }; } return 214; @@ -98,7 +98,7 @@ function asmFunc(imports) { function $14($0) { $0 = $0 | 0; - block0 : { + block1 : { switch ($0 | 0) { case 0: case 2: @@ -12410,7 +12410,7 @@ function asmFunc(imports) { case 24614: return 0; default: - break block0; + break block1; }; } return 1; @@ -12554,7 +12554,7 @@ function asmFunc(imports) { $0 = $0 | 0; var $1 = 0; $1 = 16; - block1 : { + block2 : { switch ($0 | 0) { case 0: $1 = 18; @@ -12562,7 +12562,7 @@ function asmFunc(imports) { $1 = $1 + 1 | 0; break; default: - break block1; + break block2; }; } return $1 | 0; @@ -12590,7 +12590,7 @@ function asmFunc(imports) { $0 = $0 | 0; var $1 = 0; $1 = 8; - block1 : { + block2 : { switch ($0 | 0) { case 0: $1 = 16; @@ -12598,7 +12598,7 @@ function asmFunc(imports) { $1 = $1 + 1 | 0; break; default: - break block1; + break block2; }; } return $1 | 0; diff --git a/test/wasm2js/labels.2asm.js b/test/wasm2js/labels.2asm.js index ac2978300..431e172d9 100644 --- a/test/wasm2js/labels.2asm.js +++ b/test/wasm2js/labels.2asm.js @@ -143,10 +143,6 @@ function asmFunc(imports) { break label; } i = i + 1 | 0; - label0 : { - break label0; - } - i = i + 1 | 0; label1 : { break label1; } @@ -159,6 +155,10 @@ function asmFunc(imports) { break label3; } i = i + 1 | 0; + label4 : { + break label4; + } + i = i + 1 | 0; return i | 0; } |