[llvm-dev] Deleting function IR after codegen

Pete Cooper via llvm-dev llvm-dev at lists.llvm.org
Mon Mar 7 16:44:06 PST 2016


Hi all

After codegen for a given function, the IR should no longer be needed.  In the AsmPrinter we convert from MI->MCInstr, and then we never go back and look at the IR during the MC layer.

I’ve prototyped a simple pass which can be (optionally) scheduled to do just this.  It is added at the end of addPassesToEmitFile.  It is optional so that clang can continue to leak the IR with --disable-free, but i would propose that all other tools, and especially LTO, would enable it.  The savings are 20% of peak memory in LTO of clang itself.

I could attach a patch, but first i’d really like to know if anyone is fundamentally opposed to this.

I should note, a couple of issues have come up in the prototype.
- llvm::getDISubprogram was walking the function body to find the subprogram.  This is trivial to fix as functions now have !dbg on them.
- The AsmPrinter is calling canBeOmittedFromSymbolTable on GlobalValue’s which then walks all their uses.  I think this should be done earlier in codegen as an analysis whose results are available to the AsmPrinter.
- BB’s whose addresses are taken, i.e. jump tables, can’t be deleted.  Those functions will just keep their IR around so no changes there.

With the above issues fixed, I can run make check and pass all the tests.

Comments very welcome.

Cheers,
Pete


More information about the llvm-dev mailing list