Matching up inlined basic blocks with original basic blocks.

Hello All,

I have some data tied to the basic blocks in a function, and after inlining that function, I’d like to recover that data in the inlined version. Is there some way to match up the inlined version of the function with the original basic blocks?

Thanks,

Jeremy

See the code in CloneFunctionInto and CloneAndPruneFunctionInto. This is
what does the actual inlining. You can see how that code tracks the basic
blocks after inlining.

Honestly, the right way to do this architecturally is for us to support
metadata attached to basic blocks (if we don't already?) and then for the
inliner to preserve it when inlining. Then you could use metadata as a
container for your data.

From: "Chandler Carruth" <chandlerc@google.com>
To: "Jeremy Salwen" <jeremysalwen@gmail.com>
Cc: "llvmdev" <llvmdev@cs.uiuc.edu>
Sent: Sunday, August 3, 2014 9:18:38 PM
Subject: Re: [LLVMdev] Matching up inlined basic blocks with original basic blocks.

Hello All,

I have some data tied to the basic blocks in a function, and after
inlining that function, I'd like to recover that data in the inlined
version. Is there some way to match up the inlined version of the
function with the original basic blocks?
See the code in CloneFunctionInto and CloneAndPruneFunctionInto. This
is what does the actual inlining. You can see how that code tracks
the basic blocks after inlining.

Honestly, the right way to do this architecturally is for us to
support metadata attached to basic blocks (if we don't already?) and
then for the inliner to preserve it when inlining. Then you could
use metadata as a container for your data.

We don't currently support metadata on basic blocks. There was a patch for this some time ago, http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120507/142379.html.

-Hal

Hi Chandler,

It seems that both functions use a VMap argument in which they create a map from old values to their cloned copies. This would work great, however, when I look in InlineFunction() (InlineFunction.cpp line 794), the VMap seems to be hidden from the caller, and there is an explicit comment “Scope to destroy VMap after cloning”.

Is InlineFunction() the wrong entry point for inlining a function? Or do I need to create a modified version that exposes the VMap?

Thanks,
Jeremy