diff options
author | Alon Zakai <azakai@google.com> | 2019-04-25 17:10:06 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-25 17:10:06 -0700 |
commit | 78a4f9ef1afd6c209a5c69a8e7906ffe33575f58 (patch) | |
tree | 0f7443f2ca32ce1a6131a6cc95212de9b5ececb1 | |
parent | 21f014f4bd0ea1086895d8674f1473af222eb416 (diff) | |
download | binaryen-78a4f9ef1afd6c209a5c69a8e7906ffe33575f58.tar.gz binaryen-78a4f9ef1afd6c209a5c69a8e7906ffe33575f58.tar.bz2 binaryen-78a4f9ef1afd6c209a5c69a8e7906ffe33575f58.zip |
wasm2js2: optimize call_indirect and select operands (#2056)
Don't use temp vars to reorder them unless we need to.
-rw-r--r-- | scripts/test/env.js | 3 | ||||
-rw-r--r-- | src/ir/effects.h | 14 | ||||
-rw-r--r-- | src/wasm2js.h | 131 | ||||
-rw-r--r-- | test/wasm2js/call_indirect.2asm.js | 78 | ||||
-rw-r--r-- | test/wasm2js/emscripten.2asm.js | 3 | ||||
-rw-r--r-- | test/wasm2js/f32.2asm.js | 7 | ||||
-rw-r--r-- | test/wasm2js/f64.2asm.js | 7 | ||||
-rw-r--r-- | test/wasm2js/float_misc.2asm.js | 14 | ||||
-rw-r--r-- | test/wasm2js/func-ptr-offset.2asm.js | 3 | ||||
-rw-r--r-- | test/wasm2js/func.2asm.js | 19 | ||||
-rw-r--r-- | test/wasm2js/func_ptrs.2asm.js | 9 | ||||
-rw-r--r-- | test/wasm2js/left-to-right.2asm.js | 4 | ||||
-rw-r--r-- | test/wasm2js/nested-selects.2asm.js | 3 | ||||
-rw-r--r-- | test/wasm2js/ordering.2asm.js | 66 | ||||
-rw-r--r-- | test/wasm2js/ordering.wast | 98 | ||||
-rw-r--r-- | test/wasm2js/select.2asm.js | 15 |
16 files changed, 330 insertions, 144 deletions
diff --git a/scripts/test/env.js b/scripts/test/env.js index af2cce1c7..0eb3f06f4 100644 --- a/scripts/test/env.js +++ b/scripts/test/env.js @@ -1,3 +1,6 @@ + +export const FUNCTION_TABLE = []; + var tempRet0 = 0; export function setTempRet0(x) { diff --git a/src/ir/effects.h b/src/ir/effects.h index 1c33964a7..e1fa77af0 100644 --- a/src/ir/effects.h +++ b/src/ir/effects.h @@ -59,13 +59,13 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer, OverriddenVisitor<Effe // Helper functions to check for various effect types - bool accessesLocal() { return localsRead.size() + localsWritten.size() > 0; } - bool accessesGlobal() { return globalsRead.size() + globalsWritten.size() > 0; } - bool accessesMemory() { return calls || readsMemory || writesMemory; } + bool accessesLocal() const { return localsRead.size() + localsWritten.size() > 0; } + bool accessesGlobal() const { return globalsRead.size() + globalsWritten.size() > 0; } + bool accessesMemory() const { return calls || readsMemory || writesMemory; } - bool hasGlobalSideEffects() { return calls || globalsWritten.size() > 0 || writesMemory || isAtomic; } - bool hasSideEffects() { return hasGlobalSideEffects() || localsWritten.size() > 0 || branches || implicitTrap; } - bool hasAnything() { return branches || calls || accessesLocal() || readsMemory || writesMemory || accessesGlobal() || implicitTrap || isAtomic; } + bool hasGlobalSideEffects() const { return calls || globalsWritten.size() > 0 || writesMemory || isAtomic; } + bool hasSideEffects() const { return hasGlobalSideEffects() || localsWritten.size() > 0 || branches || implicitTrap; } + bool hasAnything() const { return branches || calls || accessesLocal() || readsMemory || writesMemory || accessesGlobal() || implicitTrap || isAtomic; } bool noticesGlobalSideEffects() { return calls || readsMemory || isAtomic || globalsRead.size(); } @@ -73,7 +73,7 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer, OverriddenVisitor<Effe bool hasExternalBreakTargets() { return !breakNames.empty(); } // checks if these effects would invalidate another set (e.g., if we write, we invalidate someone that reads, they can't be moved past us) - bool invalidates(EffectAnalyzer& other) { + bool invalidates(const EffectAnalyzer& other) { if ((branches && other.hasSideEffects()) || (other.branches && hasSideEffects()) || ((writesMemory || calls) && other.accessesMemory()) || diff --git a/src/wasm2js.h b/src/wasm2js.h index 6c97c5a6b..be794decb 100644 --- a/src/wasm2js.h +++ b/src/wasm2js.h @@ -35,6 +35,7 @@ #include "mixed_arena.h" #include "asm_v_wasm.h" #include "abi/js.h" +#include "ir/effects.h" #include "ir/find_all.h" #include "ir/import-utils.h" #include "ir/load-utils.h" @@ -884,33 +885,54 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, Function* func, bool standalo } Ref visitCallIndirect(CallIndirect* curr) { - // TODO: the codegen here is a pessimization of what the ideal codegen - // looks like. Eventually if necessary this should be tightened up in the - // case that the argument expression doesn't have any side effects. - Ref ret; - ScopedTemp idx(i32, parent, func); - std::vector<ScopedTemp*> temps; // TODO: utility class, with destructor? - for (auto& operand : curr->operands) { - temps.push_back(new ScopedTemp(operand->type, parent, func)); - IString temp = temps.back()->temp; - sequenceAppend(ret, visitAndAssign(operand, temp)); - } - sequenceAppend(ret, visitAndAssign(curr->target, idx)); - Ref theCall = ValueBuilder::makeCall(ValueBuilder::makeSub( - ValueBuilder::makeName(FUNCTION_TABLE), - idx.getAstName() - )); - for (size_t i = 0; i < temps.size(); i++) { - IString temp = temps[i]->temp; - auto &operand = curr->operands[i]; - theCall[2]->push_back(makeAsmCoercion(ValueBuilder::makeName(temp), wasmToAsmType(operand->type))); + // If the target has effects that interact with the operands, we must reorder it to the start. + bool mustReorder = false; + EffectAnalyzer targetEffects(parent->options, curr->target); + if (targetEffects.hasAnything()) { + for (auto* operand : curr->operands) { + if (targetEffects.invalidates(EffectAnalyzer(parent->options, operand))) { + mustReorder = true; + break; + } + } } - theCall = makeAsmCoercion(theCall, wasmToAsmType(curr->type)); - sequenceAppend(ret, theCall); - for (auto temp : temps) { - delete temp; + if (mustReorder) { + Ref ret; + ScopedTemp idx(i32, parent, func); + std::vector<ScopedTemp*> temps; // TODO: utility class, with destructor? + for (auto* operand : curr->operands) { + temps.push_back(new ScopedTemp(operand->type, parent, func)); + IString temp = temps.back()->temp; + sequenceAppend(ret, visitAndAssign(operand, temp)); + } + sequenceAppend(ret, visitAndAssign(curr->target, idx)); + Ref theCall = ValueBuilder::makeCall(ValueBuilder::makeSub( + ValueBuilder::makeName(FUNCTION_TABLE), + idx.getAstName() + )); + for (size_t i = 0; i < temps.size(); i++) { + IString temp = temps[i]->temp; + auto &operand = curr->operands[i]; + theCall[2]->push_back(makeAsmCoercion(ValueBuilder::makeName(temp), wasmToAsmType(operand->type))); + } + theCall = makeAsmCoercion(theCall, wasmToAsmType(curr->type)); + sequenceAppend(ret, theCall); + for (auto temp : temps) { + delete temp; + } + return ret; + } else { + // Target has no side effects, emit simple code + Ref theCall = ValueBuilder::makeCall(ValueBuilder::makeSub( + ValueBuilder::makeName(FUNCTION_TABLE), + visit(curr->target, EXPRESSION_RESULT) + )); + for (auto* operand : curr->operands) { + theCall[2]->push_back(visit(operand, EXPRESSION_RESULT)); + } + theCall = makeAsmCoercion(theCall, wasmToAsmType(curr->type)); + return theCall; } - return ret; } // TODO: remove @@ -1526,28 +1548,49 @@ Ref Wasm2JSBuilder::processFunctionBody(Module* m, Function* func, bool standalo } Ref visitSelect(Select* curr) { - // normal select - ScopedTemp tempIfTrue(curr->type, parent, func), - tempIfFalse(curr->type, parent, func), - tempCondition(i32, parent, func); - Ref ifTrue = visit(curr->ifTrue, EXPRESSION_RESULT); - Ref ifFalse = visit(curr->ifFalse, EXPRESSION_RESULT); - Ref condition = visit(curr->condition, EXPRESSION_RESULT); - return - ValueBuilder::makeSeq( - ValueBuilder::makeBinary(tempIfTrue.getAstName(), SET, ifTrue), + // If the condition has effects that interact with the operands, we must reorder it to the start. + // We must also use locals if the values have side effects, as a JS conditional does not + // visit both sides. + bool useLocals = false; + EffectAnalyzer conditionEffects(parent->options, curr->condition); + EffectAnalyzer ifTrueEffects(parent->options, curr->ifTrue); + EffectAnalyzer ifFalseEffects(parent->options, curr->ifFalse); + if (conditionEffects.invalidates(ifTrueEffects) || + conditionEffects.invalidates(ifFalseEffects) || + ifTrueEffects.hasSideEffects() || + ifFalseEffects.hasSideEffects()) { + useLocals = true; + } + if (useLocals) { + ScopedTemp tempIfTrue(curr->type, parent, func), + tempIfFalse(curr->type, parent, func), + tempCondition(i32, parent, func); + Ref ifTrue = visit(curr->ifTrue, EXPRESSION_RESULT); + Ref ifFalse = visit(curr->ifFalse, EXPRESSION_RESULT); + Ref condition = visit(curr->condition, EXPRESSION_RESULT); + return ValueBuilder::makeSeq( - ValueBuilder::makeBinary(tempIfFalse.getAstName(), SET, ifFalse), + ValueBuilder::makeBinary(tempIfTrue.getAstName(), SET, ifTrue), ValueBuilder::makeSeq( - ValueBuilder::makeBinary(tempCondition.getAstName(), SET, condition), - ValueBuilder::makeConditional( - tempCondition.getAstName(), - tempIfTrue.getAstName(), - tempIfFalse.getAstName() + ValueBuilder::makeBinary(tempIfFalse.getAstName(), SET, ifFalse), + ValueBuilder::makeSeq( + ValueBuilder::makeBinary(tempCondition.getAstName(), SET, condition), + ValueBuilder::makeConditional( + tempCondition.getAstName(), + tempIfTrue.getAstName(), + tempIfFalse.getAstName() + ) ) ) - ) + ); + } else { + // Simple case without reordering. + return ValueBuilder::makeConditional( + visit(curr->condition, EXPRESSION_RESULT), + visit(curr->ifTrue, EXPRESSION_RESULT), + visit(curr->ifFalse, EXPRESSION_RESULT) ); + } } Ref visitReturn(Return* curr) { @@ -1838,6 +1881,10 @@ void Wasm2JSGlue::emitPreES6() { noteImport(import->module, import->base); }); + if (wasm.table.exists && wasm.table.imported()) { + out << "import { FUNCTION_TABLE } from 'env';\n"; + } + out << '\n'; } diff --git a/test/wasm2js/call_indirect.2asm.js b/test/wasm2js/call_indirect.2asm.js index a99d714fb..e4dfd0451 100644 --- a/test/wasm2js/call_indirect.2asm.js +++ b/test/wasm2js/call_indirect.2asm.js @@ -119,92 +119,83 @@ function asmFunc(global, env, buffer) { } function $16() { - var wasm2js_i32$0 = 0; - return (wasm2js_i32$0 = 0, FUNCTION_TABLE[wasm2js_i32$0]() | 0) | 0; + return FUNCTION_TABLE[0]() | 0; } function $17() { - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0; - i64toi32_i32$0 = (wasm2js_i32$0 = 1, FUNCTION_TABLE[wasm2js_i32$0]() | 0); + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; + i64toi32_i32$0 = FUNCTION_TABLE[1]() | 0; i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; i64toi32_i32$HIGH_BITS = i64toi32_i32$1; return i64toi32_i32$0 | 0; } function $18() { - var wasm2js_i32$0 = 0; - return Math_fround((wasm2js_i32$0 = 2, Math_fround(FUNCTION_TABLE[wasm2js_i32$0]()))); + return Math_fround(Math_fround(FUNCTION_TABLE[2]())); } function $19() { - var wasm2js_i32$0 = 0; - return +(wasm2js_i32$0 = 3, +FUNCTION_TABLE[wasm2js_i32$0]()); + return +FUNCTION_TABLE[3](); } function $20() { - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; i64toi32_i32$0 = 0; - i64toi32_i32$0 = (((wasm2js_i32$1 = 100, wasm2js_i32$2 = i64toi32_i32$0), wasm2js_i32$0 = 5), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0) | 0); + i64toi32_i32$0 = FUNCTION_TABLE[5](100, i64toi32_i32$0) | 0; i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; i64toi32_i32$HIGH_BITS = i64toi32_i32$1; return i64toi32_i32$0 | 0; } function $21() { - var wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; - return ((wasm2js_i32$1 = 32, wasm2js_i32$0 = 4), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0) | 0) | 0; + return FUNCTION_TABLE[4](32) | 0; } function $22() { - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; i64toi32_i32$0 = 0; - i64toi32_i32$0 = (((wasm2js_i32$1 = 64, wasm2js_i32$2 = i64toi32_i32$0), wasm2js_i32$0 = 5), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0) | 0); + i64toi32_i32$0 = FUNCTION_TABLE[5](64, i64toi32_i32$0) | 0; i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; i64toi32_i32$HIGH_BITS = i64toi32_i32$1; return i64toi32_i32$0 | 0; } function $23() { - var wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0); - return Math_fround(((wasm2js_f32$0 = Math_fround(1.3200000524520874), wasm2js_i32$0 = 6), Math_fround(FUNCTION_TABLE[wasm2js_i32$0](Math_fround(wasm2js_f32$0))))); + return Math_fround(Math_fround(FUNCTION_TABLE[6](Math_fround(1.3200000524520874)))); } function $24() { - var wasm2js_i32$0 = 0, wasm2js_f64$0 = 0.0; - return +((wasm2js_f64$0 = 1.64, wasm2js_i32$0 = 7), +FUNCTION_TABLE[wasm2js_i32$0](+wasm2js_f64$0)); + return +FUNCTION_TABLE[7](1.64); } function $25() { - var wasm2js_i32$0 = 0, wasm2js_f32$0 = Math_fround(0), wasm2js_i32$1 = 0; - return (((wasm2js_f32$0 = Math_fround(32.099998474121094), wasm2js_i32$1 = 32), wasm2js_i32$0 = 8), FUNCTION_TABLE[wasm2js_i32$0](Math_fround(wasm2js_f32$0), wasm2js_i32$1 | 0) | 0) | 0; + return FUNCTION_TABLE[8](Math_fround(32.099998474121094), 32) | 0; } function $26() { - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0, wasm2js_i32$3 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; i64toi32_i32$0 = 0; - i64toi32_i32$0 = ((((wasm2js_i32$1 = 32, wasm2js_i32$2 = 64), wasm2js_i32$3 = i64toi32_i32$0), wasm2js_i32$0 = 9), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0, wasm2js_i32$3 | 0) | 0); + i64toi32_i32$0 = FUNCTION_TABLE[9](32, 64, i64toi32_i32$0) | 0; i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; i64toi32_i32$HIGH_BITS = i64toi32_i32$1; return i64toi32_i32$0 | 0; } function $27() { - var wasm2js_i32$0 = 0, wasm2js_f64$0 = 0.0, wasm2js_f32$0 = Math_fround(0); - return Math_fround((((wasm2js_f64$0 = 64.0, wasm2js_f32$0 = Math_fround(32.0)), wasm2js_i32$0 = 10), Math_fround(FUNCTION_TABLE[wasm2js_i32$0](+wasm2js_f64$0, Math_fround(wasm2js_f32$0))))); + return Math_fround(Math_fround(FUNCTION_TABLE[10](64.0, Math_fround(32.0)))); } function $28() { - var wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0, wasm2js_f64$0 = 0.0; - return +((((wasm2js_i32$1 = 64, wasm2js_i32$2 = 0), wasm2js_f64$0 = 64.1), wasm2js_i32$0 = 11), +FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0, +wasm2js_f64$0)); + return +FUNCTION_TABLE[11](64, 0, 64.1); } function $29($0, $1, $1$hi) { $0 = $0 | 0; $1 = $1 | 0; $1$hi = $1$hi | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; i64toi32_i32$0 = $1$hi; - i64toi32_i32$0 = (((wasm2js_i32$1 = $1, wasm2js_i32$2 = i64toi32_i32$0), wasm2js_i32$0 = $0), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0) | 0); + i64toi32_i32$0 = FUNCTION_TABLE[$0]($1, i64toi32_i32$0) | 0; i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; i64toi32_i32$HIGH_BITS = i64toi32_i32$1; return i64toi32_i32$0 | 0; @@ -212,9 +203,9 @@ function asmFunc(global, env, buffer) { function $30($0) { $0 = $0 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; i64toi32_i32$0 = 0; - i64toi32_i32$0 = (((wasm2js_i32$1 = 9, wasm2js_i32$2 = i64toi32_i32$0), wasm2js_i32$0 = $0), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0) | 0); + i64toi32_i32$0 = FUNCTION_TABLE[$0](9, i64toi32_i32$0) | 0; i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; i64toi32_i32$HIGH_BITS = i64toi32_i32$1; return i64toi32_i32$0 | 0; @@ -223,7 +214,7 @@ function asmFunc(global, env, buffer) { function fac($0, $0$hi) { $0 = $0 | 0; $0$hi = $0$hi | 0; - var i64toi32_i32$5 = 0, i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, $8 = 0, $8$hi = 0, i64toi32_i32$3 = 0, $6 = 0, $6$hi = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$5 = 0, i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, $8 = 0, $8$hi = 0, i64toi32_i32$3 = 0, $6 = 0, $6$hi = 0; i64toi32_i32$0 = $0$hi; if (!($0 | i64toi32_i32$0)) { { @@ -238,7 +229,7 @@ function asmFunc(global, env, buffer) { i64toi32_i32$3 = 1; i64toi32_i32$5 = (i64toi32_i32$2 >>> 0 < i64toi32_i32$3 >>> 0) + 0 | 0; i64toi32_i32$5 = i64toi32_i32$0 - i64toi32_i32$5 | 0; - i64toi32_i32$5 = (((wasm2js_i32$1 = i64toi32_i32$2 - i64toi32_i32$3 | 0, wasm2js_i32$2 = i64toi32_i32$5), wasm2js_i32$0 = 12), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0) | 0); + i64toi32_i32$5 = FUNCTION_TABLE[12](i64toi32_i32$2 - i64toi32_i32$3 | 0, i64toi32_i32$5) | 0; i64toi32_i32$2 = i64toi32_i32$HIGH_BITS; $6 = i64toi32_i32$5; $6$hi = i64toi32_i32$2; @@ -259,7 +250,7 @@ function asmFunc(global, env, buffer) { function fib($0, $0$hi) { $0 = $0 | 0; $0$hi = $0$hi | 0; - var i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$5 = 0, i64toi32_i32$4 = 0, i64toi32_i32$6 = 0, $10 = 0, $10$hi = 0, $5 = 0, $5$hi = 0, $8 = 0, $8$hi = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$5 = 0, i64toi32_i32$4 = 0, i64toi32_i32$6 = 0, $10 = 0, $10$hi = 0, $5 = 0, $5$hi = 0, $8 = 0, $8$hi = 0; i64toi32_i32$0 = $0$hi; i64toi32_i32$2 = $0; i64toi32_i32$1 = 0; @@ -280,7 +271,7 @@ function asmFunc(global, env, buffer) { i64toi32_i32$6 = i64toi32_i32$3 >>> 0 < i64toi32_i32$1 >>> 0; i64toi32_i32$5 = i64toi32_i32$6 + i64toi32_i32$0 | 0; i64toi32_i32$5 = i64toi32_i32$2 - i64toi32_i32$5 | 0; - i64toi32_i32$5 = (((wasm2js_i32$1 = i64toi32_i32$4, wasm2js_i32$2 = i64toi32_i32$5), wasm2js_i32$0 = 13), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0) | 0); + i64toi32_i32$5 = FUNCTION_TABLE[13](i64toi32_i32$4, i64toi32_i32$5) | 0; i64toi32_i32$3 = i64toi32_i32$HIGH_BITS; $5 = i64toi32_i32$5; $5$hi = i64toi32_i32$3; @@ -293,7 +284,7 @@ function asmFunc(global, env, buffer) { i64toi32_i32$6 = i64toi32_i32$2 >>> 0 < i64toi32_i32$1 >>> 0; i64toi32_i32$4 = i64toi32_i32$6 + i64toi32_i32$5 | 0; i64toi32_i32$4 = i64toi32_i32$3 - i64toi32_i32$4 | 0; - i64toi32_i32$4 = (((wasm2js_i32$2 = i64toi32_i32$0, wasm2js_i32$1 = i64toi32_i32$4), wasm2js_i32$0 = 13), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$2 | 0, wasm2js_i32$1 | 0) | 0); + i64toi32_i32$4 = FUNCTION_TABLE[13](i64toi32_i32$0, i64toi32_i32$4) | 0; i64toi32_i32$2 = i64toi32_i32$HIGH_BITS; $8 = i64toi32_i32$4; $8$hi = i64toi32_i32$2; @@ -318,39 +309,36 @@ function asmFunc(global, env, buffer) { function even($0) { $0 = $0 | 0; - var $6 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; + var $6 = 0; if (!$0) { $6 = 44 } else { - $6 = ((wasm2js_i32$1 = $0 - 1 | 0, wasm2js_i32$0 = 15), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0) | 0) + $6 = FUNCTION_TABLE[15]($0 - 1 | 0) | 0 } return $6 | 0; } function odd($0) { $0 = $0 | 0; - var $6 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; + var $6 = 0; if (!$0) { $6 = 99 } else { - $6 = ((wasm2js_i32$1 = $0 - 1 | 0, wasm2js_i32$0 = 14), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0) | 0) + $6 = FUNCTION_TABLE[14]($0 - 1 | 0) | 0 } return $6 | 0; } function runaway() { - var wasm2js_i32$0 = 0; - wasm2js_i32$0 = 16, FUNCTION_TABLE[wasm2js_i32$0](); + FUNCTION_TABLE[16](); } function mutual_runaway1() { - var wasm2js_i32$0 = 0; - wasm2js_i32$0 = 18, FUNCTION_TABLE[wasm2js_i32$0](); + FUNCTION_TABLE[18](); } function mutual_runaway2() { - var wasm2js_i32$0 = 0; - wasm2js_i32$0 = 17, FUNCTION_TABLE[wasm2js_i32$0](); + FUNCTION_TABLE[17](); } function legalstub$17() { diff --git a/test/wasm2js/emscripten.2asm.js b/test/wasm2js/emscripten.2asm.js index 5e4109c46..0b1d7ee67 100644 --- a/test/wasm2js/emscripten.2asm.js +++ b/test/wasm2js/emscripten.2asm.js @@ -27,10 +27,9 @@ function asmFunc(global, env, buffer) { var syscall$54 = env.__syscall54; // EMSCRIPTEN_START_FUNCS; function main() { - var wasm2js_i32$0 = 0; syscall$6(1 | 0, 2 | 0) | 0; syscall$54(3 | 0, 4 | 0) | 0; - wasm2js_i32$0 = HEAP32[0 + 1030 >> 2], FUNCTION_TABLE[wasm2js_i32$0](); + FUNCTION_TABLE[HEAP32[0 + 1030 >> 2]](); internal(1); tabled(1); exported(1); diff --git a/test/wasm2js/f32.2asm.js b/test/wasm2js/f32.2asm.js index 0c852356e..d136a94af 100644 --- a/test/wasm2js/f32.2asm.js +++ b/test/wasm2js/f32.2asm.js @@ -121,7 +121,7 @@ function asmFunc(global, env, buffer) { } function __wasm_nearest_f32(var$0) { - var var$1 = Math_fround(0), var$2 = Math_fround(0), wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0; + var var$1 = Math_fround(0), var$2 = Math_fround(0); var$1 = Math_fround(Math_floor(var$0)); var$2 = Math_fround(var$0 - var$1); if (!(var$2 < Math_fround(.5))) { @@ -131,15 +131,14 @@ function asmFunc(global, env, buffer) { return var$0 } var$2 = Math_fround(var$1 * Math_fround(.5)); - var$1 = (wasm2js_f32$0 = var$1, wasm2js_f32$1 = var$0, wasm2js_i32$0 = Math_fround(var$2 - Math_fround(Math_floor(var$2))) == Math_fround(0.0), wasm2js_i32$0 ? wasm2js_f32$0 : wasm2js_f32$1); + var$1 = Math_fround(var$2 - Math_fround(Math_floor(var$2))) == Math_fround(0.0) ? var$1 : var$0; } } return var$1; } function __wasm_trunc_f32(var$0) { - var wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0; - return wasm2js_f32$0 = Math_fround(Math_ceil(var$0)), wasm2js_f32$1 = Math_fround(Math_floor(var$0)), wasm2js_i32$0 = var$0 < Math_fround(0.0), wasm2js_i32$0 ? wasm2js_f32$0 : wasm2js_f32$1; + return var$0 < Math_fround(0.0) ? Math_fround(Math_ceil(var$0)) : Math_fround(Math_floor(var$0)); } var FUNCTION_TABLE = []; diff --git a/test/wasm2js/f64.2asm.js b/test/wasm2js/f64.2asm.js index 7eda48599..727bd7dc4 100644 --- a/test/wasm2js/f64.2asm.js +++ b/test/wasm2js/f64.2asm.js @@ -145,7 +145,7 @@ function asmFunc(global, env, buffer) { } function __wasm_nearest_f64(var$0) { - var var$1 = 0.0, var$2 = 0.0, wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0; + var var$1 = 0.0, var$2 = 0.0; var$1 = Math_floor(var$0); var$2 = var$0 - var$1; if (!(var$2 < .5)) { @@ -155,15 +155,14 @@ function asmFunc(global, env, buffer) { return var$0 } var$2 = var$1 * .5; - var$1 = (wasm2js_f64$0 = var$1, wasm2js_f64$1 = var$0, wasm2js_i32$0 = var$2 - Math_floor(var$2) == 0.0, wasm2js_i32$0 ? wasm2js_f64$0 : wasm2js_f64$1); + var$1 = var$2 - Math_floor(var$2) == 0.0 ? var$1 : var$0; } } return var$1; } function __wasm_trunc_f64(var$0) { - var wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0; - return wasm2js_f64$0 = Math_ceil(var$0), wasm2js_f64$1 = Math_floor(var$0), wasm2js_i32$0 = var$0 < 0.0, wasm2js_i32$0 ? wasm2js_f64$0 : wasm2js_f64$1; + return var$0 < 0.0 ? Math_ceil(var$0) : Math_floor(var$0); } var FUNCTION_TABLE = []; diff --git a/test/wasm2js/float_misc.2asm.js b/test/wasm2js/float_misc.2asm.js index 0284b5623..b977cbede 100644 --- a/test/wasm2js/float_misc.2asm.js +++ b/test/wasm2js/float_misc.2asm.js @@ -230,7 +230,7 @@ function asmFunc(global, env, buffer) { } function __wasm_nearest_f32(var$0) { - var var$1 = Math_fround(0), var$2 = Math_fround(0), wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0; + var var$1 = Math_fround(0), var$2 = Math_fround(0); var$1 = Math_fround(Math_floor(var$0)); var$2 = Math_fround(var$0 - var$1); if (!(var$2 < Math_fround(.5))) { @@ -240,14 +240,14 @@ function asmFunc(global, env, buffer) { return var$0 } var$2 = Math_fround(var$1 * Math_fround(.5)); - var$1 = (wasm2js_f32$0 = var$1, wasm2js_f32$1 = var$0, wasm2js_i32$0 = Math_fround(var$2 - Math_fround(Math_floor(var$2))) == Math_fround(0.0), wasm2js_i32$0 ? wasm2js_f32$0 : wasm2js_f32$1); + var$1 = Math_fround(var$2 - Math_fround(Math_floor(var$2))) == Math_fround(0.0) ? var$1 : var$0; } } return var$1; } function __wasm_nearest_f64(var$0) { - var var$1 = 0.0, var$2 = 0.0, wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0; + var var$1 = 0.0, var$2 = 0.0; var$1 = Math_floor(var$0); var$2 = var$0 - var$1; if (!(var$2 < .5)) { @@ -257,20 +257,18 @@ function asmFunc(global, env, buffer) { return var$0 } var$2 = var$1 * .5; - var$1 = (wasm2js_f64$0 = var$1, wasm2js_f64$1 = var$0, wasm2js_i32$0 = var$2 - Math_floor(var$2) == 0.0, wasm2js_i32$0 ? wasm2js_f64$0 : wasm2js_f64$1); + var$1 = var$2 - Math_floor(var$2) == 0.0 ? var$1 : var$0; } } return var$1; } function __wasm_trunc_f32(var$0) { - var wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0; - return wasm2js_f32$0 = Math_fround(Math_ceil(var$0)), wasm2js_f32$1 = Math_fround(Math_floor(var$0)), wasm2js_i32$0 = var$0 < Math_fround(0.0), wasm2js_i32$0 ? wasm2js_f32$0 : wasm2js_f32$1; + return var$0 < Math_fround(0.0) ? Math_fround(Math_ceil(var$0)) : Math_fround(Math_floor(var$0)); } function __wasm_trunc_f64(var$0) { - var wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0; - return wasm2js_f64$0 = Math_ceil(var$0), wasm2js_f64$1 = Math_floor(var$0), wasm2js_i32$0 = var$0 < 0.0, wasm2js_i32$0 ? wasm2js_f64$0 : wasm2js_f64$1; + return var$0 < 0.0 ? Math_ceil(var$0) : Math_floor(var$0); } var FUNCTION_TABLE = []; diff --git a/test/wasm2js/func-ptr-offset.2asm.js b/test/wasm2js/func-ptr-offset.2asm.js index 2a2a0b425..5789e47d4 100644 --- a/test/wasm2js/func-ptr-offset.2asm.js +++ b/test/wasm2js/func-ptr-offset.2asm.js @@ -35,8 +35,7 @@ function asmFunc(global, env, buffer) { function $3($0) { $0 = $0 | 0; - var wasm2js_i32$0 = 0; - return (wasm2js_i32$0 = $0, FUNCTION_TABLE[wasm2js_i32$0]() | 0) | 0; + return FUNCTION_TABLE[$0]() | 0; } var FUNCTION_TABLE = [null, t1, t2, t3]; diff --git a/test/wasm2js/func.2asm.js b/test/wasm2js/func.2asm.js index b87622a7d..a8a0fbffa 100644 --- a/test/wasm2js/func.2asm.js +++ b/test/wasm2js/func.2asm.js @@ -393,35 +393,32 @@ function asmFunc(global, env, buffer) { } function $76() { - var wasm2js_i32$0 = 0; - wasm2js_i32$0 = 1, FUNCTION_TABLE[wasm2js_i32$0](); - wasm2js_i32$0 = 4, FUNCTION_TABLE[wasm2js_i32$0](); + FUNCTION_TABLE[1](); + FUNCTION_TABLE[4](); } function $77() { - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, wasm2js_i32$0 = 0, wasm2js_f64$0 = 0.0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0, wasm2js_f64$1 = 0.0, wasm2js_i32$3 = 0, wasm2js_i32$4 = 0, wasm2js_f64$2 = 0.0, wasm2js_i32$5 = 0, wasm2js_i32$6 = 0, wasm2js_f32$0 = Math_fround(0), wasm2js_i32$7 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0; i64toi32_i32$0 = 0; i64toi32_i32$1 = 0; i64toi32_i32$2 = 0; - (((((((((((wasm2js_f64$0 = 0.0, wasm2js_i32$1 = 0), wasm2js_i32$2 = i64toi32_i32$0), wasm2js_f64$1 = 0.0), wasm2js_i32$3 = 0), wasm2js_i32$4 = i64toi32_i32$1), wasm2js_f64$2 = 0.0), wasm2js_i32$5 = 0), wasm2js_i32$6 = i64toi32_i32$2), wasm2js_f32$0 = Math_fround(0.0)), wasm2js_i32$7 = 0), wasm2js_i32$0 = 0), FUNCTION_TABLE[wasm2js_i32$0](+wasm2js_f64$0, wasm2js_i32$1 | 0, wasm2js_i32$2 | 0, +wasm2js_f64$1, wasm2js_i32$3 | 0, wasm2js_i32$4 | 0, +wasm2js_f64$2, wasm2js_i32$5 | 0, wasm2js_i32$6 | 0, Math_fround(wasm2js_f32$0), wasm2js_i32$7 | 0); + FUNCTION_TABLE[0](0.0, 0, i64toi32_i32$0, 0.0, 0, i64toi32_i32$1, 0.0, 0, i64toi32_i32$2, Math_fround(0.0), 0); i64toi32_i32$2 = 0; i64toi32_i32$1 = 0; i64toi32_i32$0 = 0; - (((((((((((wasm2js_f64$2 = 0.0, wasm2js_i32$7 = 0), wasm2js_i32$6 = i64toi32_i32$2), wasm2js_f64$1 = 0.0), wasm2js_i32$5 = 0), wasm2js_i32$4 = i64toi32_i32$1), wasm2js_f64$0 = 0.0), wasm2js_i32$3 = 0), wasm2js_i32$2 = i64toi32_i32$0), wasm2js_f32$0 = Math_fround(0.0)), wasm2js_i32$1 = 0), wasm2js_i32$0 = 2), FUNCTION_TABLE[wasm2js_i32$0](+wasm2js_f64$2, wasm2js_i32$7 | 0, wasm2js_i32$6 | 0, +wasm2js_f64$1, wasm2js_i32$5 | 0, wasm2js_i32$4 | 0, +wasm2js_f64$0, wasm2js_i32$3 | 0, wasm2js_i32$2 | 0, Math_fround(wasm2js_f32$0), wasm2js_i32$1 | 0); + FUNCTION_TABLE[2](0.0, 0, i64toi32_i32$2, 0.0, 0, i64toi32_i32$1, 0.0, 0, i64toi32_i32$0, Math_fround(0.0), 0); i64toi32_i32$0 = 0; i64toi32_i32$1 = 0; i64toi32_i32$2 = 0; - (((((((((((wasm2js_f64$0 = 0.0, wasm2js_i32$1 = 0), wasm2js_i32$2 = i64toi32_i32$0), wasm2js_f64$1 = 0.0), wasm2js_i32$3 = 0), wasm2js_i32$4 = i64toi32_i32$1), wasm2js_f64$2 = 0.0), wasm2js_i32$5 = 0), wasm2js_i32$6 = i64toi32_i32$2), wasm2js_f32$0 = Math_fround(0.0)), wasm2js_i32$7 = 0), wasm2js_i32$0 = 3), FUNCTION_TABLE[wasm2js_i32$0](+wasm2js_f64$0, wasm2js_i32$1 | 0, wasm2js_i32$2 | 0, +wasm2js_f64$1, wasm2js_i32$3 | 0, wasm2js_i32$4 | 0, +wasm2js_f64$2, wasm2js_i32$5 | 0, wasm2js_i32$6 | 0, Math_fround(wasm2js_f32$0), wasm2js_i32$7 | 0); + FUNCTION_TABLE[3](0.0, 0, i64toi32_i32$0, 0.0, 0, i64toi32_i32$1, 0.0, 0, i64toi32_i32$2, Math_fround(0.0), 0); } function $78() { - var wasm2js_i32$0 = 0; - wasm2js_i32$0 = 1, FUNCTION_TABLE[wasm2js_i32$0](); + FUNCTION_TABLE[1](); } function $79() { - var wasm2js_i32$0 = 0, wasm2js_f64$0 = 0.0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0, wasm2js_f64$1 = 0.0, wasm2js_i32$3 = 0, wasm2js_i32$4 = 0, wasm2js_f64$2 = 0.0, wasm2js_i32$5 = 0, wasm2js_i32$6 = 0, wasm2js_f32$0 = Math_fround(0), wasm2js_i32$7 = 0; - (((((((((((wasm2js_f64$0 = 0.0, wasm2js_i32$1 = 0), wasm2js_i32$2 = 0), wasm2js_f64$1 = 0.0), wasm2js_i32$3 = 0), wasm2js_i32$4 = 0), wasm2js_f64$2 = 0.0), wasm2js_i32$5 = 0), wasm2js_i32$6 = 0), wasm2js_f32$0 = Math_fround(0.0)), wasm2js_i32$7 = 0), wasm2js_i32$0 = 0), FUNCTION_TABLE[wasm2js_i32$0](+wasm2js_f64$0, wasm2js_i32$1 | 0, wasm2js_i32$2 | 0, +wasm2js_f64$1, wasm2js_i32$3 | 0, wasm2js_i32$4 | 0, +wasm2js_f64$2, wasm2js_i32$5 | 0, wasm2js_i32$6 | 0, Math_fround(wasm2js_f32$0), wasm2js_i32$7 | 0); + FUNCTION_TABLE[0](0.0, 0, 0, 0.0, 0, 0, 0.0, 0, 0, Math_fround(0.0), 0); } function legalstub$24() { diff --git a/test/wasm2js/func_ptrs.2asm.js b/test/wasm2js/func_ptrs.2asm.js index b1936241d..708879e51 100644 --- a/test/wasm2js/func_ptrs.2asm.js +++ b/test/wasm2js/func_ptrs.2asm.js @@ -102,14 +102,12 @@ function asmFunc(global, env, buffer) { function $5(i) { i = i | 0; - var wasm2js_i32$0 = 0; - return (wasm2js_i32$0 = i, FUNCTION_TABLE[wasm2js_i32$0]() | 0) | 0; + return FUNCTION_TABLE[i]() | 0; } function $6(i) { i = i | 0; - var wasm2js_i32$0 = 0; - return (wasm2js_i32$0 = i, FUNCTION_TABLE[wasm2js_i32$0]() | 0) | 0; + return FUNCTION_TABLE[i]() | 0; } var FUNCTION_TABLE = [t1, t2, t3, u1, u2, t1, t3]; @@ -156,8 +154,7 @@ function asmFunc(global, env, buffer) { function $2(i) { i = i | 0; - var wasm2js_i32$0 = 0; - return (wasm2js_i32$0 = i, FUNCTION_TABLE[wasm2js_i32$0]() | 0) | 0; + return FUNCTION_TABLE[i]() | 0; } var FUNCTION_TABLE = [t1, t2]; diff --git a/test/wasm2js/left-to-right.2asm.js b/test/wasm2js/left-to-right.2asm.js index cb551e9ac..7f8a952d9 100644 --- a/test/wasm2js/left-to-right.2asm.js +++ b/test/wasm2js/left-to-right.2asm.js @@ -993,7 +993,7 @@ function asmFunc(global, env, buffer) { } function $92() { - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, $0 = 0, $0$hi = 0, $1 = 0, $1$hi = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0, wasm2js_i32$3 = 0, wasm2js_i32$4 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, $0 = 0, $0$hi = 0, $1 = 0, $1$hi = 0; reset(); i64toi32_i32$0 = i64_left(); i64toi32_i32$1 = i64toi32_i32$HIGH_BITS; @@ -1005,7 +1005,7 @@ function asmFunc(global, env, buffer) { $1$hi = i64toi32_i32$0; i64toi32_i32$0 = $0$hi; i64toi32_i32$1 = $1$hi; - ((((wasm2js_i32$1 = $0, wasm2js_i32$2 = i64toi32_i32$0), wasm2js_i32$3 = $1), wasm2js_i32$4 = i64toi32_i32$1), wasm2js_i32$0 = i64_callee()), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0, wasm2js_i32$2 | 0, wasm2js_i32$3 | 0, wasm2js_i32$4 | 0) | 0; + FUNCTION_TABLE[i64_callee()]($0, i64toi32_i32$0, $1, i64toi32_i32$1) | 0; return get() | 0; } diff --git a/test/wasm2js/nested-selects.2asm.js b/test/wasm2js/nested-selects.2asm.js index b0fd8fed0..129ea99c9 100644 --- a/test/wasm2js/nested-selects.2asm.js +++ b/test/wasm2js/nested-selects.2asm.js @@ -23,8 +23,7 @@ function asmFunc(global, env, buffer) { var infinity = global.Infinity; function $1($0) { $0 = $0 | 0; - var wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0, wasm2js_i32$3 = 0, wasm2js_i32$4 = 0, wasm2js_i32$5 = 0; - return (wasm2js_i32$0 = -1, wasm2js_i32$1 = (wasm2js_i32$3 = 1, wasm2js_i32$4 = 0, wasm2js_i32$5 = ($0 | 0) > (0 | 0), wasm2js_i32$5 ? wasm2js_i32$3 : wasm2js_i32$4), wasm2js_i32$2 = ($0 | 0) < (0 | 0), wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1) | 0; + return (($0 | 0) < (0 | 0) ? -1 : ($0 | 0) > (0 | 0) ? 1 : 0) | 0; } var FUNCTION_TABLE = []; diff --git a/test/wasm2js/ordering.2asm.js b/test/wasm2js/ordering.2asm.js new file mode 100644 index 000000000..6e8f87af0 --- /dev/null +++ b/test/wasm2js/ordering.2asm.js @@ -0,0 +1,66 @@ +import { FUNCTION_TABLE } from 'env'; + +function asmFunc(global, env, buffer) { + "almost asm"; + var HEAP8 = new global.Int8Array(buffer); + var HEAP16 = new global.Int16Array(buffer); + var HEAP32 = new global.Int32Array(buffer); + var HEAPU8 = new global.Uint8Array(buffer); + var HEAPU16 = new global.Uint16Array(buffer); + var HEAPU32 = new global.Uint32Array(buffer); + var HEAPF32 = new global.Float32Array(buffer); + var HEAPF64 = new global.Float64Array(buffer); + var Math_imul = global.Math.imul; + var Math_fround = global.Math.fround; + var Math_abs = global.Math.abs; + var Math_clz32 = global.Math.clz32; + var Math_min = global.Math.min; + var Math_max = global.Math.max; + var Math_floor = global.Math.floor; + var Math_ceil = global.Math.ceil; + var Math_sqrt = global.Math.sqrt; + var abort = env.abort; + var nan = global.NaN; + var infinity = global.Infinity; + function main() { + var wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + FUNCTION_TABLE[foo(2)](1) | 0; + FUNCTION_TABLE[4](foo(3)) | 0; + (wasm2js_i32$1 = foo(5), wasm2js_i32$0 = bar(6)), FUNCTION_TABLE[wasm2js_i32$0](wasm2js_i32$1 | 0) | 0; + FUNCTION_TABLE[8](7) | 0; + baz(11 ? 9 : 10); + baz((wasm2js_i32$0 = foo(12), wasm2js_i32$1 = 13, wasm2js_i32$2 = 14, wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1)); + baz((wasm2js_i32$0 = 15, wasm2js_i32$1 = foo(16), wasm2js_i32$2 = 17, wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1)); + baz(foo(20) ? 18 : 19); + baz((wasm2js_i32$0 = foo(21), wasm2js_i32$1 = 22, wasm2js_i32$2 = foo(23), wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1)); + baz((wasm2js_i32$0 = 24, wasm2js_i32$1 = foo(25), wasm2js_i32$2 = foo(26), wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1)); + baz((wasm2js_i32$0 = foo(27), wasm2js_i32$1 = foo(28), wasm2js_i32$2 = 29, wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1)); + baz((wasm2js_i32$0 = foo(30), wasm2js_i32$1 = foo(31), wasm2js_i32$2 = foo(32), wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1)); + } + + function foo($0) { + $0 = $0 | 0; + return 1 | 0; + } + + function bar($0) { + $0 = $0 | 0; + return 2 | 0; + } + + function baz($0) { + $0 = $0 | 0; + return 3 | 0; + } + + FUNCTION_TABLE[1] = foo; + FUNCTION_TABLE[2] = bar; + FUNCTION_TABLE[3] = baz; + return { + "main": main + }; +} + +var memasmFunc = new ArrayBuffer(65536); +var retasmFunc = asmFunc({Math,Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,NaN,Infinity}, {abort:function() { throw new Error('abort'); }},memasmFunc); +export var main = retasmFunc.main; diff --git a/test/wasm2js/ordering.wast b/test/wasm2js/ordering.wast new file mode 100644 index 000000000..a53caafb5 --- /dev/null +++ b/test/wasm2js/ordering.wast @@ -0,0 +1,98 @@ +(module + (type $0 (func (param i32) (result i32))) + (import "env" "table" (table $timport$9 7 funcref)) + (elem (i32.const 1) $foo $bar $baz) + (export "main" (func $main)) + (func $main + (drop + (call_indirect (type $0) + (i32.const 1) + (call $foo (i32.const 2)) + ) + ) + (drop + (call_indirect (type $0) + (call $foo (i32.const 3)) + (i32.const 4) + ) + ) + (drop + (call_indirect (type $0) + (call $foo (i32.const 5)) + (call $bar (i32.const 6)) + ) + ) + (drop + (call_indirect (type $0) + (i32.const 7) + (i32.const 8) + ) + ) + (drop (call $baz + (select + (i32.const 9) + (i32.const 10) + (i32.const 11) + ) + )) + (drop (call $baz + (select + (call $foo (i32.const 12)) + (i32.const 13) + (i32.const 14) + ) + )) + (drop (call $baz + (select + (i32.const 15) + (call $foo (i32.const 16)) + (i32.const 17) + ) + )) + (drop (call $baz + (select + (i32.const 18) + (i32.const 19) + (call $foo (i32.const 20)) + ) + )) + (drop (call $baz + (select + (call $foo (i32.const 21)) + (i32.const 22) + (call $foo (i32.const 23)) + ) + )) + (drop (call $baz + (select + (i32.const 24) + (call $foo (i32.const 25)) + (call $foo (i32.const 26)) + ) + )) + (drop (call $baz + (select + (call $foo (i32.const 27)) + (call $foo (i32.const 28)) + (i32.const 29) + ) + )) + (drop (call $baz + (select + (call $foo (i32.const 30)) + (call $foo (i32.const 31)) + (call $foo (i32.const 32)) + ) + )) + ) + (func $foo (param i32) (result i32) + (i32.const 1) + ) + (func $bar (param i32) (result i32) + (i32.const 2) + ) + (func $baz (param i32) (result i32) + (i32.const 3) + ) +) + diff --git a/test/wasm2js/select.2asm.js b/test/wasm2js/select.2asm.js index 07de1de95..efe720c21 100644 --- a/test/wasm2js/select.2asm.js +++ b/test/wasm2js/select.2asm.js @@ -28,8 +28,7 @@ function asmFunc(global, env, buffer) { lhs = lhs | 0; rhs = rhs | 0; cond = cond | 0; - var wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; - return (wasm2js_i32$0 = lhs, wasm2js_i32$1 = rhs, wasm2js_i32$2 = cond, wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1) | 0; + return (cond ? lhs : rhs) | 0; } function $1(lhs, lhs$hi, rhs, rhs$hi, cond) { @@ -38,13 +37,13 @@ function asmFunc(global, env, buffer) { rhs = rhs | 0; rhs$hi = rhs$hi | 0; cond = cond | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, i64toi32_i32$2 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0, wasm2js_i32$2 = 0; + var i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, i64toi32_i32$2 = 0; i64toi32_i32$0 = lhs$hi; i64toi32_i32$0 = rhs$hi; i64toi32_i32$4 = cond; i64toi32_i32$0 = lhs$hi; - i64toi32_i32$3 = (wasm2js_i32$0 = lhs, wasm2js_i32$1 = rhs, wasm2js_i32$2 = i64toi32_i32$4, wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1); - i64toi32_i32$2 = (wasm2js_i32$0 = i64toi32_i32$0, wasm2js_i32$1 = rhs$hi, wasm2js_i32$2 = i64toi32_i32$4, wasm2js_i32$2 ? wasm2js_i32$0 : wasm2js_i32$1); + i64toi32_i32$3 = i64toi32_i32$4 ? lhs : rhs; + i64toi32_i32$2 = i64toi32_i32$4 ? i64toi32_i32$0 : rhs$hi; i64toi32_i32$HIGH_BITS = i64toi32_i32$2; return i64toi32_i32$3 | 0; } @@ -53,16 +52,14 @@ function asmFunc(global, env, buffer) { lhs = Math_fround(lhs); rhs = Math_fround(rhs); cond = cond | 0; - var wasm2js_f32$0 = Math_fround(0), wasm2js_f32$1 = Math_fround(0), wasm2js_i32$0 = 0; - return Math_fround((wasm2js_f32$0 = lhs, wasm2js_f32$1 = rhs, wasm2js_i32$0 = cond, wasm2js_i32$0 ? wasm2js_f32$0 : wasm2js_f32$1)); + return Math_fround(cond ? lhs : rhs); } function $3(lhs, rhs, cond) { lhs = +lhs; rhs = +rhs; cond = cond | 0; - var wasm2js_f64$0 = 0.0, wasm2js_f64$1 = 0.0, wasm2js_i32$0 = 0; - return +(wasm2js_f64$0 = lhs, wasm2js_f64$1 = rhs, wasm2js_i32$0 = cond, wasm2js_i32$0 ? wasm2js_f64$0 : wasm2js_f64$1); + return +(cond ? lhs : rhs); } function $4(cond) { |