diff options
Diffstat (limited to 'src/passes/StackIR.cpp')
-rw-r--r-- | src/passes/StackIR.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/passes/StackIR.cpp b/src/passes/StackIR.cpp index bbce6bae8..438ed8b55 100644 --- a/src/passes/StackIR.cpp +++ b/src/passes/StackIR.cpp @@ -73,6 +73,7 @@ public: } removeUnneededBlocks(); dce(); + vacuum(); } private: @@ -100,6 +101,22 @@ private: } } + // Remove obviously-unneeded code. + void vacuum() { + // In the wasm binary format a nop is never needed. (In Binaryen IR, in + // comparison, it is necessary e.g. in a function body or an if arm.) + // + // It is especially important to remove nops because we add nops when we + // read wasm into Binaryen IR. That is, this avoids a potential increase in + // code size. + for (Index i = 0; i < insts.size(); i++) { + auto*& inst = insts[i]; + if (inst && inst->origin->is<Nop>()) { + inst = nullptr; + } + } + } + // If ordered properly, we can avoid a local.set/local.get pair, // and use the value directly from the stack, for example // [..produce a value on the stack..] |