[LLVMdev] RFC: ThinLTO Impementation Plan
Duncan P. N. Exon Smith
dexonsmith at apple.com
Fri May 15 14:45:10 PDT 2015
> On 2015-May-15, at 13:06, Teresa Johnson <tejohnson at google.com> wrote:
>
> On Fri, May 15, 2015 at 12:36 PM, Xinliang David Li
> <xinliangli at gmail.com> wrote:
>>
>>
>> On Fri, May 15, 2015 at 12:02 PM, Duncan P. N. Exon Smith
>> <dexonsmith at apple.com> wrote:
>>>
>>>
>>>> On 2015-May-15, at 07:30, Teresa Johnson <tejohnson at google.com> wrote:
>>>>
>>>>>> a. Lazy Debug Metadata Linking:
>>>>>>
>>>>>> The prototype implementation included lazy importing of module-level
>>>>>> metadata during the ThinLTO pass finalization (i.e. after all function
>>>>>> importing is complete). This actually applies to all module-level
>>>>>> metadata, not just debug, although it is the largest. This can be
>>>>>> added as a separate set of patches. Changes to BitcodeReader,
>>>>>> ValueMapper, ModuleLinker
>>>>>
>>>>> It sounds like this would work well with the "full" LTO implemented
>>>>> by tools/gold-plugin right now. What exactly did you do to improve
>>>>> this?
>>>>
>>>> I don't think it will help with full LTO. The parsing of the metadata
>>>> is only delayed until the ThinLTO pass finalization, and the delayed
>>>> metadata import is necessary to avoid reading and linking in the
>>>> metadata multiple times (for each function imported from that module).
>>>> Coming out of the ThinLTO pass you still have all the metadata
>>>> necessary for each function that was imported. For a full LTO that
>>>> would end up being all of the metadata in the module.
>>>>
>>>> The high level summary is that during the initial import it leaves the
>>>> temporary metadata on the instructions that were imported, but saves
>>>> the index used by the bitcode reader used to correlate with the
>>>> metadata when it is ready (i.e. the MDValuePtrs index), and skips the
>>>> metadata parsing. During finalization we parse just the metadata, and
>>>> suture it up during metadata value mapping using the saved index.
>>>
>>> AFAICT, the gold-plugin currently does similar work. (Rafael knows
>>> this code better (I've only introduced bugs there), but IIRC he's on
>>> vacation until next week.) Even in "full" LTO.
>>>
>>> Have a look at `getModuleForFile()` and its calling loop inside
>>> `allSymbolsReadHook()`:
>>>
>>> 1. Load a single module, lazily.
>>> 2. Delete the bodies of unwanted functions (without ever loading them)
>>> and fiddle with linkage as necessary.
>>>
>>> 3. Link in the module.
>>> 4. Delete the module.
>>>
>>> How is what you're proposing different? Does it need to be different?
>>
>>
>> The difference is that for thinLTO, the lazy import happens in backend
>> compilation instead of running at linker plugin time. It is really lazy and
>> imports bare minimal depends on only references from imported functions.
>>
>> Say module B has 1000 functions. Module A only imports 2 function foo1 and
>> foo2 from Module B transitively. The lazy reading will import necessary
>> module level data from B only to satisfy foo1 and foo2.
>
> Right, so there are a couple of differences. As David mentions, we do
> this later and also in an iterative fashion. I.e. it may import
> function foo1 from module B, then in function foo1 see hot calls to
> functions bar1 in module C and bar2 in module D,
How do you know they're hot? Are you selectively reading the profile
metadata?
> importing each of
> those in turn, then later decide to import function foo2 from module
> B. So the BitcodeReader is created and opens a module multiple times.
> Each time we import we create a BitcodeReader, read in what we need,
> create a Module (which contains exactly 1 function), and invoke
> linkInModule, delete the module.
>
> This is in contrast to gold/LTO and the lazy bitcode reader which does
> instantiate the BitcodeReader once per module, and so it can defer
> parsing the metadata until the first function is materialized (at
> which point it parses and materializes all of the metadata). We don't
> want to parse/materialize the metadata until we have completed all
> imports from the module.
>
> The alternative if we wanted to leverage the existing lazy metadata
> parsing support would be to keep the BitcodeReader instantiated for
> each module and not close it until ThinLTO importing finalization. So
> we would have a number of BitcodeReaders active at once (one per
> module we import from). I need to think more about whether this is
> feasible and investigate if this adds a lot of overhead.
>
> The other thing that David alluded to above, that I should call out
> more explicitly in my RFC, is that we only link in the metadata
> transitively reached by the imported functions. This is handled during
> metadata value mapping.
>
> I think I will update the RFC based on some of the discussion so far
> and will send out an updated version early next week.
>
> Thanks,
> Teresa
>
>>
>> David
>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413
More information about the llvm-dev
mailing list