diff options
author | Alon Zakai <azakai@google.com> | 2023-08-09 10:31:48 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-09 10:31:48 -0700 |
commit | d0bdf202463323a0b9f3be95fe2c64765a84a4b7 (patch) | |
tree | c4142a82fe8d1fe2451745b5068cadae4e063af9 | |
parent | 0fc7b883d373924717ceccf71a6a759c97a8fb08 (diff) | |
download | binaryen-d0bdf202463323a0b9f3be95fe2c64765a84a4b7.tar.gz binaryen-d0bdf202463323a0b9f3be95fe2c64765a84a4b7.tar.bz2 binaryen-d0bdf202463323a0b9f3be95fe2c64765a84a4b7.zip |
LinearExecutionWalker: Optionally connect blocks for Br and BrOn (#5869)
Br and BrOn can consider the code before and after them connected if it might
be reached (which is the case if the Br has a condition, which BrOn always has).
The wasm2js changes may look a little odd as some of them have this:
i64toi32_i32$1 = i64toi32_i32$2;
i64toi32_i32$1 = i64toi32_i32$2;
I looked into that and the reason is that those outputs are not optimized, and
also even in unoptimized wasm2js we do run simplify-locals once (to try to
reduce the downsides of flatten). As a result, this PR makes a difference there,
and that difference can lead to such odd duplicated code after other operations.
However, there are no changes to optimized wasm2js outputs, so there is no
actual problem.
Followup to #5860.
-rw-r--r-- | src/ir/linear-execution.h | 17 | ||||
-rw-r--r-- | test/lit/passes/O4_disable-bulk-memory.wast | 29 | ||||
-rw-r--r-- | test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast | 6 | ||||
-rw-r--r-- | test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast | 6 | ||||
-rw-r--r-- | test/lit/passes/simplify-locals-gc.wast | 63 | ||||
-rw-r--r-- | test/wasm2js/i64-ctz.2asm.js | 3 | ||||
-rw-r--r-- | test/wasm2js/int_exprs.2asm.js | 84 | ||||
-rw-r--r-- | test/wasm2js/left-to-right.2asm.js | 6 | ||||
-rw-r--r-- | test/wasm2js/traps.2asm.js | 12 | ||||
-rw-r--r-- | test/wasm2js/unary-ops.2asm.js | 3 |
10 files changed, 147 insertions, 82 deletions
diff --git a/src/ir/linear-execution.h b/src/ir/linear-execution.h index b7020f7fb..c6593bd64 100644 --- a/src/ir/linear-execution.h +++ b/src/ir/linear-execution.h @@ -127,9 +127,16 @@ struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> { } case Expression::Id::BreakId: { self->pushTask(SubType::doVisitBreak, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - self->maybePushTask(SubType::scan, &curr->cast<Break>()->condition); - self->maybePushTask(SubType::scan, &curr->cast<Break>()->value); + auto* br = curr->cast<Break>(); + // If there is no condition then we note non-linearity as the code after + // us is unreachable anyhow (we do the same for Switch, Return, etc.). + // If there is a condition, then we note or do not note depending on + // whether we allow adjacent blocks. + if (!br->condition || !self->connectAdjacentBlocks) { + self->pushTask(SubType::doNoteNonLinear, currp); + } + self->maybePushTask(SubType::scan, &br->condition); + self->maybePushTask(SubType::scan, &br->value); break; } case Expression::Id::SwitchId: { @@ -185,7 +192,9 @@ struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> { } case Expression::Id::BrOnId: { self->pushTask(SubType::doVisitBrOn, currp); - self->pushTask(SubType::doNoteNonLinear, currp); + if (!self->connectAdjacentBlocks) { + self->pushTask(SubType::doNoteNonLinear, currp); + } self->pushTask(SubType::scan, &curr->cast<BrOn>()->ref); break; } diff --git a/test/lit/passes/O4_disable-bulk-memory.wast b/test/lit/passes/O4_disable-bulk-memory.wast index 89a172661..5029f13e9 100644 --- a/test/lit/passes/O4_disable-bulk-memory.wast +++ b/test/lit/passes/O4_disable-bulk-memory.wast @@ -1371,7 +1371,7 @@ ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.tee $1 + ;; CHECK-NEXT: (local.tee $3 ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.sub ;; CHECK-NEXT: (i32.const 20) @@ -1389,7 +1389,7 @@ ;; CHECK-NEXT: (block $__inlined_func$~lib/internal/memory/memset$8 ;; CHECK-NEXT: (br_if $__inlined_func$~lib/internal/memory/memset$8 ;; CHECK-NEXT: (i32.le_u - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1409,10 +1409,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.tee $3 + ;; CHECK-NEXT: (local.tee $1 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 12) @@ -1421,14 +1421,14 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br_if $__inlined_func$~lib/internal/memory/memset$8 ;; CHECK-NEXT: (i32.le_u - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1462,40 +1462,35 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.tee $3 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (local.get $1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (i32.const 28) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.tee $3 + ;; CHECK-NEXT: (local.tee $1 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $0) @@ -1509,8 +1504,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (loop $label$8 diff --git a/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast b/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast index 3a4b0265c..7103c94e8 100644 --- a/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast +++ b/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast @@ -3487,7 +3487,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (local.set $6 @@ -3498,7 +3498,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) @@ -3614,7 +3614,7 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (i32.clz - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast b/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast index 05731dfe9..163785fd4 100644 --- a/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast +++ b/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast @@ -3555,7 +3555,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (local.set $6 @@ -3566,7 +3566,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) @@ -3682,7 +3682,7 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (i32.clz - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/simplify-locals-gc.wast b/test/lit/passes/simplify-locals-gc.wast index 6b2b10462..155649dbb 100644 --- a/test/lit/passes/simplify-locals-gc.wast +++ b/test/lit/passes/simplify-locals-gc.wast @@ -541,4 +541,67 @@ ) ) ) + + ;; CHECK: (func $equivalent-set-removal-branching (type $i32_anyref_=>_none) (param $0 i32) (param $any anyref) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $block + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (br_on_null $block + ;; CHECK-NEXT: (local.get $any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $equivalent-set-removal-branching (param $0 i32) (param $any anyref) + (local $1 i32) + (block $block + (local.set $1 (local.get $0)) + (br_if $block + (local.get $0) + ) + (drop + (br_on_null $block + (local.get $any) + ) + ) + ;; We can optimize these to both use the same local index, as they must + ;; contain the same value, even past the br_if and br_on_null. + (drop (local.get $0)) + (drop (local.get $1)) + (br $block) + ;; But we do not optimize these as they are after an unconditional br + ;; (so they are unreachable code). + (drop (local.get $0)) + (drop (local.get $1)) + ) + ;; Past the end of the block we do not optimize. The local.set actually does + ;; dominate these, but currently we do not realize that in this pass. TODO + (drop (local.get $0)) + (drop (local.get $1)) + ) ) diff --git a/test/wasm2js/i64-ctz.2asm.js b/test/wasm2js/i64-ctz.2asm.js index 5bd8cfc9b..fc8c52a54 100644 --- a/test/wasm2js/i64-ctz.2asm.js +++ b/test/wasm2js/i64-ctz.2asm.js @@ -176,7 +176,7 @@ function asmFunc(imports) { function __wasm_popcnt_i64(var$0, var$0$hi) { var$0 = var$0 | 0; var$0$hi = var$0$hi | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$5 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, i64toi32_i32$1 = 0, var$1$hi = 0, var$1 = 0, $5 = 0, $5$hi = 0, $4 = 0, $9$hi = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$5 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, i64toi32_i32$1 = 0, var$1$hi = 0, var$1 = 0, $4 = 0, $5 = 0, $5$hi = 0, $9$hi = 0; label$1 : { label$2 : while (1) { i64toi32_i32$0 = var$1$hi; @@ -188,7 +188,6 @@ function asmFunc(imports) { if ($4) { break label$1 } - i64toi32_i32$0 = $5$hi; i64toi32_i32$0 = var$0$hi; i64toi32_i32$2 = var$0; i64toi32_i32$1 = 0; diff --git a/test/wasm2js/int_exprs.2asm.js b/test/wasm2js/int_exprs.2asm.js index 041e556b7..824e3313c 100644 --- a/test/wasm2js/int_exprs.2asm.js +++ b/test/wasm2js/int_exprs.2asm.js @@ -1154,8 +1154,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -1185,7 +1184,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -1886,8 +1886,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -1917,7 +1916,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -2582,8 +2582,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -2613,7 +2612,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -3378,8 +3378,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -3409,7 +3408,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -4064,8 +4064,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -4095,7 +4094,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -4694,8 +4694,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -4725,7 +4724,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -5392,8 +5392,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -5423,7 +5422,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -6108,8 +6108,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -6139,7 +6138,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -6824,8 +6824,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -6855,7 +6854,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -7540,8 +7540,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -7571,7 +7570,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -8236,8 +8236,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -8267,7 +8266,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -8934,8 +8934,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -8965,7 +8964,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -9632,8 +9632,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -9663,7 +9662,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -10304,8 +10304,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -10335,7 +10334,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; diff --git a/test/wasm2js/left-to-right.2asm.js b/test/wasm2js/left-to-right.2asm.js index 5bb552f34..0ee715b2d 100644 --- a/test/wasm2js/left-to-right.2asm.js +++ b/test/wasm2js/left-to-right.2asm.js @@ -1621,8 +1621,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -1652,7 +1651,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; diff --git a/test/wasm2js/traps.2asm.js b/test/wasm2js/traps.2asm.js index ee38b6055..f7a469ebe 100644 --- a/test/wasm2js/traps.2asm.js +++ b/test/wasm2js/traps.2asm.js @@ -305,8 +305,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -336,7 +335,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; @@ -1015,8 +1015,7 @@ function asmFunc(imports) { if (!var$3) { break label$11 } - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; + i64toi32_i32$0 = var$3; i64toi32_i32$2 = 0; i64toi32_i32$3 = 32; i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; @@ -1046,7 +1045,8 @@ function asmFunc(imports) { } i64toi32_i32$1 = var$0$hi; var$2 = var$0; - i64toi32_i32$1 = var$1$hi; + i64toi32_i32$1 = i64toi32_i32$2; + i64toi32_i32$1 = i64toi32_i32$2; var$3 = var$1; var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; i64toi32_i32$1 = 0; diff --git a/test/wasm2js/unary-ops.2asm.js b/test/wasm2js/unary-ops.2asm.js index 90b030e45..9adfe581b 100644 --- a/test/wasm2js/unary-ops.2asm.js +++ b/test/wasm2js/unary-ops.2asm.js @@ -452,7 +452,7 @@ function asmFunc(imports) { function __wasm_popcnt_i64(var$0, var$0$hi) { var$0 = var$0 | 0; var$0$hi = var$0$hi | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$5 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, i64toi32_i32$1 = 0, var$1$hi = 0, var$1 = 0, $5_1 = 0, $5$hi = 0, $4_1 = 0, $9$hi = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$5 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, i64toi32_i32$1 = 0, var$1$hi = 0, var$1 = 0, $4_1 = 0, $5_1 = 0, $5$hi = 0, $9$hi = 0; label$1 : { label$2 : while (1) { i64toi32_i32$0 = var$1$hi; @@ -464,7 +464,6 @@ function asmFunc(imports) { if ($4_1) { break label$1 } - i64toi32_i32$0 = $5$hi; i64toi32_i32$0 = var$0$hi; i64toi32_i32$2 = var$0; i64toi32_i32$1 = 0; |