[llvm-dev] Status of the function merging pass?

Nikita Popov via llvm-dev llvm-dev at lists.llvm.org
Thu Jan 31 13:46:28 PST 2019

On Thu, Jan 31, 2019 at 8:52 PM Vedant Kumar <vsk at apple.com> wrote:

> Hi,
> I'm interested in finding ways to reduce code size. LLVM's MergeFunctions
> pass seems like a promising option, and I'm curious about its status in
> tree.
> Enabling MergeFunctions gives a 1% code size reduction across the entire
> iOS shared cache (a collection of a few hundred system-critical DSO's). The
> numbers are even more compelling for Swift code. In fact, the swift
> compiler enables MergeFunctions by default when optimizing, along with an
> even more aggressive merging pass which handles
> equivalence-modulo-constant-uses (
> https://github.com/apple/swift/blob/master/lib/LLVMPasses/LLVMMergeFunctions.cpp
> ).
> Is anyone actively working on enabling MergeFunctions in LLVM's default
> pipelines? Is there a roadmap for doing so?
> ISTM that preventing miscompiles when merging functions is a serious,
> unsolved problem. I.e., it's hard for the MergeFunctions pass to be *really
> sure* that two functions are a) really identical and b) safe to merge.
> Is there a systematic solution at the IR-level, given that the semantics
> of IR are subject to change? Is extensive testing the only solution? Or is
> this intractable, and the only safe approach is to perform merging
> post-regalloc (or, at some late point when equivalence is easier to
> determine)?

In Rust we've been running with MergeFunctions enabled by default for a
while now, and have recently also enabled the use of aliases instead of
thunks. Apart from some initial bugs we didn't encounter any significant
issues (one minor issue with NVPTX not supporting aliases and having CC

As Rust tends to be quite heavy on monomorphization, MergeFuncs can give
significant binary size reductions. I don't have any comprehensive numbers,
but from checking this on a pet project just now, it reduces final artifact
size by 13% and I've seen some similar numbers in the ~10% range quoted

So, at least for Rust's use case this pass seems to be both quite robust
and useful :)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190131/d3677c20/attachment.html>

More information about the llvm-dev mailing list