diff options
40 files changed, 1964 insertions, 1613 deletions
diff --git a/src/pass.h b/src/pass.h index 21836ebf9..2f3bca078 100644 --- a/src/pass.h +++ b/src/pass.h @@ -109,8 +109,14 @@ struct PassRunner { void addDefaultFunctionOptimizationPasses(); // Adds the default optimization passes that work on - // entire modules as a whole. - void addDefaultGlobalOptimizationPasses(); + // entire modules as a whole, and make sense to + // run before function passes. + void addDefaultGlobalOptimizationPrePasses(); + + // Adds the default optimization passes that work on + // entire modules as a whole, and make sense to + // run after function passes. + void addDefaultGlobalOptimizationPostPasses(); // Run the passes on the module void run(); diff --git a/src/passes/Inlining.cpp b/src/passes/Inlining.cpp index c352a704a..377aa5247 100644 --- a/src/passes/Inlining.cpp +++ b/src/passes/Inlining.cpp @@ -18,45 +18,68 @@ // Inlining. // // For now, this does a conservative inlining of all functions that have -// exactly one use. That should not increase code size, and may have -// speed benefits. +// exactly one use, and are fairly small. That should not increase code +// size, and may have speed benefits. // +#include <atomic> + #include <wasm.h> #include <pass.h> #include <wasm-builder.h> +#include <ast_utils.h> #include <parsing.h> namespace wasm { +// A limit on how big a function to inline. +static const int INLINING_SIZE_LIMIT = 15; + +// We only inline a function with a single use. +static const int SINGLE_USE = 1; + +// A number of uses of a function that is too high for us to +// inline it to all those locations. +static const int TOO_MANY_USES_TO_INLINE = SINGLE_USE + 1; + +// Map of function name => number of uses. We build the values in +// parallel, using atomic increments. This is safe because we never +// update the map itself in parallel, we only update the values, +// and so the map never allocates or moves values which could be +// a problem with atomics (in fact it would be a problem in general +// as well, not just with atomics, as we don't use a lock in +// parallel access, we depend on the map itself being constant +// when running multiple threads). +typedef std::map<Name, std::atomic<Index>> NameToAtomicIndexMap; + struct FunctionUseCounter : public WalkerPass<PostWalker<FunctionUseCounter>> { bool isFunctionParallel() override { return true; } - FunctionUseCounter(std::map<Name, Index>* output) : output(output) {} + FunctionUseCounter(NameToAtomicIndexMap* uses) : uses(uses) {} FunctionUseCounter* create() override { - return new FunctionUseCounter(output); + return new FunctionUseCounter(uses); } void visitCall(Call *curr) { - (*output)[curr->target]++; + assert(uses->count(curr->target) > 0); // can't add a new element in parallel + (*uses)[curr->target]++; } private: - std::map<Name, Index>* output; + NameToAtomicIndexMap* uses; }; -struct Action { - Call* call; - Block* block; // the replacement for the call, into which we should inline +struct InliningAction { + Expression** callSite; Function* contents; - Action(Call* call, Block* block, Function* contents) : call(call), block(block), contents(contents) {} + InliningAction(Expression** callSite, Function* contents) : callSite(callSite), contents(contents) {} }; struct InliningState { std::set<Name> canInline; - std::map<Name, std::vector<Action>> actionsForFunction; // function name => actions that can be performed in it + std::map<Name, std::vector<InliningAction>> actionsForFunction; // function name => actions that can be performed in it }; struct Planner : public WalkerPass<PostWalker<Planner>> { @@ -68,12 +91,18 @@ struct Planner : public WalkerPass<PostWalker<Planner>> { return new Planner(state); } - void visitCall(Call *curr) { - if (state->canInline.count(curr->target)) { - auto* block = Builder(*getModule()).makeBlock(); - block->type = curr->type; + void visitCall(Call* curr) { + // plan to inline if we know this is valid to inline, and if the call is + // actually performed - if it is dead code, it's pointless to inline + if (state->canInline.count(curr->target) && + curr->type != unreachable) { + // nest the call in a block. that way the location of the pointer to the call will not + // change even if we inline multiple times into the same function, otherwise + // call1(call2()) might be a problem + auto* block = Builder(*getModule()).makeBlock(curr); replaceCurrent(block); - state->actionsForFunction[getFunction()->name].emplace_back(curr, block, getModule()->getFunction(curr->target)); + assert(state->actionsForFunction.count(getFunction()->name) > 0); // can't add a new element in parallel + state->actionsForFunction[getFunction()->name].emplace_back(&block->list[0], getModule()->getFunction(curr->target)); } } @@ -91,13 +120,13 @@ private: // Core inlining logic. Modifies the outside function (adding locals as // needed), and returns the inlined code. -// Since we only inline once, and do not need the function afterwards, we -// can just reuse all the nodes and even avoid copying. -static Expression* doInlining(Module* module, Function* into, Action& action) { +static Expression* doInlining(Module* module, Function* into, InliningAction& action) { + auto* call = (*action.callSite)->cast<Call>(); Builder builder(*module); - auto* block = action.block; + auto* block = Builder(*module).makeBlock(); + block->type = call->type; block->name = Name(std::string("__inlined_func$") + action.contents->name.str); - block->type = action.contents->result; + *action.callSite = block; // set up a locals mapping struct Updater : public PostWalker<Updater> { std::map<Index, Index> localMapping; @@ -121,49 +150,59 @@ static Expression* doInlining(Module* module, Function* into, Action& action) { } // assign the operands into the params for (Index i = 0; i < action.contents->params.size(); i++) { - block->list.push_back(builder.makeSetLocal(updater.localMapping[i], action.call->operands[i])); + block->list.push_back(builder.makeSetLocal(updater.localMapping[i], call->operands[i])); } - // update the inlined contents - updater.walk(action.contents->body); - block->list.push_back(action.contents->body); - action.contents->body = builder.makeUnreachable(); // not strictly needed, since it's going away + // generate and update the inlined contents + auto* contents = ExpressionManipulator::copy(action.contents->body, *module); + updater.walk(contents); + block->list.push_back(contents); return block; } struct Inlining : public Pass { + // whether to optimize where we inline + bool optimize = false; + + NameToAtomicIndexMap uses; + void run(PassRunner* runner, Module* module) override { // keep going while we inline, to handle nesting. TODO: optimize + calculateUses(module); while (iteration(runner, module)) {} } - bool iteration(PassRunner* runner, Module* module) { - // Count uses - std::map<Name, Index> uses; + void calculateUses(Module* module) { // fill in uses, as we operate on it in parallel (each function to its own entry) for (auto& func : module->functions) { - uses[func->name] = 0; - } - { - PassRunner runner(module); - runner.setIsNested(true); - runner.add<FunctionUseCounter>(&uses); - runner.run(); + uses[func->name].store(0); } + PassRunner runner(module); + runner.setIsNested(true); + runner.add<FunctionUseCounter>(&uses); + runner.run(); + // anything exported or used in a table should not be inlined for (auto& ex : module->exports) { if (ex->kind == ExternalKind::Function) { - uses[ex->value] = 2; // too many, so we ignore it + uses[ex->value].store(TOO_MANY_USES_TO_INLINE); } } for (auto& segment : module->table.segments) { for (auto name : segment.data) { - uses[name]++; + if (module->getFunctionOrNull(name)) { + uses[name].store(TOO_MANY_USES_TO_INLINE); + } } } + } + + bool iteration(PassRunner* runner, Module* module) { // decide which to inline InliningState state; - for (auto iter : uses) { - if (iter.second == 1) { - state.canInline.insert(iter.first); + for (auto& func : module->functions) { + auto name = func->name; + auto numUses = uses[name].load(); + if (canInline(numUses) && worthInlining(module->getFunction(name))) { + state.canInline.insert(name); } } // fill in actionsForFunction, as we operate on it in parallel (each function to its own entry) @@ -182,15 +221,21 @@ struct Inlining : public Pass { std::set<Function*> inlinedInto; for (auto& func : module->functions) { for (auto& action : state.actionsForFunction[func->name]) { + Name inlinedName = action.contents->name; doInlining(module, func.get(), action); - inlined.insert(action.contents->name); + inlined.insert(inlinedName); inlinedInto.insert(func.get()); + uses[inlinedName]--; + assert(uses[inlinedName].load() == 0); } } // anything we inlined into may now have non-unique label names, fix it up for (auto func : inlinedInto) { wasm::UniqueNameMapper::uniquify(func->body); } + if (optimize && inlinedInto.size() > 0) { + doOptimize(inlinedInto, module, runner); + } // remove functions that we managed to inline, their one use is gone auto& funcs = module->functions; funcs.erase(std::remove_if(funcs.begin(), funcs.end(), [&inlined](const std::unique_ptr<Function>& curr) { @@ -199,11 +244,55 @@ struct Inlining : public Pass { // return whether we did any work return inlined.size() > 0; } + + bool canInline(int numUses) { + return numUses == SINGLE_USE; + } + + bool worthInlining(Function* func) { + return Measurer::measure(func->body) <= INLINING_SIZE_LIMIT; + } + + // Run useful optimizations after inlining, things like removing + // unnecessary new blocks, sharing variables, etc. + void doOptimize(std::set<Function*>& funcs, Module* module, PassRunner* parentRunner) { + // save the full list of functions on the side + std::vector<std::unique_ptr<Function>> all; + all.swap(module->functions); + module->updateMaps(); + for (auto& func : funcs) { + module->addFunction(func); + } + PassRunner runner(module, parentRunner->options); + runner.setIsNested(true); + runner.setValidateGlobally(false); // not a full valid module + runner.add("remove-unused-brs"); + runner.add("remove-unused-names"); + runner.add("coalesce-locals"); + runner.add("simplify-locals"); + runner.add("vacuum"); + runner.add("reorder-locals"); + runner.add("remove-unused-brs"); + runner.add("merge-blocks"); + runner.run(); + // restore all the funcs + for (auto& func : module->functions) { + func.release(); + } + all.swap(module->functions); + module->updateMaps(); + } }; Pass *createInliningPass() { return new Inlining(); } +Pass *createInliningOptimizingPass() { + auto* ret = new Inlining(); + ret->optimize = true; + return ret; +} + } // namespace wasm diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index fc0a583fb..37eb50a0b 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -73,6 +73,7 @@ void PassRegistry::registerPasses() { registerPass("extract-function", "leaves just one function (useful for debugging)", createExtractFunctionPass); registerPass("flatten-control-flow", "flattens out control flow to be only on blocks, not nested as expressions", createFlattenControlFlowPass); registerPass("inlining", "inlines functions (currently only ones with a single use)", createInliningPass); + registerPass("inlining-optimizing", "inlines functions (currently only ones with a single use) and optimizes where we inlined", createInliningOptimizingPass); registerPass("legalize-js-interface", "legalizes i64 types on the import/export boundary", createLegalizeJSInterfacePass); registerPass("local-cse", "common subexpression elimination inside basic blocks", createLocalCSEPass); registerPass("log-execution", "instrument the build with logging of where execution goes", createLogExecutionPass); @@ -110,11 +111,9 @@ void PassRegistry::registerPasses() { } void PassRunner::addDefaultOptimizationPasses() { - add("duplicate-function-elimination"); + addDefaultGlobalOptimizationPrePasses(); addDefaultFunctionOptimizationPasses(); - add("duplicate-function-elimination"); // optimizations show more functions as duplicate - add("remove-unused-module-elements"); - add("memory-packing"); + addDefaultGlobalOptimizationPostPasses(); } void PassRunner::addDefaultFunctionOptimizationPasses() { @@ -154,9 +153,16 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { add("vacuum"); // just to be safe } -void PassRunner::addDefaultGlobalOptimizationPasses() { +void PassRunner::addDefaultGlobalOptimizationPrePasses() { add("duplicate-function-elimination"); +} + +void PassRunner::addDefaultGlobalOptimizationPostPasses() { + add("duplicate-function-elimination"); // optimizations show more functions as duplicate add("remove-unused-module-elements"); + if (options.optimizeLevel >= 2 || options.shrinkLevel >= 2) { + add("inlining-optimizing"); + } add("memory-packing"); } diff --git a/src/passes/passes.h b/src/passes/passes.h index 7a40b7da4..5e7eba540 100644 --- a/src/passes/passes.h +++ b/src/passes/passes.h @@ -32,6 +32,7 @@ Pass *createExtractFunctionPass(); Pass *createFlattenControlFlowPass(); Pass *createFullPrinterPass(); Pass *createInliningPass(); +Pass *createInliningOptimizingPass(); Pass *createLegalizeJSInterfacePass(); Pass *createLocalCSEPass(); Pass *createLogExecutionPass(); diff --git a/src/tools/wasm-merge.cpp b/src/tools/wasm-merge.cpp index fa2b195c9..441cdc0f7 100644 --- a/src/tools/wasm-merge.cpp +++ b/src/tools/wasm-merge.cpp @@ -622,7 +622,7 @@ int main(int argc, const char* argv[]) { PassRunner passRunner(&output); passRunner.add("precompute"); passRunner.add("optimize-instructions"); // things now-constant may be further optimized - passRunner.addDefaultGlobalOptimizationPasses(); + passRunner.addDefaultGlobalOptimizationPostPasses(); passRunner.run(); } diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h index b501a1ab6..c52cea9f9 100644 --- a/src/wasm-module-building.h +++ b/src/wasm-module-building.h @@ -165,7 +165,7 @@ public: } addPrePasses(passRunner); passRunner.addDefaultFunctionOptimizationPasses(); - passRunner.addDefaultGlobalOptimizationPasses(); + passRunner.addDefaultGlobalOptimizationPostPasses(); passRunner.run(); return; } @@ -226,7 +226,7 @@ private: void optimizeGlobally() { PassRunner passRunner(wasm, passOptions); - passRunner.addDefaultGlobalOptimizationPasses(); + passRunner.addDefaultGlobalOptimizationPostPasses(); passRunner.run(); } diff --git a/test/debugInfo.fromasm b/test/debugInfo.fromasm index f11000841..16033f98a 100644 --- a/test/debugInfo.fromasm +++ b/test/debugInfo.fromasm @@ -31,17 +31,8 @@ (i32.const 1) ) ) - (func $i32s-rem (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.rem_s - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $opts (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) ;;@ even-opted.cpp:1:0 (set_local $0 (i32.add @@ -56,11 +47,17 @@ (get_local $0) ) ) - ;;@ even-opted.cpp:3:0 (i32.add - (call $i32s-rem - (get_local $0) - (get_local $1) + (if (result i32) + ;;@ even-opted.cpp:3:0 + (tee_local $2 + (get_local $1) + ) + (i32.rem_s + (get_local $0) + (get_local $2) + ) + (i32.const 0) ) (get_local $1) ) diff --git a/test/debugInfo.fromasm.clamp b/test/debugInfo.fromasm.clamp index f11000841..16033f98a 100644 --- a/test/debugInfo.fromasm.clamp +++ b/test/debugInfo.fromasm.clamp @@ -31,17 +31,8 @@ (i32.const 1) ) ) - (func $i32s-rem (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.rem_s - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $opts (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) ;;@ even-opted.cpp:1:0 (set_local $0 (i32.add @@ -56,11 +47,17 @@ (get_local $0) ) ) - ;;@ even-opted.cpp:3:0 (i32.add - (call $i32s-rem - (get_local $0) - (get_local $1) + (if (result i32) + ;;@ even-opted.cpp:3:0 + (tee_local $2 + (get_local $1) + ) + (i32.rem_s + (get_local $0) + (get_local $2) + ) + (i32.const 0) ) (get_local $1) ) diff --git a/test/debugInfo.fromasm.clamp.map b/test/debugInfo.fromasm.clamp.map index 5680294cd..5fb3151c9 100644 --- a/test/debugInfo.fromasm.clamp.map +++ b/test/debugInfo.fromasm.clamp.map @@ -1 +1 @@ -{"version":3,"sources":["tests/hello_world.c","tests/other_file.cpp","return.cpp","even-opted.cpp","fib.c","/tmp/emscripten_test_binaryen2_28hnAe/src.c"],"names":[],"mappings":"yLC8ylTA,cC7vlTA,OAkDA,mCCnGA,OACA,OACA,qBCAA,wBAKA,MAJA,OADA,0BAKA,iGCsi1DA"}
\ No newline at end of file +{"version":3,"sources":["tests/hello_world.c","tests/other_file.cpp","return.cpp","even-opted.cpp","fib.c","/tmp/emscripten_test_binaryen2_28hnAe/src.c"],"names":[],"mappings":"wLC8ylTA,cC7vlTA,OAkDA,iBCnGA,OACA,OACA,8BCAA,wBAKA,MAJA,OADA,0BAKA,iGCsi1DA"}
\ No newline at end of file diff --git a/test/debugInfo.fromasm.map b/test/debugInfo.fromasm.map index 5680294cd..5fb3151c9 100644 --- a/test/debugInfo.fromasm.map +++ b/test/debugInfo.fromasm.map @@ -1 +1 @@ -{"version":3,"sources":["tests/hello_world.c","tests/other_file.cpp","return.cpp","even-opted.cpp","fib.c","/tmp/emscripten_test_binaryen2_28hnAe/src.c"],"names":[],"mappings":"yLC8ylTA,cC7vlTA,OAkDA,mCCnGA,OACA,OACA,qBCAA,wBAKA,MAJA,OADA,0BAKA,iGCsi1DA"}
\ No newline at end of file +{"version":3,"sources":["tests/hello_world.c","tests/other_file.cpp","return.cpp","even-opted.cpp","fib.c","/tmp/emscripten_test_binaryen2_28hnAe/src.c"],"names":[],"mappings":"wLC8ylTA,cC7vlTA,OAkDA,iBCnGA,OACA,OACA,8BCAA,wBAKA,MAJA,OADA,0BAKA,iGCsi1DA"}
\ No newline at end of file diff --git a/test/dynamicLibrary.fromasm b/test/dynamicLibrary.fromasm index cd0d1d224..4456edfa2 100644 --- a/test/dynamicLibrary.fromasm +++ b/test/dynamicLibrary.fromasm @@ -15,14 +15,6 @@ (export "__post_instantiate" (func $__post_instantiate)) (export "runPostSets" (func $runPostSets)) (export "_global" (global $_global)) - (func $___cxx_global_var_init - (call $__ZN3FooC2Ev - (i32.add - (get_global $memoryBase) - (i32.const 5242912) - ) - ) - ) (func $__ZN3FooC2Ev (param $0 i32) (local $1 i32) (set_local $1 @@ -52,9 +44,6 @@ (get_local $1) ) ) - (func $__GLOBAL__sub_I_liblib_cpp - (call $___cxx_global_var_init) - ) (func $runPostSets (nop) ) @@ -72,6 +61,11 @@ ) ) (call $runPostSets) - (call $__GLOBAL__sub_I_liblib_cpp) + (call $__ZN3FooC2Ev + (i32.add + (get_global $memoryBase) + (i32.const 5242912) + ) + ) ) ) diff --git a/test/dynamicLibrary.fromasm.clamp b/test/dynamicLibrary.fromasm.clamp index cd0d1d224..4456edfa2 100644 --- a/test/dynamicLibrary.fromasm.clamp +++ b/test/dynamicLibrary.fromasm.clamp @@ -15,14 +15,6 @@ (export "__post_instantiate" (func $__post_instantiate)) (export "runPostSets" (func $runPostSets)) (export "_global" (global $_global)) - (func $___cxx_global_var_init - (call $__ZN3FooC2Ev - (i32.add - (get_global $memoryBase) - (i32.const 5242912) - ) - ) - ) (func $__ZN3FooC2Ev (param $0 i32) (local $1 i32) (set_local $1 @@ -52,9 +44,6 @@ (get_local $1) ) ) - (func $__GLOBAL__sub_I_liblib_cpp - (call $___cxx_global_var_init) - ) (func $runPostSets (nop) ) @@ -72,6 +61,11 @@ ) ) (call $runPostSets) - (call $__GLOBAL__sub_I_liblib_cpp) + (call $__ZN3FooC2Ev + (i32.add + (get_global $memoryBase) + (i32.const 5242912) + ) + ) ) ) diff --git a/test/dynamicLibrary.fromasm.imprecise b/test/dynamicLibrary.fromasm.imprecise index d30a1c912..f575c9781 100644 --- a/test/dynamicLibrary.fromasm.imprecise +++ b/test/dynamicLibrary.fromasm.imprecise @@ -14,14 +14,6 @@ (export "__post_instantiate" (func $__post_instantiate)) (export "runPostSets" (func $runPostSets)) (export "_global" (global $_global)) - (func $___cxx_global_var_init - (call $__ZN3FooC2Ev - (i32.add - (get_global $memoryBase) - (i32.const 5242912) - ) - ) - ) (func $__ZN3FooC2Ev (param $0 i32) (local $1 i32) (set_local $1 @@ -51,9 +43,6 @@ (get_local $1) ) ) - (func $__GLOBAL__sub_I_liblib_cpp - (call $___cxx_global_var_init) - ) (func $runPostSets (nop) ) @@ -71,6 +60,11 @@ ) ) (call $runPostSets) - (call $__GLOBAL__sub_I_liblib_cpp) + (call $__ZN3FooC2Ev + (i32.add + (get_global $memoryBase) + (i32.const 5242912) + ) + ) ) ) diff --git a/test/emcc_O2_hello_world.fromasm b/test/emcc_O2_hello_world.fromasm index b0128b509..71b52c753 100644 --- a/test/emcc_O2_hello_world.fromasm +++ b/test/emcc_O2_hello_world.fromasm @@ -9185,9 +9185,16 @@ (block $do-once (result i32) (if (result i32) (i32.lt_s - (call $_fputs - (get_local $0) - (get_local $1) + (i32.add + (call $_fwrite + (get_local $0) + (call $_strlen + (get_local $0) + ) + (i32.const 1) + (get_local $1) + ) + (i32.const -1) ) (i32.const 0) ) @@ -9407,16 +9414,6 @@ ) ) ) - (func $i32u-div (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.div_u - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $_fwrite (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) @@ -9471,9 +9468,13 @@ (get_local $4) ) (set_local $2 - (call $i32u-div - (get_local $0) + (if (result i32) (get_local $1) + (i32.div_u + (get_local $0) + (get_local $1) + ) + (i32.const 0) ) ) ) @@ -9662,19 +9663,6 @@ ) ) ) - (func $_fputs (param $0 i32) (param $1 i32) (result i32) - (i32.add - (call $_fwrite - (get_local $0) - (call $_strlen - (get_local $0) - ) - (i32.const 1) - (get_local $1) - ) - (i32.const -1) - ) - ) (func $dynCall_ii (param $0 i32) (param $1 i32) (result i32) (call_indirect $FUNCSIG$ii (get_local $1) diff --git a/test/emcc_O2_hello_world.fromasm.clamp b/test/emcc_O2_hello_world.fromasm.clamp index b0128b509..71b52c753 100644 --- a/test/emcc_O2_hello_world.fromasm.clamp +++ b/test/emcc_O2_hello_world.fromasm.clamp @@ -9185,9 +9185,16 @@ (block $do-once (result i32) (if (result i32) (i32.lt_s - (call $_fputs - (get_local $0) - (get_local $1) + (i32.add + (call $_fwrite + (get_local $0) + (call $_strlen + (get_local $0) + ) + (i32.const 1) + (get_local $1) + ) + (i32.const -1) ) (i32.const 0) ) @@ -9407,16 +9414,6 @@ ) ) ) - (func $i32u-div (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.div_u - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $_fwrite (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) @@ -9471,9 +9468,13 @@ (get_local $4) ) (set_local $2 - (call $i32u-div - (get_local $0) + (if (result i32) (get_local $1) + (i32.div_u + (get_local $0) + (get_local $1) + ) + (i32.const 0) ) ) ) @@ -9662,19 +9663,6 @@ ) ) ) - (func $_fputs (param $0 i32) (param $1 i32) (result i32) - (i32.add - (call $_fwrite - (get_local $0) - (call $_strlen - (get_local $0) - ) - (i32.const 1) - (get_local $1) - ) - (i32.const -1) - ) - ) (func $dynCall_ii (param $0 i32) (param $1 i32) (result i32) (call_indirect $FUNCSIG$ii (get_local $1) diff --git a/test/emcc_O2_hello_world.fromasm.imprecise b/test/emcc_O2_hello_world.fromasm.imprecise index 824fcd3da..dd8457376 100644 --- a/test/emcc_O2_hello_world.fromasm.imprecise +++ b/test/emcc_O2_hello_world.fromasm.imprecise @@ -9184,9 +9184,16 @@ (block $do-once (result i32) (if (result i32) (i32.lt_s - (call $_fputs - (get_local $0) - (get_local $1) + (i32.add + (call $_fwrite + (get_local $0) + (call $_strlen + (get_local $0) + ) + (i32.const 1) + (get_local $1) + ) + (i32.const -1) ) (i32.const 0) ) @@ -9651,19 +9658,6 @@ ) ) ) - (func $_fputs (param $0 i32) (param $1 i32) (result i32) - (i32.add - (call $_fwrite - (get_local $0) - (call $_strlen - (get_local $0) - ) - (i32.const 1) - (get_local $1) - ) - (i32.const -1) - ) - ) (func $dynCall_ii (param $0 i32) (param $1 i32) (result i32) (call_indirect $FUNCSIG$ii (get_local $1) diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm index 10d0f69e9..e96288365 100644 --- a/test/emcc_hello_world.fromasm +++ b/test/emcc_hello_world.fromasm @@ -258,12 +258,6 @@ ) (get_local $0) ) - (func $_frexpl (param $0 f64) (param $1 i32) (result f64) - (call $_frexp - (get_local $0) - (get_local $1) - ) - ) (func $_strerror (param $0 i32) (result i32) (local $1 i32) (local $2 i32) @@ -2219,16 +2213,6 @@ (i32.const 0) ) ) - (func $i32s-rem (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.rem_s - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $i32u-rem (param $0 i32) (param $1 i32) (result i32) (if (result i32) (get_local $1) @@ -2268,8 +2252,8 @@ (local $20 i32) (local $21 i32) (local $22 i32) - (local $23 i32) - (local $24 f64) + (local $23 f64) + (local $24 i32) (local $25 i32) (local $26 i32) (local $27 i32) @@ -2297,7 +2281,7 @@ (local $49 i32) (local $50 i32) (local $51 i32) - (set_local $26 + (set_local $25 (get_global $STACKTOP) ) (set_global $STACKTOP @@ -2313,18 +2297,18 @@ ) (call $abort) ) - (set_local $21 + (set_local $20 (i32.add - (get_local $26) + (get_local $25) (i32.const 16) ) ) (set_local $19 - (get_local $26) + (get_local $25) ) (set_local $36 (i32.add - (get_local $26) + (get_local $25) (i32.const 528) ) ) @@ -2335,11 +2319,11 @@ ) ) (set_local $39 - (tee_local $22 + (tee_local $26 (i32.add (tee_local $5 (i32.add - (get_local $26) + (get_local $25) (i32.const 536) ) ) @@ -2357,7 +2341,7 @@ (i32.add (tee_local $41 (i32.add - (get_local $26) + (get_local $25) (i32.const 8) ) ) @@ -2368,7 +2352,7 @@ (i32.add (tee_local $5 (i32.add - (get_local $26) + (get_local $25) (i32.const 576) ) ) @@ -2387,9 +2371,9 @@ (get_local $34) ) (tee_local $37 - (tee_local $23 + (tee_local $22 (i32.add - (get_local $26) + (get_local $25) (i32.const 588) ) ) @@ -2412,7 +2396,7 @@ (i32.add (tee_local $48 (i32.add - (get_local $26) + (get_local $25) (i32.const 24) ) ) @@ -2422,14 +2406,14 @@ (set_local $43 (tee_local $30 (i32.add - (get_local $23) + (get_local $22) (i32.const 9) ) ) ) (set_local $35 (i32.add - (get_local $23) + (get_local $22) (i32.const 8) ) ) @@ -2909,26 +2893,24 @@ (get_local $6) ) ) - (if - (i32.lt_s - (get_local $14) - (i32.const 0) - ) - (block - (set_local $11 + (set_local $11 + (if (result i32) + (i32.lt_s + (get_local $14) + (i32.const 0) + ) + (block (result i32) + (set_local $14 + (i32.sub + (i32.const 0) + (get_local $14) + ) + ) (i32.or (get_local $1) (i32.const 8192) ) ) - (set_local $14 - (i32.sub - (i32.const 0) - (get_local $14) - ) - ) - ) - (set_local $11 (get_local $1) ) ) @@ -3032,8 +3014,8 @@ ) ) ) - (block $label$break$L46 - (set_local $6 + (set_local $6 + (block $label$break$L46 (result i32) (if (result i32) (i32.eq (i32.load8_s @@ -3082,38 +3064,39 @@ (set_local $10 (get_local $6) ) - (set_local $6 + (br $label$break$L46 (i32.const 0) ) - (br $label$break$L46) ) ) (loop $while-in11 - (set_local $6 - (i32.add - (i32.mul - (get_local $8) - (i32.const 10) - ) - (get_local $6) - ) - ) - (br_if $label$break$L46 - (i32.ge_u - (tee_local $9 + (drop + (br_if $label$break$L46 + (tee_local $6 (i32.add - (i32.load8_s - (tee_local $10 - (i32.add - (get_local $10) - (i32.const 1) + (i32.mul + (get_local $8) + (i32.const 10) + ) + (get_local $6) + ) + ) + (i32.ge_u + (tee_local $9 + (i32.add + (i32.load8_s + (tee_local $10 + (i32.add + (get_local $10) + (i32.const 1) + ) ) ) + (i32.const -48) ) - (i32.const -48) ) + (i32.const 10) ) - (i32.const 10) ) ) (set_local $8 @@ -3185,12 +3168,11 @@ (i32.const 4) ) ) - (set_local $6 + (br $label$break$L46 (i32.load (get_local $6) ) ) - (br $label$break$L46) ) ) ) @@ -3696,7 +3678,7 @@ ) ) (set_local $8 - (get_local $22) + (get_local $26) ) (block (set_local $5 @@ -3706,7 +3688,7 @@ (get_local $8) ) (set_local $8 - (get_local $22) + (get_local $26) ) (loop $while-in32 (i32.store8 @@ -3747,43 +3729,41 @@ ) ) ) - (if - (i32.and - (get_local $11) - (i32.const 8) - ) - (block - (set_local $5 - (get_local $8) - ) - (set_local $7 + (set_local $5 + (if (result i32) + (i32.and (get_local $11) + (i32.const 8) ) - (set_local $6 - (select - (tee_local $11 - (i32.add - (i32.sub - (get_local $39) - (get_local $8) + (block (result i32) + (set_local $7 + (get_local $11) + ) + (set_local $6 + (select + (tee_local $11 + (i32.add + (i32.sub + (get_local $39) + (get_local $8) + ) + (i32.const 1) ) - (i32.const 1) ) - ) - (get_local $6) - (i32.lt_s (get_local $6) - (get_local $11) + (i32.lt_s + (get_local $6) + (get_local $11) + ) ) ) - ) - ) - (block - (set_local $5 (get_local $8) ) - (set_local $7 - (get_local $11) + (block (result i32) + (set_local $7 + (get_local $11) + ) + (get_local $8) ) ) ) @@ -3840,29 +3820,27 @@ (br $__rjti$4) ) ) - (if - (i32.and - (get_local $11) - (i32.const 2048) - ) - (block - (set_local $8 - (i32.const 1) + (set_local $9 + (if (result i32) + (i32.and + (get_local $11) + (i32.const 2048) ) - (set_local $9 + (block (result i32) + (set_local $8 + (i32.const 1) + ) (i32.const 4092) ) - ) - (block - (set_local $8 - (tee_local $9 - (i32.and - (get_local $11) - (i32.const 1) + (block (result i32) + (set_local $8 + (tee_local $9 + (i32.and + (get_local $11) + (i32.const 1) + ) ) ) - ) - (set_local $9 (select (i32.const 4093) (i32.const 4091) @@ -3922,7 +3900,7 @@ (i32.const 4091) ) (br $__rjto$8 - (get_local $22) + (get_local $26) ) ) (set_local $5 @@ -4002,7 +3980,7 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (i32.const 0) ) (f64.store @@ -4098,11 +4076,13 @@ (if (tee_local $5 (f64.ne - (tee_local $24 + (tee_local $23 (f64.mul - (call $_frexpl + (call $_frexp (get_local $15) - (get_local $21) + (tee_local $5 + (get_local $20) + ) ) (f64.const 2) ) @@ -4111,10 +4091,10 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (i32.add (i32.load - (get_local $21) + (get_local $20) ) (i32.const -1) ) @@ -4122,7 +4102,7 @@ ) (if (i32.eq - (tee_local $25 + (tee_local $24 (i32.or (get_local $18) (i32.const 32) @@ -4162,7 +4142,7 @@ ) ) ) - (get_local $24) + (get_local $23) (block (result f64) (set_local $15 (f64.const 8) @@ -4195,7 +4175,7 @@ (get_local $15) (f64.sub (f64.neg - (get_local $24) + (get_local $23) ) (get_local $15) ) @@ -4203,7 +4183,7 @@ ) (f64.sub (f64.add - (get_local $24) + (get_local $23) (get_local $15) ) (get_local $15) @@ -4222,7 +4202,7 @@ (i32.const 0) (tee_local $7 (i32.load - (get_local $21) + (get_local $20) ) ) ) @@ -4307,7 +4287,7 @@ ) ) (set_local $5 - (get_local $23) + (get_local $22) ) (loop $while-in56 (i32.store8 @@ -4474,7 +4454,7 @@ ) (drop (call $___fwritex - (get_local $23) + (get_local $22) (get_local $5) (get_local $0) ) @@ -4542,28 +4522,28 @@ (get_local $5) (block (result f64) (i32.store - (get_local $21) + (get_local $20) (tee_local $5 (i32.add (i32.load - (get_local $21) + (get_local $20) ) (i32.const -28) ) ) ) (f64.mul - (get_local $24) + (get_local $23) (f64.const 268435456) ) ) (block (result f64) (set_local $5 (i32.load - (get_local $21) + (get_local $20) ) ) - (get_local $24) + (get_local $23) ) ) ) @@ -4615,7 +4595,7 @@ (i32.gt_s (tee_local $9 (i32.load - (get_local $21) + (get_local $20) ) ) (i32.const 0) @@ -4653,28 +4633,26 @@ (loop $while-in66 (i32.store (get_local $9) - (tee_local $20 - (call $___uremdi3 - (tee_local $12 - (call $_i64Add - (call $_bitshift64Shl - (i32.load - (get_local $9) - ) - (i32.const 0) - (get_local $13) + (call $___uremdi3 + (tee_local $12 + (call $_i64Add + (call $_bitshift64Shl + (i32.load + (get_local $9) ) - (get_global $tempRet0) - (get_local $12) (i32.const 0) + (get_local $13) ) - ) - (tee_local $17 (get_global $tempRet0) + (get_local $12) + (i32.const 0) ) - (i32.const 1000000000) - (i32.const 0) ) + (tee_local $17 + (get_global $tempRet0) + ) + (i32.const 1000000000) + (i32.const 0) ) ) (set_local $12 @@ -4741,11 +4719,11 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (tee_local $9 (i32.sub (i32.load - (get_local $21) + (get_local $20) ) (get_local $13) ) @@ -4779,7 +4757,7 @@ (i32.const 0) ) (block - (set_local $20 + (set_local $21 (i32.add (call $i32s-div (i32.add @@ -4793,7 +4771,7 @@ ) (set_local $32 (i32.eq - (get_local $25) + (get_local $24) (i32.const 102) ) ) @@ -4936,7 +4914,7 @@ ) ) (i32.shl - (get_local $20) + (get_local $21) (i32.const 2) ) ) @@ -4949,16 +4927,16 @@ ) (i32.const 2) ) - (get_local $20) + (get_local $21) ) ) ) (i32.store - (get_local $21) + (get_local $20) (tee_local $9 (i32.add (i32.load - (get_local $21) + (get_local $20) ) (get_local $13) ) @@ -4993,7 +4971,7 @@ (get_local $7) ) ) - (set_local $20 + (set_local $21 (get_local $8) ) (block $do-once75 @@ -5007,7 +4985,7 @@ (i32.mul (i32.shr_s (i32.sub - (get_local $20) + (get_local $21) (get_local $5) ) (i32.const 2) @@ -5064,7 +5042,7 @@ (get_local $7) (i32.const 0) (i32.ne - (get_local $25) + (get_local $24) (i32.const 102) ) ) @@ -5080,7 +5058,7 @@ ) (tee_local $38 (i32.eq - (get_local $25) + (get_local $24) (i32.const 103) ) ) @@ -5096,7 +5074,7 @@ (i32.shr_s (i32.sub (get_local $9) - (get_local $20) + (get_local $21) ) (i32.const 2) ) @@ -5121,9 +5099,15 @@ (i32.lt_s (tee_local $6 (i32.add - (call $i32s-rem - (get_local $6) - (i32.const 9) + (if (result i32) + (tee_local $12 + (i32.const 9) + ) + (i32.rem_s + (get_local $6) + (get_local $12) + ) + (i32.const 0) ) (i32.const 1) ) @@ -5160,7 +5144,7 @@ ) (set_local $13 (call $i32u-rem - (tee_local $25 + (tee_local $24 (i32.load (tee_local $6 (i32.add @@ -5200,7 +5184,7 @@ (block (set_local $50 (call $i32u-div - (get_local $25) + (get_local $24) (get_local $12) ) ) @@ -5229,7 +5213,7 @@ ) ) ) - (set_local $24 + (set_local $23 (select (f64.const 9007199254740994) (f64.const 9007199254740992) @@ -5251,9 +5235,9 @@ (i32.const 45) ) ) - (set_local $24 + (set_local $23 (f64.neg - (get_local $24) + (get_local $23) ) ) (set_local $15 @@ -5268,7 +5252,7 @@ (get_local $6) (tee_local $13 (i32.sub - (get_local $25) + (get_local $24) (get_local $13) ) ) @@ -5276,10 +5260,10 @@ (br_if $do-once81 (f64.eq (f64.add - (get_local $24) + (get_local $23) (get_local $15) ) - (get_local $24) + (get_local $23) ) ) (i32.store @@ -5344,7 +5328,7 @@ (i32.mul (i32.shr_s (i32.sub - (get_local $20) + (get_local $21) (get_local $5) ) (i32.const 2) @@ -5432,7 +5416,7 @@ (get_local $12) ) (block - (set_local $25 + (set_local $24 (i32.const 0) ) (set_local $9 @@ -5451,7 +5435,7 @@ ) ) (block - (set_local $25 + (set_local $24 (i32.const 1) ) (set_local $9 @@ -5541,7 +5525,7 @@ ) ) (block - (set_local $20 + (set_local $21 (get_local $5) ) (br $do-once91 @@ -5551,7 +5535,7 @@ ) (block $do-once93 (if - (get_local $25) + (get_local $24) (block (if (i32.eqz @@ -5624,7 +5608,7 @@ (i32.shr_s (i32.sub (get_local $9) - (get_local $20) + (get_local $21) ) (i32.const 2) ) @@ -5642,7 +5626,7 @@ (i32.const 102) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.const 0) ) (select @@ -5669,7 +5653,7 @@ ) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.const 0) ) (select @@ -5701,7 +5685,7 @@ ) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.and (get_local $11) (i32.const 8) @@ -5720,122 +5704,120 @@ (tee_local $32 (i32.or (get_local $5) - (get_local $20) + (get_local $21) ) ) (i32.const 0) ) ) - (tee_local $7 - (if (result i32) - (tee_local $17 - (i32.eq - (i32.or - (get_local $7) - (i32.const 32) - ) - (i32.const 102) + (if (result i32) + (tee_local $17 + (i32.eq + (i32.or + (get_local $7) + (i32.const 32) ) + (i32.const 102) ) - (block (result i32) - (set_local $18 - (i32.const 0) - ) - (select + ) + (block (result i32) + (set_local $18 + (i32.const 0) + ) + (select + (get_local $13) + (i32.const 0) + (i32.gt_s (get_local $13) (i32.const 0) - (i32.gt_s - (get_local $13) - (i32.const 0) - ) ) ) - (block (result i32) - (if - (i32.lt_s - (i32.sub - (get_local $28) - (tee_local $6 - (call $_fmt_u - (tee_local $6 - (select - (get_local $33) + ) + (block (result i32) + (if + (i32.lt_s + (i32.sub + (get_local $28) + (tee_local $6 + (call $_fmt_u + (tee_local $6 + (select + (get_local $33) + (get_local $13) + (i32.lt_s (get_local $13) - (i32.lt_s - (get_local $13) - (i32.const 0) - ) + (i32.const 0) ) ) - (i32.shr_s - (i32.shl - (i32.lt_s - (get_local $6) - (i32.const 0) - ) - (i32.const 31) + ) + (i32.shr_s + (i32.shl + (i32.lt_s + (get_local $6) + (i32.const 0) ) (i32.const 31) ) - (get_local $34) + (i32.const 31) ) + (get_local $34) ) ) - (i32.const 2) ) - (loop $while-in98 - (i32.store8 - (tee_local $6 - (i32.add - (get_local $6) - (i32.const -1) - ) - ) - (i32.const 48) - ) - (br_if $while-in98 - (i32.lt_s - (i32.sub - (get_local $28) - (get_local $6) - ) - (i32.const 2) + (i32.const 2) + ) + (loop $while-in98 + (i32.store8 + (tee_local $6 + (i32.add + (get_local $6) + (i32.const -1) ) ) + (i32.const 48) ) - ) - (i32.store8 - (i32.add - (get_local $6) - (i32.const -1) - ) - (i32.add - (i32.and - (i32.shr_s - (get_local $13) - (i32.const 31) + (br_if $while-in98 + (i32.lt_s + (i32.sub + (get_local $28) + (get_local $6) ) (i32.const 2) ) - (i32.const 43) ) ) - (i32.store8 - (tee_local $6 - (i32.add - (get_local $6) - (i32.const -2) + ) + (i32.store8 + (i32.add + (get_local $6) + (i32.const -1) + ) + (i32.add + (i32.and + (i32.shr_s + (get_local $13) + (i32.const 31) ) + (i32.const 2) ) - (get_local $7) + (i32.const 43) ) - (set_local $18 - (get_local $6) - ) - (i32.sub - (get_local $28) - (get_local $6) + ) + (i32.store8 + (tee_local $6 + (i32.add + (get_local $6) + (i32.const -2) + ) ) + (get_local $7) + ) + (set_local $18 + (get_local $6) + ) + (i32.sub + (get_local $28) + (get_local $6) ) ) ) @@ -5921,7 +5903,7 @@ (br_if $do-once103 (i32.le_u (get_local $7) - (get_local $23) + (get_local $22) ) ) (loop $while-in106 @@ -5937,7 +5919,7 @@ (br_if $while-in106 (i32.gt_u (get_local $7) - (get_local $23) + (get_local $22) ) ) ) @@ -6027,7 +6009,7 @@ (get_local $30) ) ) - (get_local $23) + (get_local $22) ) (loop $while-in112 (i32.store8 @@ -6042,7 +6024,7 @@ (br_if $while-in112 (i32.gt_u (get_local $6) - (get_local $23) + (get_local $22) ) ) ) @@ -6124,7 +6106,7 @@ (get_local $12) (i32.const 4) ) - (get_local $25) + (get_local $24) ) ) (if @@ -6135,7 +6117,7 @@ (block (set_local $17 (i32.eqz - (get_local $20) + (get_local $21) ) ) (set_local $6 @@ -6227,7 +6209,7 @@ (br_if $do-once115 (i32.le_u (get_local $5) - (get_local $23) + (get_local $22) ) ) (loop $while-in118 @@ -6243,7 +6225,7 @@ (br_if $while-in118 (i32.gt_u (get_local $5) - (get_local $23) + (get_local $22) ) ) ) @@ -6492,7 +6474,7 @@ (i32.const 4091) ) (br $__rjto$8 - (get_local $22) + (get_local $26) ) ) (set_local $9 @@ -6522,7 +6504,7 @@ ) (block (set_local $5 - (get_local $22) + (get_local $26) ) (set_local $8 (i32.const 0) @@ -6537,7 +6519,7 @@ (get_local $8) ) (set_local $8 - (get_local $22) + (get_local $26) ) (loop $while-in123 (i32.store8 @@ -6584,49 +6566,47 @@ (get_local $8) ) ) - (if - (i32.or - (i32.eqz - (i32.and - (get_local $7) - (i32.const 8) - ) - ) - (i32.and + (set_local $8 + (if (result i32) + (i32.or (i32.eqz - (i32.load - (tee_local $11 - (get_local $19) - ) + (i32.and + (get_local $7) + (i32.const 8) ) ) - (i32.eqz - (i32.load offset=4 - (get_local $11) + (i32.and + (i32.eqz + (i32.load + (tee_local $11 + (get_local $19) + ) + ) + ) + (i32.eqz + (i32.load offset=4 + (get_local $11) + ) ) ) ) - ) - (block - (set_local $8 + (block (result i32) + (set_local $9 + (i32.const 4091) + ) (i32.const 0) ) - (set_local $9 - (i32.const 4091) - ) - ) - (block - (set_local $8 - (i32.const 2) - ) - (set_local $9 - (i32.add - (i32.shr_s - (get_local $18) - (i32.const 4) + (block (result i32) + (set_local $9 + (i32.add + (i32.shr_s + (get_local $18) + (i32.const 4) + ) + (i32.const 4091) ) - (i32.const 4091) ) + (i32.const 2) ) ) ) @@ -6638,7 +6618,7 @@ (call $_fmt_u (get_local $5) (get_local $7) - (get_local $22) + (get_local $26) ) ) (set_local $7 @@ -6896,33 +6876,33 @@ ) ) ) - (if - (i32.or - (get_local $6) - (tee_local $12 - (i32.or - (i32.ne - (i32.load - (tee_local $7 - (get_local $19) + (set_local $12 + (if (result i32) + (i32.or + (get_local $6) + (tee_local $12 + (i32.or + (i32.ne + (i32.load + (tee_local $7 + (get_local $19) + ) ) + (i32.const 0) ) - (i32.const 0) - ) - (i32.ne - (i32.load offset=4 - (get_local $7) + (i32.ne + (i32.load offset=4 + (get_local $7) + ) + (i32.const 0) ) - (i32.const 0) ) ) ) - ) - (block - (set_local $7 - (get_local $5) - ) - (set_local $12 + (block (result i32) + (set_local $7 + (get_local $5) + ) (select (get_local $6) (tee_local $5 @@ -6946,17 +6926,15 @@ ) ) ) - ) - (block - (set_local $7 - (get_local $22) - ) - (set_local $12 + (block (result i32) + (set_local $7 + (get_local $26) + ) (i32.const 0) ) ) ) - (get_local $22) + (get_local $26) ) ) (call $_pad @@ -7169,7 +7147,7 @@ ) ) (set_global $STACKTOP - (get_local $26) + (get_local $25) ) (get_local $16) ) diff --git a/test/emcc_hello_world.fromasm.clamp b/test/emcc_hello_world.fromasm.clamp index af2b8a467..7ae8bb801 100644 --- a/test/emcc_hello_world.fromasm.clamp +++ b/test/emcc_hello_world.fromasm.clamp @@ -256,12 +256,6 @@ ) (get_local $0) ) - (func $_frexpl (param $0 f64) (param $1 i32) (result f64) - (call $_frexp - (get_local $0) - (get_local $1) - ) - ) (func $_strerror (param $0 i32) (result i32) (local $1 i32) (local $2 i32) @@ -2243,16 +2237,6 @@ (i32.const 0) ) ) - (func $i32s-rem (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.rem_s - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $i32u-rem (param $0 i32) (param $1 i32) (result i32) (if (result i32) (get_local $1) @@ -2292,8 +2276,8 @@ (local $20 i32) (local $21 i32) (local $22 i32) - (local $23 i32) - (local $24 f64) + (local $23 f64) + (local $24 i32) (local $25 i32) (local $26 i32) (local $27 i32) @@ -2321,7 +2305,7 @@ (local $49 i32) (local $50 i32) (local $51 i32) - (set_local $26 + (set_local $25 (get_global $STACKTOP) ) (set_global $STACKTOP @@ -2337,18 +2321,18 @@ ) (call $abort) ) - (set_local $21 + (set_local $20 (i32.add - (get_local $26) + (get_local $25) (i32.const 16) ) ) (set_local $19 - (get_local $26) + (get_local $25) ) (set_local $36 (i32.add - (get_local $26) + (get_local $25) (i32.const 528) ) ) @@ -2359,11 +2343,11 @@ ) ) (set_local $39 - (tee_local $22 + (tee_local $26 (i32.add (tee_local $5 (i32.add - (get_local $26) + (get_local $25) (i32.const 536) ) ) @@ -2381,7 +2365,7 @@ (i32.add (tee_local $41 (i32.add - (get_local $26) + (get_local $25) (i32.const 8) ) ) @@ -2392,7 +2376,7 @@ (i32.add (tee_local $5 (i32.add - (get_local $26) + (get_local $25) (i32.const 576) ) ) @@ -2411,9 +2395,9 @@ (get_local $34) ) (tee_local $37 - (tee_local $23 + (tee_local $22 (i32.add - (get_local $26) + (get_local $25) (i32.const 588) ) ) @@ -2436,7 +2420,7 @@ (i32.add (tee_local $48 (i32.add - (get_local $26) + (get_local $25) (i32.const 24) ) ) @@ -2446,14 +2430,14 @@ (set_local $43 (tee_local $30 (i32.add - (get_local $23) + (get_local $22) (i32.const 9) ) ) ) (set_local $35 (i32.add - (get_local $23) + (get_local $22) (i32.const 8) ) ) @@ -2933,26 +2917,24 @@ (get_local $6) ) ) - (if - (i32.lt_s - (get_local $14) - (i32.const 0) - ) - (block - (set_local $11 + (set_local $11 + (if (result i32) + (i32.lt_s + (get_local $14) + (i32.const 0) + ) + (block (result i32) + (set_local $14 + (i32.sub + (i32.const 0) + (get_local $14) + ) + ) (i32.or (get_local $1) (i32.const 8192) ) ) - (set_local $14 - (i32.sub - (i32.const 0) - (get_local $14) - ) - ) - ) - (set_local $11 (get_local $1) ) ) @@ -3056,8 +3038,8 @@ ) ) ) - (block $label$break$L46 - (set_local $6 + (set_local $6 + (block $label$break$L46 (result i32) (if (result i32) (i32.eq (i32.load8_s @@ -3106,38 +3088,39 @@ (set_local $10 (get_local $6) ) - (set_local $6 + (br $label$break$L46 (i32.const 0) ) - (br $label$break$L46) ) ) (loop $while-in11 - (set_local $6 - (i32.add - (i32.mul - (get_local $8) - (i32.const 10) - ) - (get_local $6) - ) - ) - (br_if $label$break$L46 - (i32.ge_u - (tee_local $9 + (drop + (br_if $label$break$L46 + (tee_local $6 (i32.add - (i32.load8_s - (tee_local $10 - (i32.add - (get_local $10) - (i32.const 1) + (i32.mul + (get_local $8) + (i32.const 10) + ) + (get_local $6) + ) + ) + (i32.ge_u + (tee_local $9 + (i32.add + (i32.load8_s + (tee_local $10 + (i32.add + (get_local $10) + (i32.const 1) + ) ) ) + (i32.const -48) ) - (i32.const -48) ) + (i32.const 10) ) - (i32.const 10) ) ) (set_local $8 @@ -3209,12 +3192,11 @@ (i32.const 4) ) ) - (set_local $6 + (br $label$break$L46 (i32.load (get_local $6) ) ) - (br $label$break$L46) ) ) ) @@ -3720,7 +3702,7 @@ ) ) (set_local $8 - (get_local $22) + (get_local $26) ) (block (set_local $5 @@ -3730,7 +3712,7 @@ (get_local $8) ) (set_local $8 - (get_local $22) + (get_local $26) ) (loop $while-in32 (i32.store8 @@ -3771,43 +3753,41 @@ ) ) ) - (if - (i32.and - (get_local $11) - (i32.const 8) - ) - (block - (set_local $5 - (get_local $8) - ) - (set_local $7 + (set_local $5 + (if (result i32) + (i32.and (get_local $11) + (i32.const 8) ) - (set_local $6 - (select - (tee_local $11 - (i32.add - (i32.sub - (get_local $39) - (get_local $8) + (block (result i32) + (set_local $7 + (get_local $11) + ) + (set_local $6 + (select + (tee_local $11 + (i32.add + (i32.sub + (get_local $39) + (get_local $8) + ) + (i32.const 1) ) - (i32.const 1) ) - ) - (get_local $6) - (i32.lt_s (get_local $6) - (get_local $11) + (i32.lt_s + (get_local $6) + (get_local $11) + ) ) ) - ) - ) - (block - (set_local $5 (get_local $8) ) - (set_local $7 - (get_local $11) + (block (result i32) + (set_local $7 + (get_local $11) + ) + (get_local $8) ) ) ) @@ -3864,29 +3844,27 @@ (br $__rjti$4) ) ) - (if - (i32.and - (get_local $11) - (i32.const 2048) - ) - (block - (set_local $8 - (i32.const 1) + (set_local $9 + (if (result i32) + (i32.and + (get_local $11) + (i32.const 2048) ) - (set_local $9 + (block (result i32) + (set_local $8 + (i32.const 1) + ) (i32.const 4092) ) - ) - (block - (set_local $8 - (tee_local $9 - (i32.and - (get_local $11) - (i32.const 1) + (block (result i32) + (set_local $8 + (tee_local $9 + (i32.and + (get_local $11) + (i32.const 1) + ) ) ) - ) - (set_local $9 (select (i32.const 4093) (i32.const 4091) @@ -3946,7 +3924,7 @@ (i32.const 4091) ) (br $__rjto$8 - (get_local $22) + (get_local $26) ) ) (set_local $5 @@ -4026,7 +4004,7 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (i32.const 0) ) (f64.store @@ -4122,11 +4100,13 @@ (if (tee_local $5 (f64.ne - (tee_local $24 + (tee_local $23 (f64.mul - (call $_frexpl + (call $_frexp (get_local $15) - (get_local $21) + (tee_local $5 + (get_local $20) + ) ) (f64.const 2) ) @@ -4135,10 +4115,10 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (i32.add (i32.load - (get_local $21) + (get_local $20) ) (i32.const -1) ) @@ -4146,7 +4126,7 @@ ) (if (i32.eq - (tee_local $25 + (tee_local $24 (i32.or (get_local $18) (i32.const 32) @@ -4186,7 +4166,7 @@ ) ) ) - (get_local $24) + (get_local $23) (block (result f64) (set_local $15 (f64.const 8) @@ -4219,7 +4199,7 @@ (get_local $15) (f64.sub (f64.neg - (get_local $24) + (get_local $23) ) (get_local $15) ) @@ -4227,7 +4207,7 @@ ) (f64.sub (f64.add - (get_local $24) + (get_local $23) (get_local $15) ) (get_local $15) @@ -4246,7 +4226,7 @@ (i32.const 0) (tee_local $7 (i32.load - (get_local $21) + (get_local $20) ) ) ) @@ -4331,7 +4311,7 @@ ) ) (set_local $5 - (get_local $23) + (get_local $22) ) (loop $while-in56 (i32.store8 @@ -4498,7 +4478,7 @@ ) (drop (call $___fwritex - (get_local $23) + (get_local $22) (get_local $5) (get_local $0) ) @@ -4566,28 +4546,28 @@ (get_local $5) (block (result f64) (i32.store - (get_local $21) + (get_local $20) (tee_local $5 (i32.add (i32.load - (get_local $21) + (get_local $20) ) (i32.const -28) ) ) ) (f64.mul - (get_local $24) + (get_local $23) (f64.const 268435456) ) ) (block (result f64) (set_local $5 (i32.load - (get_local $21) + (get_local $20) ) ) - (get_local $24) + (get_local $23) ) ) ) @@ -4639,7 +4619,7 @@ (i32.gt_s (tee_local $9 (i32.load - (get_local $21) + (get_local $20) ) ) (i32.const 0) @@ -4677,28 +4657,26 @@ (loop $while-in66 (i32.store (get_local $9) - (tee_local $20 - (call $___uremdi3 - (tee_local $12 - (call $_i64Add - (call $_bitshift64Shl - (i32.load - (get_local $9) - ) - (i32.const 0) - (get_local $13) + (call $___uremdi3 + (tee_local $12 + (call $_i64Add + (call $_bitshift64Shl + (i32.load + (get_local $9) ) - (get_global $tempRet0) - (get_local $12) (i32.const 0) + (get_local $13) ) - ) - (tee_local $17 (get_global $tempRet0) + (get_local $12) + (i32.const 0) ) - (i32.const 1000000000) - (i32.const 0) ) + (tee_local $17 + (get_global $tempRet0) + ) + (i32.const 1000000000) + (i32.const 0) ) ) (set_local $12 @@ -4765,11 +4743,11 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (tee_local $9 (i32.sub (i32.load - (get_local $21) + (get_local $20) ) (get_local $13) ) @@ -4803,7 +4781,7 @@ (i32.const 0) ) (block - (set_local $20 + (set_local $21 (i32.add (call $i32s-div (i32.add @@ -4817,7 +4795,7 @@ ) (set_local $32 (i32.eq - (get_local $25) + (get_local $24) (i32.const 102) ) ) @@ -4960,7 +4938,7 @@ ) ) (i32.shl - (get_local $20) + (get_local $21) (i32.const 2) ) ) @@ -4973,16 +4951,16 @@ ) (i32.const 2) ) - (get_local $20) + (get_local $21) ) ) ) (i32.store - (get_local $21) + (get_local $20) (tee_local $9 (i32.add (i32.load - (get_local $21) + (get_local $20) ) (get_local $13) ) @@ -5017,7 +4995,7 @@ (get_local $7) ) ) - (set_local $20 + (set_local $21 (get_local $8) ) (block $do-once75 @@ -5031,7 +5009,7 @@ (i32.mul (i32.shr_s (i32.sub - (get_local $20) + (get_local $21) (get_local $5) ) (i32.const 2) @@ -5088,7 +5066,7 @@ (get_local $7) (i32.const 0) (i32.ne - (get_local $25) + (get_local $24) (i32.const 102) ) ) @@ -5104,7 +5082,7 @@ ) (tee_local $38 (i32.eq - (get_local $25) + (get_local $24) (i32.const 103) ) ) @@ -5120,7 +5098,7 @@ (i32.shr_s (i32.sub (get_local $9) - (get_local $20) + (get_local $21) ) (i32.const 2) ) @@ -5145,9 +5123,15 @@ (i32.lt_s (tee_local $6 (i32.add - (call $i32s-rem - (get_local $6) - (i32.const 9) + (if (result i32) + (tee_local $12 + (i32.const 9) + ) + (i32.rem_s + (get_local $6) + (get_local $12) + ) + (i32.const 0) ) (i32.const 1) ) @@ -5184,7 +5168,7 @@ ) (set_local $13 (call $i32u-rem - (tee_local $25 + (tee_local $24 (i32.load (tee_local $6 (i32.add @@ -5224,7 +5208,7 @@ (block (set_local $50 (call $i32u-div - (get_local $25) + (get_local $24) (get_local $12) ) ) @@ -5253,7 +5237,7 @@ ) ) ) - (set_local $24 + (set_local $23 (select (f64.const 9007199254740994) (f64.const 9007199254740992) @@ -5275,9 +5259,9 @@ (i32.const 45) ) ) - (set_local $24 + (set_local $23 (f64.neg - (get_local $24) + (get_local $23) ) ) (set_local $15 @@ -5292,7 +5276,7 @@ (get_local $6) (tee_local $13 (i32.sub - (get_local $25) + (get_local $24) (get_local $13) ) ) @@ -5300,10 +5284,10 @@ (br_if $do-once81 (f64.eq (f64.add - (get_local $24) + (get_local $23) (get_local $15) ) - (get_local $24) + (get_local $23) ) ) (i32.store @@ -5368,7 +5352,7 @@ (i32.mul (i32.shr_s (i32.sub - (get_local $20) + (get_local $21) (get_local $5) ) (i32.const 2) @@ -5456,7 +5440,7 @@ (get_local $12) ) (block - (set_local $25 + (set_local $24 (i32.const 0) ) (set_local $9 @@ -5475,7 +5459,7 @@ ) ) (block - (set_local $25 + (set_local $24 (i32.const 1) ) (set_local $9 @@ -5565,7 +5549,7 @@ ) ) (block - (set_local $20 + (set_local $21 (get_local $5) ) (br $do-once91 @@ -5575,7 +5559,7 @@ ) (block $do-once93 (if - (get_local $25) + (get_local $24) (block (if (i32.eqz @@ -5648,7 +5632,7 @@ (i32.shr_s (i32.sub (get_local $9) - (get_local $20) + (get_local $21) ) (i32.const 2) ) @@ -5666,7 +5650,7 @@ (i32.const 102) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.const 0) ) (select @@ -5693,7 +5677,7 @@ ) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.const 0) ) (select @@ -5725,7 +5709,7 @@ ) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.and (get_local $11) (i32.const 8) @@ -5744,122 +5728,120 @@ (tee_local $32 (i32.or (get_local $5) - (get_local $20) + (get_local $21) ) ) (i32.const 0) ) ) - (tee_local $7 - (if (result i32) - (tee_local $17 - (i32.eq - (i32.or - (get_local $7) - (i32.const 32) - ) - (i32.const 102) + (if (result i32) + (tee_local $17 + (i32.eq + (i32.or + (get_local $7) + (i32.const 32) ) + (i32.const 102) ) - (block (result i32) - (set_local $18 - (i32.const 0) - ) - (select + ) + (block (result i32) + (set_local $18 + (i32.const 0) + ) + (select + (get_local $13) + (i32.const 0) + (i32.gt_s (get_local $13) (i32.const 0) - (i32.gt_s - (get_local $13) - (i32.const 0) - ) ) ) - (block (result i32) - (if - (i32.lt_s - (i32.sub - (get_local $28) - (tee_local $6 - (call $_fmt_u - (tee_local $6 - (select - (get_local $33) + ) + (block (result i32) + (if + (i32.lt_s + (i32.sub + (get_local $28) + (tee_local $6 + (call $_fmt_u + (tee_local $6 + (select + (get_local $33) + (get_local $13) + (i32.lt_s (get_local $13) - (i32.lt_s - (get_local $13) - (i32.const 0) - ) + (i32.const 0) ) ) - (i32.shr_s - (i32.shl - (i32.lt_s - (get_local $6) - (i32.const 0) - ) - (i32.const 31) + ) + (i32.shr_s + (i32.shl + (i32.lt_s + (get_local $6) + (i32.const 0) ) (i32.const 31) ) - (get_local $34) + (i32.const 31) ) + (get_local $34) ) ) - (i32.const 2) ) - (loop $while-in98 - (i32.store8 - (tee_local $6 - (i32.add - (get_local $6) - (i32.const -1) - ) - ) - (i32.const 48) - ) - (br_if $while-in98 - (i32.lt_s - (i32.sub - (get_local $28) - (get_local $6) - ) - (i32.const 2) + (i32.const 2) + ) + (loop $while-in98 + (i32.store8 + (tee_local $6 + (i32.add + (get_local $6) + (i32.const -1) ) ) + (i32.const 48) ) - ) - (i32.store8 - (i32.add - (get_local $6) - (i32.const -1) - ) - (i32.add - (i32.and - (i32.shr_s - (get_local $13) - (i32.const 31) + (br_if $while-in98 + (i32.lt_s + (i32.sub + (get_local $28) + (get_local $6) ) (i32.const 2) ) - (i32.const 43) ) ) - (i32.store8 - (tee_local $6 - (i32.add - (get_local $6) - (i32.const -2) + ) + (i32.store8 + (i32.add + (get_local $6) + (i32.const -1) + ) + (i32.add + (i32.and + (i32.shr_s + (get_local $13) + (i32.const 31) ) + (i32.const 2) ) - (get_local $7) + (i32.const 43) ) - (set_local $18 - (get_local $6) - ) - (i32.sub - (get_local $28) - (get_local $6) + ) + (i32.store8 + (tee_local $6 + (i32.add + (get_local $6) + (i32.const -2) + ) ) + (get_local $7) + ) + (set_local $18 + (get_local $6) + ) + (i32.sub + (get_local $28) + (get_local $6) ) ) ) @@ -5945,7 +5927,7 @@ (br_if $do-once103 (i32.le_u (get_local $7) - (get_local $23) + (get_local $22) ) ) (loop $while-in106 @@ -5961,7 +5943,7 @@ (br_if $while-in106 (i32.gt_u (get_local $7) - (get_local $23) + (get_local $22) ) ) ) @@ -6051,7 +6033,7 @@ (get_local $30) ) ) - (get_local $23) + (get_local $22) ) (loop $while-in112 (i32.store8 @@ -6066,7 +6048,7 @@ (br_if $while-in112 (i32.gt_u (get_local $6) - (get_local $23) + (get_local $22) ) ) ) @@ -6148,7 +6130,7 @@ (get_local $12) (i32.const 4) ) - (get_local $25) + (get_local $24) ) ) (if @@ -6159,7 +6141,7 @@ (block (set_local $17 (i32.eqz - (get_local $20) + (get_local $21) ) ) (set_local $6 @@ -6251,7 +6233,7 @@ (br_if $do-once115 (i32.le_u (get_local $5) - (get_local $23) + (get_local $22) ) ) (loop $while-in118 @@ -6267,7 +6249,7 @@ (br_if $while-in118 (i32.gt_u (get_local $5) - (get_local $23) + (get_local $22) ) ) ) @@ -6516,7 +6498,7 @@ (i32.const 4091) ) (br $__rjto$8 - (get_local $22) + (get_local $26) ) ) (set_local $9 @@ -6546,7 +6528,7 @@ ) (block (set_local $5 - (get_local $22) + (get_local $26) ) (set_local $8 (i32.const 0) @@ -6561,7 +6543,7 @@ (get_local $8) ) (set_local $8 - (get_local $22) + (get_local $26) ) (loop $while-in123 (i32.store8 @@ -6608,49 +6590,47 @@ (get_local $8) ) ) - (if - (i32.or - (i32.eqz - (i32.and - (get_local $7) - (i32.const 8) - ) - ) - (i32.and + (set_local $8 + (if (result i32) + (i32.or (i32.eqz - (i32.load - (tee_local $11 - (get_local $19) - ) + (i32.and + (get_local $7) + (i32.const 8) ) ) - (i32.eqz - (i32.load offset=4 - (get_local $11) + (i32.and + (i32.eqz + (i32.load + (tee_local $11 + (get_local $19) + ) + ) + ) + (i32.eqz + (i32.load offset=4 + (get_local $11) + ) ) ) ) - ) - (block - (set_local $8 + (block (result i32) + (set_local $9 + (i32.const 4091) + ) (i32.const 0) ) - (set_local $9 - (i32.const 4091) - ) - ) - (block - (set_local $8 - (i32.const 2) - ) - (set_local $9 - (i32.add - (i32.shr_s - (get_local $18) - (i32.const 4) + (block (result i32) + (set_local $9 + (i32.add + (i32.shr_s + (get_local $18) + (i32.const 4) + ) + (i32.const 4091) ) - (i32.const 4091) ) + (i32.const 2) ) ) ) @@ -6662,7 +6642,7 @@ (call $_fmt_u (get_local $5) (get_local $7) - (get_local $22) + (get_local $26) ) ) (set_local $7 @@ -6920,33 +6900,33 @@ ) ) ) - (if - (i32.or - (get_local $6) - (tee_local $12 - (i32.or - (i32.ne - (i32.load - (tee_local $7 - (get_local $19) + (set_local $12 + (if (result i32) + (i32.or + (get_local $6) + (tee_local $12 + (i32.or + (i32.ne + (i32.load + (tee_local $7 + (get_local $19) + ) ) + (i32.const 0) ) - (i32.const 0) - ) - (i32.ne - (i32.load offset=4 - (get_local $7) + (i32.ne + (i32.load offset=4 + (get_local $7) + ) + (i32.const 0) ) - (i32.const 0) ) ) ) - ) - (block - (set_local $7 - (get_local $5) - ) - (set_local $12 + (block (result i32) + (set_local $7 + (get_local $5) + ) (select (get_local $6) (tee_local $5 @@ -6970,17 +6950,15 @@ ) ) ) - ) - (block - (set_local $7 - (get_local $22) - ) - (set_local $12 + (block (result i32) + (set_local $7 + (get_local $26) + ) (i32.const 0) ) ) ) - (get_local $22) + (get_local $26) ) ) (call $_pad @@ -7193,7 +7171,7 @@ ) ) (set_global $STACKTOP - (get_local $26) + (get_local $25) ) (get_local $16) ) diff --git a/test/emcc_hello_world.fromasm.imprecise b/test/emcc_hello_world.fromasm.imprecise index 96344b09d..e6caa9b58 100644 --- a/test/emcc_hello_world.fromasm.imprecise +++ b/test/emcc_hello_world.fromasm.imprecise @@ -255,12 +255,6 @@ ) (get_local $0) ) - (func $_frexpl (param $0 f64) (param $1 i32) (result f64) - (call $_frexp - (get_local $0) - (get_local $1) - ) - ) (func $_strerror (param $0 i32) (result i32) (local $1 i32) (local $2 i32) @@ -2212,8 +2206,8 @@ (local $20 i32) (local $21 i32) (local $22 i32) - (local $23 i32) - (local $24 f64) + (local $23 f64) + (local $24 i32) (local $25 i32) (local $26 i32) (local $27 i32) @@ -2240,7 +2234,7 @@ (local $48 i32) (local $49 i32) (local $50 i32) - (set_local $26 + (set_local $25 (get_global $STACKTOP) ) (set_global $STACKTOP @@ -2256,18 +2250,18 @@ ) (call $abort) ) - (set_local $21 + (set_local $20 (i32.add - (get_local $26) + (get_local $25) (i32.const 16) ) ) (set_local $19 - (get_local $26) + (get_local $25) ) (set_local $36 (i32.add - (get_local $26) + (get_local $25) (i32.const 528) ) ) @@ -2278,11 +2272,11 @@ ) ) (set_local $39 - (tee_local $22 + (tee_local $26 (i32.add (tee_local $5 (i32.add - (get_local $26) + (get_local $25) (i32.const 536) ) ) @@ -2300,7 +2294,7 @@ (i32.add (tee_local $41 (i32.add - (get_local $26) + (get_local $25) (i32.const 8) ) ) @@ -2311,7 +2305,7 @@ (i32.add (tee_local $5 (i32.add - (get_local $26) + (get_local $25) (i32.const 576) ) ) @@ -2330,9 +2324,9 @@ (get_local $34) ) (tee_local $37 - (tee_local $23 + (tee_local $22 (i32.add - (get_local $26) + (get_local $25) (i32.const 588) ) ) @@ -2355,7 +2349,7 @@ (i32.add (tee_local $48 (i32.add - (get_local $26) + (get_local $25) (i32.const 24) ) ) @@ -2365,14 +2359,14 @@ (set_local $43 (tee_local $30 (i32.add - (get_local $23) + (get_local $22) (i32.const 9) ) ) ) (set_local $35 (i32.add - (get_local $23) + (get_local $22) (i32.const 8) ) ) @@ -2854,26 +2848,24 @@ (get_local $6) ) ) - (if - (i32.lt_s - (get_local $14) - (i32.const 0) - ) - (block - (set_local $11 + (set_local $11 + (if (result i32) + (i32.lt_s + (get_local $14) + (i32.const 0) + ) + (block (result i32) + (set_local $14 + (i32.sub + (i32.const 0) + (get_local $14) + ) + ) (i32.or (get_local $1) (i32.const 8192) ) ) - (set_local $14 - (i32.sub - (i32.const 0) - (get_local $14) - ) - ) - ) - (set_local $11 (get_local $1) ) ) @@ -2977,8 +2969,8 @@ ) ) ) - (block $label$break$L46 - (set_local $6 + (set_local $6 + (block $label$break$L46 (result i32) (if (result i32) (i32.eq (i32.load8_s @@ -3027,38 +3019,39 @@ (set_local $10 (get_local $6) ) - (set_local $6 + (br $label$break$L46 (i32.const 0) ) - (br $label$break$L46) ) ) (loop $while-in11 - (set_local $6 - (i32.add - (i32.mul - (get_local $8) - (i32.const 10) - ) - (get_local $6) - ) - ) - (br_if $label$break$L46 - (i32.ge_u - (tee_local $9 + (drop + (br_if $label$break$L46 + (tee_local $6 (i32.add - (i32.load8_s - (tee_local $10 - (i32.add - (get_local $10) - (i32.const 1) + (i32.mul + (get_local $8) + (i32.const 10) + ) + (get_local $6) + ) + ) + (i32.ge_u + (tee_local $9 + (i32.add + (i32.load8_s + (tee_local $10 + (i32.add + (get_local $10) + (i32.const 1) + ) ) ) + (i32.const -48) ) - (i32.const -48) ) + (i32.const 10) ) - (i32.const 10) ) ) (set_local $8 @@ -3130,12 +3123,11 @@ (i32.const 4) ) ) - (set_local $6 + (br $label$break$L46 (i32.load (get_local $6) ) ) - (br $label$break$L46) ) ) ) @@ -3641,7 +3633,7 @@ ) ) (set_local $8 - (get_local $22) + (get_local $26) ) (block (set_local $5 @@ -3651,7 +3643,7 @@ (get_local $8) ) (set_local $8 - (get_local $22) + (get_local $26) ) (loop $while-in32 (i32.store8 @@ -3692,43 +3684,41 @@ ) ) ) - (if - (i32.and - (get_local $11) - (i32.const 8) - ) - (block - (set_local $5 - (get_local $8) - ) - (set_local $7 + (set_local $5 + (if (result i32) + (i32.and (get_local $11) + (i32.const 8) ) - (set_local $6 - (select - (tee_local $11 - (i32.add - (i32.sub - (get_local $39) - (get_local $8) + (block (result i32) + (set_local $7 + (get_local $11) + ) + (set_local $6 + (select + (tee_local $11 + (i32.add + (i32.sub + (get_local $39) + (get_local $8) + ) + (i32.const 1) ) - (i32.const 1) ) - ) - (get_local $6) - (i32.lt_s (get_local $6) - (get_local $11) + (i32.lt_s + (get_local $6) + (get_local $11) + ) ) ) - ) - ) - (block - (set_local $5 (get_local $8) ) - (set_local $7 - (get_local $11) + (block (result i32) + (set_local $7 + (get_local $11) + ) + (get_local $8) ) ) ) @@ -3785,29 +3775,27 @@ (br $__rjti$4) ) ) - (if - (i32.and - (get_local $11) - (i32.const 2048) - ) - (block - (set_local $8 - (i32.const 1) + (set_local $9 + (if (result i32) + (i32.and + (get_local $11) + (i32.const 2048) ) - (set_local $9 + (block (result i32) + (set_local $8 + (i32.const 1) + ) (i32.const 4092) ) - ) - (block - (set_local $8 - (tee_local $9 - (i32.and - (get_local $11) - (i32.const 1) + (block (result i32) + (set_local $8 + (tee_local $9 + (i32.and + (get_local $11) + (i32.const 1) + ) ) ) - ) - (set_local $9 (select (i32.const 4093) (i32.const 4091) @@ -3867,7 +3855,7 @@ (i32.const 4091) ) (br $__rjto$8 - (get_local $22) + (get_local $26) ) ) (set_local $5 @@ -3947,7 +3935,7 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (i32.const 0) ) (f64.store @@ -4033,11 +4021,13 @@ (if (tee_local $5 (f64.ne - (tee_local $24 + (tee_local $23 (f64.mul - (call $_frexpl + (call $_frexp (get_local $15) - (get_local $21) + (tee_local $5 + (get_local $20) + ) ) (f64.const 2) ) @@ -4046,10 +4036,10 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (i32.add (i32.load - (get_local $21) + (get_local $20) ) (i32.const -1) ) @@ -4057,7 +4047,7 @@ ) (if (i32.eq - (tee_local $25 + (tee_local $24 (i32.or (get_local $18) (i32.const 32) @@ -4097,7 +4087,7 @@ ) ) ) - (get_local $24) + (get_local $23) (block (result f64) (set_local $15 (f64.const 8) @@ -4124,7 +4114,7 @@ (get_local $15) (f64.sub (f64.neg - (get_local $24) + (get_local $23) ) (get_local $15) ) @@ -4132,7 +4122,7 @@ ) (f64.sub (f64.add - (get_local $24) + (get_local $23) (get_local $15) ) (get_local $15) @@ -4157,7 +4147,7 @@ (i32.const 0) (tee_local $7 (i32.load - (get_local $21) + (get_local $20) ) ) ) @@ -4242,7 +4232,7 @@ ) ) (set_local $5 - (get_local $23) + (get_local $22) ) (loop $while-in56 (i32.store8 @@ -4409,7 +4399,7 @@ ) (drop (call $___fwritex - (get_local $23) + (get_local $22) (get_local $5) (get_local $0) ) @@ -4477,28 +4467,28 @@ (get_local $5) (block (result f64) (i32.store - (get_local $21) + (get_local $20) (tee_local $5 (i32.add (i32.load - (get_local $21) + (get_local $20) ) (i32.const -28) ) ) ) (f64.mul - (get_local $24) + (get_local $23) (f64.const 268435456) ) ) (block (result f64) (set_local $5 (i32.load - (get_local $21) + (get_local $20) ) ) - (get_local $24) + (get_local $23) ) ) ) @@ -4550,7 +4540,7 @@ (i32.gt_s (tee_local $9 (i32.load - (get_local $21) + (get_local $20) ) ) (i32.const 0) @@ -4588,28 +4578,26 @@ (loop $while-in66 (i32.store (get_local $9) - (tee_local $20 - (call $___uremdi3 - (tee_local $12 - (call $_i64Add - (call $_bitshift64Shl - (i32.load - (get_local $9) - ) - (i32.const 0) - (get_local $13) + (call $___uremdi3 + (tee_local $12 + (call $_i64Add + (call $_bitshift64Shl + (i32.load + (get_local $9) ) - (get_global $tempRet0) - (get_local $12) (i32.const 0) + (get_local $13) ) - ) - (tee_local $17 (get_global $tempRet0) + (get_local $12) + (i32.const 0) ) - (i32.const 1000000000) - (i32.const 0) ) + (tee_local $17 + (get_global $tempRet0) + ) + (i32.const 1000000000) + (i32.const 0) ) ) (set_local $12 @@ -4676,11 +4664,11 @@ ) ) (i32.store - (get_local $21) + (get_local $20) (tee_local $9 (i32.sub (i32.load - (get_local $21) + (get_local $20) ) (get_local $13) ) @@ -4714,7 +4702,7 @@ (i32.const 0) ) (block - (set_local $20 + (set_local $21 (i32.add (i32.div_s (i32.add @@ -4728,7 +4716,7 @@ ) (set_local $32 (i32.eq - (get_local $25) + (get_local $24) (i32.const 102) ) ) @@ -4871,7 +4859,7 @@ ) ) (i32.shl - (get_local $20) + (get_local $21) (i32.const 2) ) ) @@ -4884,16 +4872,16 @@ ) (i32.const 2) ) - (get_local $20) + (get_local $21) ) ) ) (i32.store - (get_local $21) + (get_local $20) (tee_local $9 (i32.add (i32.load - (get_local $21) + (get_local $20) ) (get_local $13) ) @@ -4928,7 +4916,7 @@ (get_local $7) ) ) - (set_local $20 + (set_local $21 (get_local $8) ) (block $do-once75 @@ -4942,7 +4930,7 @@ (i32.mul (i32.shr_s (i32.sub - (get_local $20) + (get_local $21) (get_local $5) ) (i32.const 2) @@ -4999,7 +4987,7 @@ (get_local $7) (i32.const 0) (i32.ne - (get_local $25) + (get_local $24) (i32.const 102) ) ) @@ -5015,7 +5003,7 @@ ) (tee_local $38 (i32.eq - (get_local $25) + (get_local $24) (i32.const 103) ) ) @@ -5031,7 +5019,7 @@ (i32.shr_s (i32.sub (get_local $9) - (get_local $20) + (get_local $21) ) (i32.const 2) ) @@ -5089,7 +5077,7 @@ ) (set_local $13 (i32.rem_u - (tee_local $25 + (tee_local $24 (i32.load (tee_local $6 (i32.add @@ -5155,13 +5143,13 @@ ) ) ) - (set_local $24 + (set_local $23 (select (f64.const 9007199254740994) (f64.const 9007199254740992) (i32.and (i32.div_u - (get_local $25) + (get_local $24) (get_local $12) ) (i32.const 1) @@ -5180,9 +5168,9 @@ (i32.const 45) ) ) - (set_local $24 + (set_local $23 (f64.neg - (get_local $24) + (get_local $23) ) ) (set_local $15 @@ -5197,7 +5185,7 @@ (get_local $6) (tee_local $13 (i32.sub - (get_local $25) + (get_local $24) (get_local $13) ) ) @@ -5205,10 +5193,10 @@ (br_if $do-once81 (f64.eq (f64.add - (get_local $24) + (get_local $23) (get_local $15) ) - (get_local $24) + (get_local $23) ) ) (i32.store @@ -5273,7 +5261,7 @@ (i32.mul (i32.shr_s (i32.sub - (get_local $20) + (get_local $21) (get_local $5) ) (i32.const 2) @@ -5361,7 +5349,7 @@ (get_local $12) ) (block - (set_local $25 + (set_local $24 (i32.const 0) ) (set_local $9 @@ -5380,7 +5368,7 @@ ) ) (block - (set_local $25 + (set_local $24 (i32.const 1) ) (set_local $9 @@ -5470,7 +5458,7 @@ ) ) (block - (set_local $20 + (set_local $21 (get_local $5) ) (br $do-once91 @@ -5480,7 +5468,7 @@ ) (block $do-once93 (if - (get_local $25) + (get_local $24) (block (if (i32.eqz @@ -5553,7 +5541,7 @@ (i32.shr_s (i32.sub (get_local $9) - (get_local $20) + (get_local $21) ) (i32.const 2) ) @@ -5571,7 +5559,7 @@ (i32.const 102) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.const 0) ) (select @@ -5598,7 +5586,7 @@ ) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.const 0) ) (select @@ -5630,7 +5618,7 @@ ) ) (block (result i32) - (set_local $20 + (set_local $21 (i32.and (get_local $11) (i32.const 8) @@ -5649,122 +5637,120 @@ (tee_local $32 (i32.or (get_local $5) - (get_local $20) + (get_local $21) ) ) (i32.const 0) ) ) - (tee_local $7 - (if (result i32) - (tee_local $17 - (i32.eq - (i32.or - (get_local $7) - (i32.const 32) - ) - (i32.const 102) + (if (result i32) + (tee_local $17 + (i32.eq + (i32.or + (get_local $7) + (i32.const 32) ) + (i32.const 102) ) - (block (result i32) - (set_local $18 - (i32.const 0) - ) - (select + ) + (block (result i32) + (set_local $18 + (i32.const 0) + ) + (select + (get_local $13) + (i32.const 0) + (i32.gt_s (get_local $13) (i32.const 0) - (i32.gt_s - (get_local $13) - (i32.const 0) - ) ) ) - (block (result i32) - (if - (i32.lt_s - (i32.sub - (get_local $28) - (tee_local $6 - (call $_fmt_u - (tee_local $6 - (select - (get_local $33) + ) + (block (result i32) + (if + (i32.lt_s + (i32.sub + (get_local $28) + (tee_local $6 + (call $_fmt_u + (tee_local $6 + (select + (get_local $33) + (get_local $13) + (i32.lt_s (get_local $13) - (i32.lt_s - (get_local $13) - (i32.const 0) - ) + (i32.const 0) ) ) - (i32.shr_s - (i32.shl - (i32.lt_s - (get_local $6) - (i32.const 0) - ) - (i32.const 31) + ) + (i32.shr_s + (i32.shl + (i32.lt_s + (get_local $6) + (i32.const 0) ) (i32.const 31) ) - (get_local $34) + (i32.const 31) ) + (get_local $34) ) ) - (i32.const 2) ) - (loop $while-in98 - (i32.store8 - (tee_local $6 - (i32.add - (get_local $6) - (i32.const -1) - ) - ) - (i32.const 48) - ) - (br_if $while-in98 - (i32.lt_s - (i32.sub - (get_local $28) - (get_local $6) - ) - (i32.const 2) + (i32.const 2) + ) + (loop $while-in98 + (i32.store8 + (tee_local $6 + (i32.add + (get_local $6) + (i32.const -1) ) ) + (i32.const 48) ) - ) - (i32.store8 - (i32.add - (get_local $6) - (i32.const -1) - ) - (i32.add - (i32.and - (i32.shr_s - (get_local $13) - (i32.const 31) + (br_if $while-in98 + (i32.lt_s + (i32.sub + (get_local $28) + (get_local $6) ) (i32.const 2) ) - (i32.const 43) ) ) - (i32.store8 - (tee_local $6 - (i32.add - (get_local $6) - (i32.const -2) + ) + (i32.store8 + (i32.add + (get_local $6) + (i32.const -1) + ) + (i32.add + (i32.and + (i32.shr_s + (get_local $13) + (i32.const 31) ) + (i32.const 2) ) - (get_local $7) + (i32.const 43) ) - (set_local $18 - (get_local $6) - ) - (i32.sub - (get_local $28) - (get_local $6) + ) + (i32.store8 + (tee_local $6 + (i32.add + (get_local $6) + (i32.const -2) + ) ) + (get_local $7) + ) + (set_local $18 + (get_local $6) + ) + (i32.sub + (get_local $28) + (get_local $6) ) ) ) @@ -5850,7 +5836,7 @@ (br_if $do-once103 (i32.le_u (get_local $7) - (get_local $23) + (get_local $22) ) ) (loop $while-in106 @@ -5866,7 +5852,7 @@ (br_if $while-in106 (i32.gt_u (get_local $7) - (get_local $23) + (get_local $22) ) ) ) @@ -5956,7 +5942,7 @@ (get_local $30) ) ) - (get_local $23) + (get_local $22) ) (loop $while-in112 (i32.store8 @@ -5971,7 +5957,7 @@ (br_if $while-in112 (i32.gt_u (get_local $6) - (get_local $23) + (get_local $22) ) ) ) @@ -6053,7 +6039,7 @@ (get_local $12) (i32.const 4) ) - (get_local $25) + (get_local $24) ) ) (if @@ -6064,7 +6050,7 @@ (block (set_local $17 (i32.eqz - (get_local $20) + (get_local $21) ) ) (set_local $6 @@ -6156,7 +6142,7 @@ (br_if $do-once115 (i32.le_u (get_local $5) - (get_local $23) + (get_local $22) ) ) (loop $while-in118 @@ -6172,7 +6158,7 @@ (br_if $while-in118 (i32.gt_u (get_local $5) - (get_local $23) + (get_local $22) ) ) ) @@ -6421,7 +6407,7 @@ (i32.const 4091) ) (br $__rjto$8 - (get_local $22) + (get_local $26) ) ) (set_local $9 @@ -6451,7 +6437,7 @@ ) (block (set_local $5 - (get_local $22) + (get_local $26) ) (set_local $8 (i32.const 0) @@ -6466,7 +6452,7 @@ (get_local $8) ) (set_local $8 - (get_local $22) + (get_local $26) ) (loop $while-in123 (i32.store8 @@ -6513,49 +6499,47 @@ (get_local $8) ) ) - (if - (i32.or - (i32.eqz - (i32.and - (get_local $7) - (i32.const 8) - ) - ) - (i32.and + (set_local $8 + (if (result i32) + (i32.or (i32.eqz - (i32.load - (tee_local $11 - (get_local $19) - ) + (i32.and + (get_local $7) + (i32.const 8) ) ) - (i32.eqz - (i32.load offset=4 - (get_local $11) + (i32.and + (i32.eqz + (i32.load + (tee_local $11 + (get_local $19) + ) + ) + ) + (i32.eqz + (i32.load offset=4 + (get_local $11) + ) ) ) ) - ) - (block - (set_local $8 + (block (result i32) + (set_local $9 + (i32.const 4091) + ) (i32.const 0) ) - (set_local $9 - (i32.const 4091) - ) - ) - (block - (set_local $8 - (i32.const 2) - ) - (set_local $9 - (i32.add - (i32.shr_s - (get_local $18) - (i32.const 4) + (block (result i32) + (set_local $9 + (i32.add + (i32.shr_s + (get_local $18) + (i32.const 4) + ) + (i32.const 4091) ) - (i32.const 4091) ) + (i32.const 2) ) ) ) @@ -6567,7 +6551,7 @@ (call $_fmt_u (get_local $5) (get_local $7) - (get_local $22) + (get_local $26) ) ) (set_local $7 @@ -6825,33 +6809,33 @@ ) ) ) - (if - (i32.or - (get_local $6) - (tee_local $12 - (i32.or - (i32.ne - (i32.load - (tee_local $7 - (get_local $19) + (set_local $12 + (if (result i32) + (i32.or + (get_local $6) + (tee_local $12 + (i32.or + (i32.ne + (i32.load + (tee_local $7 + (get_local $19) + ) ) + (i32.const 0) ) - (i32.const 0) - ) - (i32.ne - (i32.load offset=4 - (get_local $7) + (i32.ne + (i32.load offset=4 + (get_local $7) + ) + (i32.const 0) ) - (i32.const 0) ) ) ) - ) - (block - (set_local $7 - (get_local $5) - ) - (set_local $12 + (block (result i32) + (set_local $7 + (get_local $5) + ) (select (get_local $6) (tee_local $5 @@ -6875,17 +6859,15 @@ ) ) ) - ) - (block - (set_local $7 - (get_local $22) - ) - (set_local $12 + (block (result i32) + (set_local $7 + (get_local $26) + ) (i32.const 0) ) ) ) - (get_local $22) + (get_local $26) ) ) (call $_pad @@ -7098,7 +7080,7 @@ ) ) (set_global $STACKTOP - (get_local $26) + (get_local $25) ) (get_local $16) ) diff --git a/test/memorygrowth.fromasm b/test/memorygrowth.fromasm index 71c095deb..5f90519f0 100644 --- a/test/memorygrowth.fromasm +++ b/test/memorygrowth.fromasm @@ -9220,7 +9220,7 @@ (local $1 i32) (local $2 i32) (local $3 i32) - (set_local $2 + (set_local $3 (if (result i32) (i32.gt_s (i32.load offset=76 @@ -9242,9 +9242,18 @@ (block $do-once (result i32) (if (result i32) (i32.lt_s - (call $cb - (get_local $0) - (get_local $1) + (i32.add + (call $bb + (get_local $0) + (call $Za + (get_local $0) + ) + (i32.const 1) + (tee_local $2 + (get_local $1) + ) + ) + (i32.const -1) ) (i32.const 0) ) @@ -9261,7 +9270,7 @@ (i32.lt_u (tee_local $0 (i32.load - (tee_local $3 + (tee_local $2 (i32.add (get_local $1) (i32.const 20) @@ -9275,7 +9284,7 @@ ) (block (i32.store - (get_local $3) + (get_local $2) (i32.add (get_local $0) (i32.const 1) @@ -9303,7 +9312,7 @@ ) ) (if - (get_local $2) + (get_local $3) (call $Ta (get_local $1) ) @@ -9394,16 +9403,6 @@ ) ) ) - (func $i32u-div (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.div_u - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $bb (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) @@ -9458,9 +9457,13 @@ (get_local $4) ) (set_local $2 - (call $i32u-div - (get_local $0) + (if (result i32) (get_local $1) + (i32.div_u + (get_local $0) + (get_local $1) + ) + (i32.const 0) ) ) ) @@ -9704,19 +9707,6 @@ ) (get_local $1) ) - (func $cb (param $0 i32) (param $1 i32) (result i32) - (i32.add - (call $bb - (get_local $0) - (call $Za - (get_local $0) - ) - (i32.const 1) - (get_local $1) - ) - (i32.const -1) - ) - ) (func $ob (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (call $ja (i32.const 1) diff --git a/test/memorygrowth.fromasm.clamp b/test/memorygrowth.fromasm.clamp index 71c095deb..5f90519f0 100644 --- a/test/memorygrowth.fromasm.clamp +++ b/test/memorygrowth.fromasm.clamp @@ -9220,7 +9220,7 @@ (local $1 i32) (local $2 i32) (local $3 i32) - (set_local $2 + (set_local $3 (if (result i32) (i32.gt_s (i32.load offset=76 @@ -9242,9 +9242,18 @@ (block $do-once (result i32) (if (result i32) (i32.lt_s - (call $cb - (get_local $0) - (get_local $1) + (i32.add + (call $bb + (get_local $0) + (call $Za + (get_local $0) + ) + (i32.const 1) + (tee_local $2 + (get_local $1) + ) + ) + (i32.const -1) ) (i32.const 0) ) @@ -9261,7 +9270,7 @@ (i32.lt_u (tee_local $0 (i32.load - (tee_local $3 + (tee_local $2 (i32.add (get_local $1) (i32.const 20) @@ -9275,7 +9284,7 @@ ) (block (i32.store - (get_local $3) + (get_local $2) (i32.add (get_local $0) (i32.const 1) @@ -9303,7 +9312,7 @@ ) ) (if - (get_local $2) + (get_local $3) (call $Ta (get_local $1) ) @@ -9394,16 +9403,6 @@ ) ) ) - (func $i32u-div (param $0 i32) (param $1 i32) (result i32) - (if (result i32) - (get_local $1) - (i32.div_u - (get_local $0) - (get_local $1) - ) - (i32.const 0) - ) - ) (func $bb (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) @@ -9458,9 +9457,13 @@ (get_local $4) ) (set_local $2 - (call $i32u-div - (get_local $0) + (if (result i32) (get_local $1) + (i32.div_u + (get_local $0) + (get_local $1) + ) + (i32.const 0) ) ) ) @@ -9704,19 +9707,6 @@ ) (get_local $1) ) - (func $cb (param $0 i32) (param $1 i32) (result i32) - (i32.add - (call $bb - (get_local $0) - (call $Za - (get_local $0) - ) - (i32.const 1) - (get_local $1) - ) - (i32.const -1) - ) - ) (func $ob (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (call $ja (i32.const 1) diff --git a/test/memorygrowth.fromasm.imprecise b/test/memorygrowth.fromasm.imprecise index 38e3724a5..be7c35289 100644 --- a/test/memorygrowth.fromasm.imprecise +++ b/test/memorygrowth.fromasm.imprecise @@ -9219,7 +9219,7 @@ (local $1 i32) (local $2 i32) (local $3 i32) - (set_local $2 + (set_local $3 (if (result i32) (i32.gt_s (i32.load offset=76 @@ -9241,9 +9241,18 @@ (block $do-once (result i32) (if (result i32) (i32.lt_s - (call $cb - (get_local $0) - (get_local $1) + (i32.add + (call $bb + (get_local $0) + (call $Za + (get_local $0) + ) + (i32.const 1) + (tee_local $2 + (get_local $1) + ) + ) + (i32.const -1) ) (i32.const 0) ) @@ -9260,7 +9269,7 @@ (i32.lt_u (tee_local $0 (i32.load - (tee_local $3 + (tee_local $2 (i32.add (get_local $1) (i32.const 20) @@ -9274,7 +9283,7 @@ ) (block (i32.store - (get_local $3) + (get_local $2) (i32.add (get_local $0) (i32.const 1) @@ -9302,7 +9311,7 @@ ) ) (if - (get_local $2) + (get_local $3) (call $Ta (get_local $1) ) @@ -9693,19 +9702,6 @@ ) (get_local $1) ) - (func $cb (param $0 i32) (param $1 i32) (result i32) - (i32.add - (call $bb - (get_local $0) - (call $Za - (get_local $0) - ) - (i32.const 1) - (get_local $1) - ) - (i32.const -1) - ) - ) (func $ob (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (call $ja (i32.const 1) diff --git a/test/passes/inlining-optimizing.txt b/test/passes/inlining-optimizing.txt new file mode 100644 index 000000000..e1f81e54f --- /dev/null +++ b/test/passes/inlining-optimizing.txt @@ -0,0 +1,35 @@ +(module + (type $0 (func)) + (type $1 (func (result i32))) + (type $2 (func (result f64))) + (type $3 (func (param f32 i64))) + (table 1 1 anyfunc) + (elem (i32.const 0) $tabled) + (memory $0 0) + (export "user" (func $user)) + (export "exported" (func $exported)) + (func $user (type $0) + (call $exported) + (call $tabled) + (call $multi) + (call $multi) + ) + (func $exported (type $0) + (nop) + ) + (func $recursive (type $0) + (call $recursive) + ) + (func $tabled (type $0) + (nop) + ) + (func $cycle1 (type $0) + (call $cycle2) + ) + (func $cycle2 (type $0) + (call $cycle1) + ) + (func $multi (type $0) + (nop) + ) +) diff --git a/test/passes/inlining-optimizing.wast b/test/passes/inlining-optimizing.wast new file mode 100644 index 000000000..082c4e98a --- /dev/null +++ b/test/passes/inlining-optimizing.wast @@ -0,0 +1,79 @@ +(module + (table 1 1 anyfunc) + (elem (i32.const 0) $tabled) + (func $user (export "user") + (local $x i32) + (local $y f64) + (call $exported) + (call $tabled) + (call $multi) + (call $multi) + (call $ok) + (drop (call $int)) + (drop (call $double)) + (set_local $x (call $int2)) + (set_local $y (call $double2)) + (call $with-local) + (call $with-local2) + (drop (call $return)) + (call $multipass) + (call $param (f32.const 12.34) (i64.const 890005350012)) + ) + (func $exported (export "exported") + (nop) + ) + (func $recursive + (call $recursive) + ) + (func $tabled + (nop) + ) + (func $cycle1 + (call $cycle2) + ) + (func $cycle2 + (call $cycle1) + ) + (func $multi + (nop) + ) + (func $ok + (drop (i32.const 1)) + ) + (func $int (result i32) + (i32.const 2) + ) + (func $double (result f64) + (f64.const 3.14159) + ) + (func $int2 (result i32) + (i32.const 112) + ) + (func $double2 (result f64) + (f64.const 113.14159) + ) + (func $with-local + (local $x f32) + (set_local $x (f32.const 2.141828)) + ) + (func $with-local2 + (local $y i64) + (set_local $y (i64.const 4)) + ) + (func $return (result i32) + (return (i32.const 5)) + ) + (func $multipass + (call $multipass2) + ) + (func $multipass2 + (drop (i32.const 6)) + ) + (func $param (param $x f32) (param $y i64) + (local $z f32) + (drop (get_local $x)) + (drop (get_local $y)) + (drop (get_local $z)) + ) +) + diff --git a/test/passes/inlining.txt b/test/passes/inlining.txt index 80ee3acf3..99f764351 100644 --- a/test/passes/inlining.txt +++ b/test/passes/inlining.txt @@ -20,71 +20,93 @@ (call $tabled) (call $multi) (call $multi) - (block $__inlined_func$ok - (drop - (i32.const 1) + (block + (block $__inlined_func$ok + (drop + (i32.const 1) + ) ) ) (drop - (block $__inlined_func$int (result i32) - (i32.const 2) + (block (result i32) + (block $__inlined_func$int (result i32) + (i32.const 2) + ) ) ) (drop - (block $__inlined_func$double (result f64) - (f64.const 3.14159) + (block (result f64) + (block $__inlined_func$double (result f64) + (f64.const 3.14159) + ) ) ) (set_local $x - (block $__inlined_func$int2 (result i32) - (i32.const 112) + (block (result i32) + (block $__inlined_func$int2 (result i32) + (i32.const 112) + ) ) ) (set_local $y - (block $__inlined_func$double2 (result f64) - (f64.const 113.14159) + (block (result f64) + (block $__inlined_func$double2 (result f64) + (f64.const 113.14159) + ) ) ) - (block $__inlined_func$with-local - (set_local $2 - (f32.const 2.1418280601501465) + (block + (block $__inlined_func$with-local + (set_local $2 + (f32.const 2.1418280601501465) + ) ) ) - (block $__inlined_func$with-local2 - (set_local $3 - (i64.const 4) + (block + (block $__inlined_func$with-local2 + (set_local $3 + (i64.const 4) + ) ) ) (drop - (block $__inlined_func$return (result i32) - (br $__inlined_func$return - (i32.const 5) + (block (result i32) + (block $__inlined_func$return (result i32) + (br $__inlined_func$return + (i32.const 5) + ) ) ) ) - (block $__inlined_func$multipass - (block $__inlined_func$multipass2 - (drop - (i32.const 6) + (block + (block $__inlined_func$multipass + (block + (block $__inlined_func$multipass2 + (drop + (i32.const 6) + ) + ) ) ) ) - (block $__inlined_func$param - (set_local $4 - (f32.const 12.34000015258789) - ) - (set_local $5 - (i64.const 890005350012) - ) - (block - (drop - (get_local $4) + (block + (block $__inlined_func$param + (set_local $4 + (f32.const 12.34000015258789) ) - (drop - (get_local $5) + (set_local $5 + (i64.const 890005350012) ) - (drop - (get_local $6) + (block + (drop + (get_local $4) + ) + (drop + (get_local $5) + ) + (drop + (get_local $6) + ) ) ) ) @@ -108,3 +130,16 @@ (nop) ) ) +(module + (type $0 (func (param i32) (result i32))) + (type $1 (func (result i32))) + (memory $0 0) + (func $child (type $0) (param $0 i32) (result i32) + (i32.const 1234) + ) + (func $parent (type $1) (result i32) + (call $child + (unreachable) + ) + ) +) diff --git a/test/passes/inlining.wast b/test/passes/inlining.wast index 082c4e98a..ce8b1b8be 100644 --- a/test/passes/inlining.wast +++ b/test/passes/inlining.wast @@ -76,4 +76,14 @@ (drop (get_local $z)) ) ) +(module + (func $child (param i32) (result i32) + (i32.const 1234) + ) + (func $parent (result i32) + (call $child + (unreachable) ;; call is not performed, no sense to inline + ) + ) +) diff --git a/test/unit.asm.js b/test/unit.asm.js index 22e2cf9b4..a1accabf5 100644 --- a/test/unit.asm.js +++ b/test/unit.asm.js @@ -726,6 +726,7 @@ function asm(global, env, buffer) { function keepAlive() { sqrts(3.14159); + sqrts(2.18281); // don't inline it either f2u(100.0); f2s(100.0); autoDrop(52) | 0; diff --git a/test/unit.fromasm b/test/unit.fromasm index 8e6cd5956..7ac63bfcc 100644 --- a/test/unit.fromasm +++ b/test/unit.fromasm @@ -255,9 +255,16 @@ ) ) ) - (func $i32u-div (param $0 i32) (param $1 i32) (result i32) + (func $big_uint_div_u (result i32) + (local $0 i32) + (local $1 i32) + (set_local $0 + (i32.const -1) + ) (if (result i32) - (get_local $1) + (tee_local $1 + (i32.const 2) + ) (i32.div_u (get_local $0) (get_local $1) @@ -265,12 +272,6 @@ (i32.const 0) ) ) - (func $big_uint_div_u (result i32) - (call $i32u-div - (i32.const -1) - (i32.const 2) - ) - ) (func $fr (param $0 f32) (nop) ) @@ -1161,28 +1162,45 @@ (get_local $0) ) ) - (func $autoDrop (param $0 i32) (result i32) - (if - (i32.eq - (get_local $0) - (i32.const 17) + (func $keepAlive + (local $0 i32) + (local $1 i32) + (drop + (call $sqrts + (f64.const 3.14159) ) - (return - (i32.const 5) + ) + (drop + (call $sqrts + (f64.const 2.18281) + ) + ) + (drop + (call $f2u + (f64.const 100) + ) + ) + (drop + (call $f2u + (f64.const 100) + ) + ) + (block $__inlined_func$autoDrop + (br_if $__inlined_func$autoDrop + (i32.eq + (tee_local $0 + (i32.const 52) + ) + (i32.const 17) + ) ) ) - (get_local $0) - ) - (func $indirectInSequence (call_indirect $FUNCSIG$vi (i32.const 0) (i32.const 17) ) - ) - (func $emterpretify_assertions_safeHeap - (local $0 i32) (call_indirect $FUNCSIG$vi - (get_local $0) + (get_local $1) (block (result i32) (set_global $Int (i32.const 1) @@ -1196,8 +1214,6 @@ ) ) ) - ) - (func $call_emscripten_log (call $emscripten_log) (drop (call $f64-to-int @@ -1207,31 +1223,6 @@ ) ) ) - (func $keepAlive - (drop - (call $sqrts - (f64.const 3.14159) - ) - ) - (drop - (call $f2u - (f64.const 100) - ) - ) - (drop - (call $f2u - (f64.const 100) - ) - ) - (drop - (call $autoDrop - (i32.const 52) - ) - ) - (call $indirectInSequence) - (call $emterpretify_assertions_safeHeap) - (call $call_emscripten_log) - ) (func $vi (param $0 i32) (nop) ) diff --git a/test/unit.fromasm.clamp b/test/unit.fromasm.clamp index 9ab53f183..8f3e387ae 100644 --- a/test/unit.fromasm.clamp +++ b/test/unit.fromasm.clamp @@ -279,9 +279,16 @@ ) ) ) - (func $i32u-div (param $0 i32) (param $1 i32) (result i32) + (func $big_uint_div_u (result i32) + (local $0 i32) + (local $1 i32) + (set_local $0 + (i32.const -1) + ) (if (result i32) - (get_local $1) + (tee_local $1 + (i32.const 2) + ) (i32.div_u (get_local $0) (get_local $1) @@ -289,12 +296,6 @@ (i32.const 0) ) ) - (func $big_uint_div_u (result i32) - (call $i32u-div - (i32.const -1) - (i32.const 2) - ) - ) (func $fr (param $0 f32) (nop) ) @@ -1185,28 +1186,45 @@ (get_local $0) ) ) - (func $autoDrop (param $0 i32) (result i32) - (if - (i32.eq - (get_local $0) - (i32.const 17) + (func $keepAlive + (local $0 i32) + (local $1 i32) + (drop + (call $sqrts + (f64.const 3.14159) ) - (return - (i32.const 5) + ) + (drop + (call $sqrts + (f64.const 2.18281) + ) + ) + (drop + (call $f2u + (f64.const 100) + ) + ) + (drop + (call $f2u + (f64.const 100) + ) + ) + (block $__inlined_func$autoDrop + (br_if $__inlined_func$autoDrop + (i32.eq + (tee_local $0 + (i32.const 52) + ) + (i32.const 17) + ) ) ) - (get_local $0) - ) - (func $indirectInSequence (call_indirect $FUNCSIG$vi (i32.const 0) (i32.const 17) ) - ) - (func $emterpretify_assertions_safeHeap - (local $0 i32) (call_indirect $FUNCSIG$vi - (get_local $0) + (get_local $1) (block (result i32) (set_global $Int (i32.const 1) @@ -1220,8 +1238,6 @@ ) ) ) - ) - (func $call_emscripten_log (call $emscripten_log) (drop (call $f64-to-int @@ -1231,31 +1247,6 @@ ) ) ) - (func $keepAlive - (drop - (call $sqrts - (f64.const 3.14159) - ) - ) - (drop - (call $f2u - (f64.const 100) - ) - ) - (drop - (call $f2u - (f64.const 100) - ) - ) - (drop - (call $autoDrop - (i32.const 52) - ) - ) - (call $indirectInSequence) - (call $emterpretify_assertions_safeHeap) - (call $call_emscripten_log) - ) (func $vi (param $0 i32) (nop) ) diff --git a/test/unit.fromasm.clamp.no-opts b/test/unit.fromasm.clamp.no-opts index 9055bda68..f4fe4bf83 100644 --- a/test/unit.fromasm.clamp.no-opts +++ b/test/unit.fromasm.clamp.no-opts @@ -2034,6 +2034,11 @@ ) ) (drop + (call $sqrts + (f64.const 2.18281) + ) + ) + (drop (call $f2u (f64.const 100) ) diff --git a/test/unit.fromasm.imprecise b/test/unit.fromasm.imprecise index f57931d20..17c9109c3 100644 --- a/test/unit.fromasm.imprecise +++ b/test/unit.fromasm.imprecise @@ -1124,38 +1124,35 @@ ) ) ) - (func $f2u (param $0 f64) (result i32) - (i32.trunc_u/f64 - (get_local $0) - ) - ) - (func $f2s (param $0 f64) (result i32) - (i32.trunc_s/f64 - (get_local $0) + (func $keepAlive + (local $0 i32) + (local $1 i32) + (drop + (call $sqrts + (f64.const 3.14159) + ) ) - ) - (func $autoDrop (param $0 i32) (result i32) - (if - (i32.eq - (get_local $0) - (i32.const 17) + (drop + (call $sqrts + (f64.const 2.18281) ) - (return - (i32.const 5) + ) + (block $__inlined_func$autoDrop + (br_if $__inlined_func$autoDrop + (i32.eq + (tee_local $0 + (i32.const 52) + ) + (i32.const 17) + ) ) ) - (get_local $0) - ) - (func $indirectInSequence (call_indirect $FUNCSIG$vi (i32.const 0) (i32.const 17) ) - ) - (func $emterpretify_assertions_safeHeap - (local $0 i32) (call_indirect $FUNCSIG$vi - (get_local $0) + (get_local $1) (block (result i32) (set_global $Int (i32.const 1) @@ -1169,8 +1166,6 @@ ) ) ) - ) - (func $call_emscripten_log (call $emscripten_log) (drop (i32.trunc_s/f64 @@ -1180,31 +1175,6 @@ ) ) ) - (func $keepAlive - (drop - (call $sqrts - (f64.const 3.14159) - ) - ) - (drop - (call $f2u - (f64.const 100) - ) - ) - (drop - (call $f2s - (f64.const 100) - ) - ) - (drop - (call $autoDrop - (i32.const 52) - ) - ) - (call $indirectInSequence) - (call $emterpretify_assertions_safeHeap) - (call $call_emscripten_log) - ) (func $vi (param $0 i32) (nop) ) diff --git a/test/unit.fromasm.imprecise.no-opts b/test/unit.fromasm.imprecise.no-opts index b66c69cf7..243b8b8fe 100644 --- a/test/unit.fromasm.imprecise.no-opts +++ b/test/unit.fromasm.imprecise.no-opts @@ -1994,6 +1994,11 @@ ) ) (drop + (call $sqrts + (f64.const 2.18281) + ) + ) + (drop (call $f2u (f64.const 100) ) diff --git a/test/unit.fromasm.no-opts b/test/unit.fromasm.no-opts index 074a44bfe..09d8361bd 100644 --- a/test/unit.fromasm.no-opts +++ b/test/unit.fromasm.no-opts @@ -2010,6 +2010,11 @@ ) ) (drop + (call $sqrts + (f64.const 2.18281) + ) + ) + (drop (call $f2u (f64.const 100) ) diff --git a/test/wasm-only.asm.js b/test/wasm-only.asm.js index 750ffaa6a..0013a30c3 100644 --- a/test/wasm-only.asm.js +++ b/test/wasm-only.asm.js @@ -441,17 +441,29 @@ function asm(global, env, buffer) { function keepAlive() { loads(); + loads(); + stores(); stores(); test(); + test(); i64(imports()); + i64(imports()); + arg(i64(0)); arg(i64(0)); i64(call1(i64(0))); + i64(call1(i64(0))); i64(call2(i64(0))); + i64(call2(i64(0))); + i64(returnCastConst()); i64(returnCastConst()); i64(ifValue64(i64(0), i64(0))); + i64(ifValue64(i64(0), i64(0))); ifValue32(0, 0) | 0; + ifValue32(0, 0) | 0; + switch64(i64(0)) | 0; switch64(i64(0)) | 0; unreachable_leftovers(0, 0, 0); + unreachable_leftovers(0, 0, 0); _memchr(0, 0, 0) | 0; switch64TOOMUCH(i64(0)) | 0; switch64_big_condition1(i64(0)); diff --git a/test/wasm-only.fromasm b/test/wasm-only.fromasm index 8811d0cff..8f9825dda 100644 --- a/test/wasm-only.fromasm +++ b/test/wasm-only.fromasm @@ -241,18 +241,6 @@ ) ) ) - (func $i64u-div (param $0 i64) (param $1 i64) (result i64) - (if (result i64) - (i64.eqz - (get_local $1) - ) - (i64.const 0) - (i64.div_u - (get_local $0) - (get_local $1) - ) - ) - ) (func $i64s-div (param $0 i64) (param $1 i64) (result i64) (if (result i64) (i64.eqz @@ -278,30 +266,6 @@ ) ) ) - (func $i64u-rem (param $0 i64) (param $1 i64) (result i64) - (if (result i64) - (i64.eqz - (get_local $1) - ) - (i64.const 0) - (i64.rem_u - (get_local $0) - (get_local $1) - ) - ) - ) - (func $i64s-rem (param $0 i64) (param $1 i64) (result i64) - (if (result i64) - (i64.eqz - (get_local $1) - ) - (i64.const 0) - (i64.rem_s - (get_local $0) - (get_local $1) - ) - ) - ) (func $f64-to-int64 (param $0 f64) (result i64) (if (result i64) (f64.ne @@ -331,33 +295,66 @@ (func $test64 (local $0 i64) (local $1 i64) - (local $2 i32) + (local $2 i64) (local $3 f32) (local $4 f64) - (drop - (call $i64s-rem - (call $i64u-rem - (call $i64s-div - (call $i64u-div - (i64.mul - (i64.sub - (i64.add - (tee_local $1 - (i64.const 128849018897) - ) - (i64.const 100) + (set_local $2 + (call $i64s-div + (block (result i64) + (set_local $2 + (i64.mul + (i64.sub + (i64.add + (tee_local $0 + (i64.const 128849018897) ) - (get_local $1) + (i64.const 100) ) - (get_local $1) + (get_local $0) + ) + (get_local $0) + ) + ) + (if (result i64) + (i64.eqz + (tee_local $1 + (get_local $0) ) + ) + (i64.const 0) + (i64.div_u + (get_local $2) (get_local $1) ) - (get_local $1) ) + ) + (get_local $0) + ) + ) + (set_local $1 + (if (result i64) + (i64.eqz + (tee_local $1 + (get_local $0) + ) + ) + (i64.const 0) + (i64.rem_u + (get_local $2) (get_local $1) ) - (get_local $1) + ) + ) + (drop + (if (result i64) + (i64.eqz + (get_local $0) + ) + (i64.const 0) + (i64.rem_s + (get_local $1) + (get_local $0) + ) ) ) (drop @@ -404,22 +401,18 @@ (i32.const 120) (get_local $0) ) - (set_local $2 - (i32.wrap/i64 - (get_local $0) - ) - ) - (set_local $0 - (i64.extend_u/i32 - (get_local $2) - ) - ) (drop (call $f64-to-int64 (f64.promote/f32 (tee_local $3 (f32.convert_u/i64 - (get_local $0) + (tee_local $0 + (i64.extend_u/i32 + (i32.wrap/i64 + (get_local $0) + ) + ) + ) ) ) ) @@ -903,14 +896,28 @@ ) (func $keepAlive (call $loads) + (call $loads) + (call $stores) (call $stores) (call $test) + (call $test) + (drop + (call $imports) + ) (drop (call $imports) ) (call $arg (i64.const 0) ) + (call $arg + (i64.const 0) + ) + (drop + (call $call1 + (i64.const 0) + ) + ) (drop (call $call1 (i64.const 0) @@ -922,6 +929,14 @@ ) ) (drop + (call $call2 + (i64.const 0) + ) + ) + (drop + (call $returnCastConst) + ) + (drop (call $returnCastConst) ) (drop @@ -931,12 +946,29 @@ ) ) (drop + (call $ifValue64 + (i64.const 0) + (i64.const 0) + ) + ) + (drop (call $ifValue32 (i32.const 0) (i32.const 0) ) ) (drop + (call $ifValue32 + (i32.const 0) + (i32.const 0) + ) + ) + (drop + (call $switch64 + (i64.const 0) + ) + ) + (drop (call $switch64 (i64.const 0) ) @@ -946,6 +978,11 @@ (i32.const 0) (i32.const 0) ) + (call $unreachable_leftovers + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) (drop (call $_memchr (i32.const 0) diff --git a/test/wasm-only.fromasm.clamp b/test/wasm-only.fromasm.clamp index 8811d0cff..8f9825dda 100644 --- a/test/wasm-only.fromasm.clamp +++ b/test/wasm-only.fromasm.clamp @@ -241,18 +241,6 @@ ) ) ) - (func $i64u-div (param $0 i64) (param $1 i64) (result i64) - (if (result i64) - (i64.eqz - (get_local $1) - ) - (i64.const 0) - (i64.div_u - (get_local $0) - (get_local $1) - ) - ) - ) (func $i64s-div (param $0 i64) (param $1 i64) (result i64) (if (result i64) (i64.eqz @@ -278,30 +266,6 @@ ) ) ) - (func $i64u-rem (param $0 i64) (param $1 i64) (result i64) - (if (result i64) - (i64.eqz - (get_local $1) - ) - (i64.const 0) - (i64.rem_u - (get_local $0) - (get_local $1) - ) - ) - ) - (func $i64s-rem (param $0 i64) (param $1 i64) (result i64) - (if (result i64) - (i64.eqz - (get_local $1) - ) - (i64.const 0) - (i64.rem_s - (get_local $0) - (get_local $1) - ) - ) - ) (func $f64-to-int64 (param $0 f64) (result i64) (if (result i64) (f64.ne @@ -331,33 +295,66 @@ (func $test64 (local $0 i64) (local $1 i64) - (local $2 i32) + (local $2 i64) (local $3 f32) (local $4 f64) - (drop - (call $i64s-rem - (call $i64u-rem - (call $i64s-div - (call $i64u-div - (i64.mul - (i64.sub - (i64.add - (tee_local $1 - (i64.const 128849018897) - ) - (i64.const 100) + (set_local $2 + (call $i64s-div + (block (result i64) + (set_local $2 + (i64.mul + (i64.sub + (i64.add + (tee_local $0 + (i64.const 128849018897) ) - (get_local $1) + (i64.const 100) ) - (get_local $1) + (get_local $0) + ) + (get_local $0) + ) + ) + (if (result i64) + (i64.eqz + (tee_local $1 + (get_local $0) ) + ) + (i64.const 0) + (i64.div_u + (get_local $2) (get_local $1) ) - (get_local $1) ) + ) + (get_local $0) + ) + ) + (set_local $1 + (if (result i64) + (i64.eqz + (tee_local $1 + (get_local $0) + ) + ) + (i64.const 0) + (i64.rem_u + (get_local $2) (get_local $1) ) - (get_local $1) + ) + ) + (drop + (if (result i64) + (i64.eqz + (get_local $0) + ) + (i64.const 0) + (i64.rem_s + (get_local $1) + (get_local $0) + ) ) ) (drop @@ -404,22 +401,18 @@ (i32.const 120) (get_local $0) ) - (set_local $2 - (i32.wrap/i64 - (get_local $0) - ) - ) - (set_local $0 - (i64.extend_u/i32 - (get_local $2) - ) - ) (drop (call $f64-to-int64 (f64.promote/f32 (tee_local $3 (f32.convert_u/i64 - (get_local $0) + (tee_local $0 + (i64.extend_u/i32 + (i32.wrap/i64 + (get_local $0) + ) + ) + ) ) ) ) @@ -903,14 +896,28 @@ ) (func $keepAlive (call $loads) + (call $loads) + (call $stores) (call $stores) (call $test) + (call $test) + (drop + (call $imports) + ) (drop (call $imports) ) (call $arg (i64.const 0) ) + (call $arg + (i64.const 0) + ) + (drop + (call $call1 + (i64.const 0) + ) + ) (drop (call $call1 (i64.const 0) @@ -922,6 +929,14 @@ ) ) (drop + (call $call2 + (i64.const 0) + ) + ) + (drop + (call $returnCastConst) + ) + (drop (call $returnCastConst) ) (drop @@ -931,12 +946,29 @@ ) ) (drop + (call $ifValue64 + (i64.const 0) + (i64.const 0) + ) + ) + (drop (call $ifValue32 (i32.const 0) (i32.const 0) ) ) (drop + (call $ifValue32 + (i32.const 0) + (i32.const 0) + ) + ) + (drop + (call $switch64 + (i64.const 0) + ) + ) + (drop (call $switch64 (i64.const 0) ) @@ -946,6 +978,11 @@ (i32.const 0) (i32.const 0) ) + (call $unreachable_leftovers + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) (drop (call $_memchr (i32.const 0) diff --git a/test/wasm-only.fromasm.clamp.no-opts b/test/wasm-only.fromasm.clamp.no-opts index 143fc9892..c0cfa4676 100644 --- a/test/wasm-only.fromasm.clamp.no-opts +++ b/test/wasm-only.fromasm.clamp.no-opts @@ -1645,14 +1645,28 @@ ) (func $keepAlive (call $loads) + (call $loads) + (call $stores) (call $stores) (call $test) + (call $test) + (drop + (call $imports) + ) (drop (call $imports) ) (call $arg (i64.const 0) ) + (call $arg + (i64.const 0) + ) + (drop + (call $call1 + (i64.const 0) + ) + ) (drop (call $call1 (i64.const 0) @@ -1664,6 +1678,14 @@ ) ) (drop + (call $call2 + (i64.const 0) + ) + ) + (drop + (call $returnCastConst) + ) + (drop (call $returnCastConst) ) (drop @@ -1673,6 +1695,18 @@ ) ) (drop + (call $ifValue64 + (i64.const 0) + (i64.const 0) + ) + ) + (drop + (call $ifValue32 + (i32.const 0) + (i32.const 0) + ) + ) + (drop (call $ifValue32 (i32.const 0) (i32.const 0) @@ -1683,6 +1717,16 @@ (i64.const 0) ) ) + (drop + (call $switch64 + (i64.const 0) + ) + ) + (call $unreachable_leftovers + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) (call $unreachable_leftovers (i32.const 0) (i32.const 0) diff --git a/test/wasm-only.fromasm.imprecise b/test/wasm-only.fromasm.imprecise index 2255bfc08..07f06b23f 100644 --- a/test/wasm-only.fromasm.imprecise +++ b/test/wasm-only.fromasm.imprecise @@ -629,14 +629,28 @@ ) (func $keepAlive (call $loads) + (call $loads) + (call $stores) (call $stores) (call $test) + (call $test) + (drop + (call $imports) + ) (drop (call $imports) ) (call $arg (i64.const 0) ) + (call $arg + (i64.const 0) + ) + (drop + (call $call1 + (i64.const 0) + ) + ) (drop (call $call1 (i64.const 0) @@ -648,6 +662,14 @@ ) ) (drop + (call $call2 + (i64.const 0) + ) + ) + (drop + (call $returnCastConst) + ) + (drop (call $returnCastConst) ) (drop @@ -657,6 +679,18 @@ ) ) (drop + (call $ifValue64 + (i64.const 0) + (i64.const 0) + ) + ) + (drop + (call $ifValue32 + (i32.const 0) + (i32.const 0) + ) + ) + (drop (call $ifValue32 (i32.const 0) (i32.const 0) @@ -667,6 +701,16 @@ (i64.const 0) ) ) + (drop + (call $switch64 + (i64.const 0) + ) + ) + (call $unreachable_leftovers + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) (call $unreachable_leftovers (i32.const 0) (i32.const 0) diff --git a/test/wasm-only.fromasm.imprecise.no-opts b/test/wasm-only.fromasm.imprecise.no-opts index 0052a5c93..06935c945 100644 --- a/test/wasm-only.fromasm.imprecise.no-opts +++ b/test/wasm-only.fromasm.imprecise.no-opts @@ -1554,14 +1554,28 @@ ) (func $keepAlive (call $loads) + (call $loads) + (call $stores) (call $stores) (call $test) + (call $test) + (drop + (call $imports) + ) (drop (call $imports) ) (call $arg (i64.const 0) ) + (call $arg + (i64.const 0) + ) + (drop + (call $call1 + (i64.const 0) + ) + ) (drop (call $call1 (i64.const 0) @@ -1573,6 +1587,14 @@ ) ) (drop + (call $call2 + (i64.const 0) + ) + ) + (drop + (call $returnCastConst) + ) + (drop (call $returnCastConst) ) (drop @@ -1582,6 +1604,18 @@ ) ) (drop + (call $ifValue64 + (i64.const 0) + (i64.const 0) + ) + ) + (drop + (call $ifValue32 + (i32.const 0) + (i32.const 0) + ) + ) + (drop (call $ifValue32 (i32.const 0) (i32.const 0) @@ -1592,6 +1626,16 @@ (i64.const 0) ) ) + (drop + (call $switch64 + (i64.const 0) + ) + ) + (call $unreachable_leftovers + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) (call $unreachable_leftovers (i32.const 0) (i32.const 0) diff --git a/test/wasm-only.fromasm.no-opts b/test/wasm-only.fromasm.no-opts index 143fc9892..c0cfa4676 100644 --- a/test/wasm-only.fromasm.no-opts +++ b/test/wasm-only.fromasm.no-opts @@ -1645,14 +1645,28 @@ ) (func $keepAlive (call $loads) + (call $loads) + (call $stores) (call $stores) (call $test) + (call $test) + (drop + (call $imports) + ) (drop (call $imports) ) (call $arg (i64.const 0) ) + (call $arg + (i64.const 0) + ) + (drop + (call $call1 + (i64.const 0) + ) + ) (drop (call $call1 (i64.const 0) @@ -1664,6 +1678,14 @@ ) ) (drop + (call $call2 + (i64.const 0) + ) + ) + (drop + (call $returnCastConst) + ) + (drop (call $returnCastConst) ) (drop @@ -1673,6 +1695,18 @@ ) ) (drop + (call $ifValue64 + (i64.const 0) + (i64.const 0) + ) + ) + (drop + (call $ifValue32 + (i32.const 0) + (i32.const 0) + ) + ) + (drop (call $ifValue32 (i32.const 0) (i32.const 0) @@ -1683,6 +1717,16 @@ (i64.const 0) ) ) + (drop + (call $switch64 + (i64.const 0) + ) + ) + (call $unreachable_leftovers + (i32.const 0) + (i32.const 0) + (i32.const 0) + ) (call $unreachable_leftovers (i32.const 0) (i32.const 0) |