[llvm-dev] [RFC] Propeller: A frame work for Post Link Optimizations

Xinliang David Li via llvm-dev
Fri, 11 Oct 2019 18:25:14 -0000

On Fri, Oct 11, 2019 at 10:46 AM James Y Knight via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Is there large value from deferring the block ordering to link time? That
> is, does the block layout algorithm need to consider global layout issues
> when deciding which blocks to put together and which to relegate to the
> far-away part of the code?
>
> Or, could the propellor-optimized compile step instead split each function
> into only 2 pieces -- one containing an "optimally-ordered" set
of hot
> blocks from the function, and another containing the cold blocks? The
> linker would have less flexibility in placement, but maybe it doesn't
> actually need that flexibility?
>
> Apologies if this is obvious for those who actually know what they're
> talking about here. :)
>

It is a fair question.

We believe the flexibility to do fine grained layout in whole program
context is important. PostLinkOptimization is aimed at getting as much
performance improvement as possible (usually applied on top of
ThinLTO+PGO), so the framework is designed to enable it.

In particular, it allows the linker to stitch hot bb traces from different
functions to be stitched together. It also allows hot trace duplication
across procedure boundaries (kind of interprocedural tailDup). Besides,
code alignment decisions to minimize branch mispredictions  may require
global context (e.g, too conflicting branches residing in two different
functions).  Other micro-arch specific optimizations to improve processor
front-end throughput may also require global context.

It is conceivable to have an option to control the level of granularity at
the possible cost of performance.

thanks,

David



>
> On Wed, Oct 2, 2019 at 6:18 PM Rafael Auler <rafaelauler at fb.com>
wrote:
>
>> You’re correct, except that, in Propeller, CFI duplication happens for
>> every basic block as it operates with the conservative assumption that
a
>> block can be put anywhere by the linker. That’s a significant bloat
that is
>> not cleaned up later. So, during link time, if N blocks from the same
>> function are contiguous in the final layout, as it should happen most
of
>> the time for any sane BB order, we would have several FDEs for a region
>> that only needs one. The bloat goes to the final binary (a lot more
FDEs,
>> specifically, one FDE per basic block).
>>
>> BOLT will only split a function in two parts, and only if it has
profile.
>> Most of the time, a function is not split. It also has an option not to
>> split at all. For internally reordered basic blocks of a given
function, it
>> has CFI deduplication logic (it will interpret and build the CFI states
for
>> each block and rewrite the CFIs in a way that uses the minimum number
of
>> instructions to encode the states for each block).
>>
>>
>>
>> *From: *llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf
of James Y
>> Knight via llvm-dev <llvm-dev at lists.llvm.org>
>> *Reply-To: *James Y Knight <jyknight at google.com>
>> *Date: *Wednesday, October 2, 2019 at 1:59 PM
>> *To: *Maksim Panchenko <maks at fb.com>
>> *Cc: *"llvm-dev at lists.llvm.org" <llvm-dev at
lists.llvm.org>
>> *Subject: *Re: [llvm-dev] [RFC] Propeller: A frame work for Post Link
>> Optimizations
>>
>>
>>
>> I'm a bit confused by this subthread -- doesn't BOLT have the
exact same
>> CFI bloat issue? From my cursory reading of the propellor doc, the CFI
>> duplication is _necessary_ to represent discontiguous functions, not
>> anything particular to the way Propellor happens to generate those
>> discontiguous functions.
>>
>>
>>
>> And emitting discontiguous functions is a fundamental goal of this,
right?
>>
>>
>>
>> On Wed, Oct 2, 2019 at 4:25 PM Maksim Panchenko via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>> Thanks for clarifying. This means once you move to the next basic block
>> (or any other basic
>>
>> block in the function) you have to execute an entirely new set of CFI
>> instructions
>>
>> except for the common CIE part. While indeed this is not as bad, on
>> average, the overall
>>
>> active memory footprint will increase.
>>
>>
>>
>> Creating one FDE per basic block means that .eh_frame_hdr, an
allocatable
>> section,
>>
>> will be bloated too. This will increase the FDE lookup time. I don’t
see
>> .eh_frame_hdr
>>
>> being mentioned in the proposal.
>>
>>
>>
>> Maksim
>>
>>
>>
>> On 10/2/19, 12:20 PM, "Krzysztof Pszeniczny" <kpszeniczny
at google.com>
>> wrote:
>>
>>
>>
>>
>>
>>
>>
>> On Wed, Oct 2, 2019 at 8:41 PM Maksim Panchenko via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>> *Pessimization/overhead for stack unwinding used by system-wide
profilers
>> and
>> for exception handling*
>>
>> Larger CFI programs put an extra burden on unwinding at runtime as more
>> CFI
>> (and thus native) instructions have to be executed. This will cause
more
>> overhead for any profiler that records stack traces, and, as you
>> correctly note
>> in the proposal, for any program that heavily uses exceptions.
>>
>>
>>
>> The number of CFI instructions that have to be executed when unwinding
>> any given stack stays the same. The CFI instructions for a function
have to
>> be duplicated in every basic block section, but when performing
unwinding
>> only one such a set is executed -- the copy for the current basic
block.
>> However, this copy contains precisely the same CFI instructions as the
ones
>> that would have to be executed if there were no basic block sections.
>>
>>
>>
>> --
>>
>> Krzysztof Pszeniczny
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
<https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Ddev&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=kx31RNFp5lAJejEYwuEQ4Zc5A6GakBit07EY08bIAvc&m=-AXqQmc2_r5LuTxyQRxmJESWGU7DLqvYjOlvwJnas_Q&s=h1mfecKZOhD5a1QaEabyI_nHKF81KAXoYRAgR0lNPvM&e=>
>>
>> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20191011/510d69dd/attachment.html>