Yesterday, the team behind V8, an open source JavaScript engine, shared the work they with the community have been doing to make LLVM WebAssembly the default backend for Emscripten. LLVM is a compiler framework and Emscripten is an LLVM-to-Web compiler.
🔥 Emscripten is switching to the LLVM WebAssembly backend, resulting in…
➡️ much faster link times
➡️ smaller and faster code
➡️ support for all LLVM IR
➡️ new WebAssembly features
➡️ faster general updates from upstream LLVM
@kripken explains: https://t.co/X7vOaDA37T— V8 (@v8js) July 1, 2019
The LLVM WebAssembly backend will be the third backend in Emscripten. The original compiler was written in JavaScript which used to parse LLVM IR in text form. In 2013, a new backend was written called Fastcomp by forking LLVM, which was designed to emit asm.js. It was a big improvement in code quality and compile times. According to the announcement the LLVM WebAssembly backend beats the old Fastcomp backend on most metrics.
Here are the advantages this backend will come with:
Much faster linking
The LLVM WebAssembly backend will allow incremental compilation using WebAssembly object files. Fastcomp uses LLVM Intermediate Representation (IR) in bitcode files, which means that at the time of linking the IR would be compiled by LLVM. This is why it shows slower link times. On the other hand, WebAssembly object files (.o) already contain compiled WebAssembly code, which accounts for much faster linking.
Faster and smaller code
The new backend shows significant code size reduction as compared to Fastcomp. “We see similar things on real-world codebases that are not in the test suite, for example, BananaBread, a port of the Cube 2 game engine to the Web, shrinks by over 6%, and Doom 3 shrinks by 15%!,” shared the team in the announcement.
The factors that account for the faster and smaller code is that LLVM has better IR optimizations and its backend codegen is smart as it can do things like global value numbering (GVN). Along with that, the team has put their efforts in tuning the Binaryen optimizer which also helps in making the code smaller and faster as compared to Fastcomp.
Support for all LLVM IR
While Fastcomp could handle the LLVM IR generated by clang, it often failed on other sources. On the contrary, the LLVM WebAssembly backend can handle any IR as it uses the common LLVM backend infrastructure.
New WebAssembly features
Fastcomp generates asm.js before running asm2wasm. This makes it difficult to handle new WebAssembly features like tail calls, exceptions, SIMD, and so on. “The WebAssembly backend is the natural place to work on those, and we are in fact working on all of the features just mentioned!,” the team added.
To test the WebAssembly backend you just have to run the following commands:
emsdk install latest-upstream
emsdk activate latest-upstream
Read more in detail on V8’s official website.
Read Next
V8 7.2 Beta releases with support for public class fields, well-formed JSON.stringify, and more
V8 7.5 Beta is now out with WebAssembly implicit caching, bulk memory operations, and more
Google’s V8 7.2 and Chrome 72 gets public class fields syntax; private class fields to come soon