<div dir="ltr"><div>The PNaCl project has implemented various IR simplification passes that simplify LLVM IR by lowering complex features to simpler features.  We'd like to upstream some of these IR passes to LLVM.  We'd like to explore if this acceptable, and if so, how we should go about doing this.</div>
<div><br></div><div>The immediate reason is that Emscripten is reusing PNaCl's IR passes for its new "fastcomp" backend [1].  It would be really useful if PNaCl and Emscripten could collaborate via upstream LLVM rather than a branch.</div>
<div><br></div><div>Some background:  There are two related use cases for these IR simplification passes:</div><div><br></div><div> 1) Simplifying the task of writing a new LLVM backend.  This is Emscripten's use case.  The IR simplification passes reduce the number of cases a backend has to handle, so they would be useful for anyone else creating a new backend.</div>
<div><br></div><div> 2) Using a subset of LLVM IR as a stable distribution format for portable executables.  This is PNaCl's use case.  PNaCl's IR subset omits various complex IR features, which we lower using the IR simplification passes [2].  Renderscript is an example of another project that uses IR as a stable distribution format, though I think currently Renderscript is not subsetting IR much.</div>
<div><br></div><div>Some examples of PNaCl's IR simplification passes are:</div><div><br></div><div> * Calling conventions lowering:  ExpandVarArgs and ExpandByVal lower varargs and by-value argument passing respectively.  They would be useful for any backend that doesn't want to implement varargs or by-value calling conventions.</div>
<div><br></div><div> * Instruction-level lowering:</div><div>    * ExpandStructRegs splits up struct values into scalars, removing the "insertvalue" and "extractvalue" instructions.</div><div>    * PromoteIntegers legalizes integer types (e.g. i30 is converted to i32).</div>
<div><br></div><div> * Module-level lowering:  This implements, at the IR level, functionality that is traditionally provided by "ld".  e.g. ExpandCtors lowers llvm.global_ctors to the __init_array_start and __init_array_end symbols that are used by C libraries at startup.</div>
<div><br></div><div>PNaCl's IR simplification passes are modular -- most are independent of each other -- so they allow projects to pick and choose which IR features to support and which to pre-lower.  The modularity of these passes makes them low-maintenance and easy to write targeted tests for.</div>
<div><br></div><div>The code for these passes can be found here:</div><div><a href="https://chromium.googlesource.com/native_client/pnacl-llvm/+/master/lib/Transforms/NaCl/">https://chromium.googlesource.com/native_client/pnacl-llvm/+/master/lib/Transforms/NaCl/</a></div>
<div><br></div><div>There seems to be plenty of precedent for IR-to-IR lowering passes -- LLVM already contains passes such as LowerInvoke, LowerSwitch and LowerAtomic.</div><div><br></div><div>The PNaCl team (which I'm a member of) is happy to take on the work of maintaining this code, such as updating it as LLVM IR evolves and doing code reviews.  We would upstream this gradually, pass by pass, so the changes would be manageable.</div>
<div><br></div><div>Cheers,</div><div>Mark</div><div><br></div><div>[1] <a href="https://github.com/kripken/emscripten/wiki/LLVM-Backend">https://github.com/kripken/emscripten/wiki/LLVM-Backend</a></div><div>[2] <a href="https://groups.google.com/forum/#!topic/llvm-dev/lk6dZzwW0ls">https://groups.google.com/forum/#!topic/llvm-dev/lk6dZzwW0ls</a> - PNaCl Bitcode reference manual</div>
<div><br></div></div>