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

Eric Christopher via llvm-dev
Sat, 28 Sep 2019 05:36:30 -0000

On Fri, Sep 27, 2019 at 2:08 PM Sriraman Tallam via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
>
> On Fri, Sep 27, 2019 at 1:16 PM Eli Friedman <efriedma at
quicinc.com> wrote:
> >
> > > -----Original Message-----
> > > From: Sriraman Tallam <tmsriram at google.com>
> > > Sent: Friday, September 27, 2019 9:43 AM
> > > To: Eli Friedman <efriedma at quicinc.com>
> > > Cc: Xinliang David Li <xinliangli at gmail.com>; llvm-dev
<llvm-dev at lists.llvm.org>
> > > Subject: [EXT] Re: [llvm-dev] [RFC] Propeller: A frame work for
Post Link
> > > Optimizations
> > >
> > > >
> > > > > > Why are you proposing to add a bunch of options to
clang to manipulate
> > > LLVM
> > > > > code generation, given none of those options are
actually used for Propeller
> > > > > workflows?
> > > > >
> > > > > Where do you suggest labelling and section options
should exist?  We
> > > > > looked at  basic block sections to be similar to
function sections in
> > > > > terms of option handling?
> > > >
> > > > Generating bitcode with/without propeller doesn't
actually affect the
> > > generated bitcode, right?  So you could say that Propeller is
enabled with "-Wl,--
> > > enable-propeller", and not change clang at all.  I'm not
a fan of adding options
> > > just because we can.  If basic block sections are only used as a
sort of secret
> > > handshake between the propeller compiler and the propeller
linker, we can
> > > change that interface later, if we want; if we expose it as a
clang option, we're
> > > committing to making basic block sections continue to work the
same way until
> > > the end of time.
> > >
> > > The generated MIR code is slightly different as the later passes
have
> > > more CFI instructions, basic block labels and extra direct jumps
which
> > > would have been fall throughs otherwise.  So, some llvm option is
> > > needed.
> >
> > At link (LTO codegen) time, yes.  But clang's bitcode generation
doesn't change; only LTO code generation in lld changes.
>
> I see what you mean here.
>
> >
> > > I envisioned that basic block sections could also be useful on
its own
> > > outside of propeller.   Hence, we made it like function-sections
with
> > > a separate option -fbasicblock-sections.  The propeller option is
an
> > > umbrella option to make it easy to invoke Propeller.
> >
> > I don't think this is really true.  Basic block labels means
"insert labels that are useful for propeller profiling", and basic
block sections means "split the function into multiple chunks that are
convenient for propeller optimization".  So it's really only useful for
propeller-like workflows.  And I'd be concerned that future changes to
propeller could affect the behavior of these options in the future, if the
behavior isn't specified in some rigorous way.
>
> The idea of basic block sections was seeded by Rui Ueyama.  When basic
> block sections was originally looked at, Propeller was not designed.
> We looked at basic block sections as finer granularity than function
> sections.  Section prefix based code layout where you just create
> smaller code sections and let the linker do what it does today would
> have much better results with basic block sections.  Symbol ordering
> file with basic block sections to do random orderings can be done
> without invoking Propeller.  Function sections has found uses after it
> was invented like Identical Code Folding.
>

I'm not sure that function sections are entirely an apt comparison
here for a few reasons:

 - function sections mostly gave an easy way to do ICF - using MIR or
LLVM IR are also fairly effective means as is just using the linker to
compare bytes. Using function sections can still run into language
specific problems as well, hence why icf=safe vs icf=all. Though pcc's
recent work helps out a little bit via significant address
determination in the front end
 - order files and other similar mechanisms work based on externally
visible symbols and are fairly straightforward to use in an ABI safe
way (no function -> function fallthrough for example)
 - basic block sections can run into the multiple entry point problems
depending on how they're laid out as well as other ABI and visibility
issues

This can likely be done safely, but there are definitely some concerns
here with how you want to enable the use of basic block
labels/sections.

-eric


> >
> > In any case, if we're adding flags to clang other than
"enable propeller", I think we should have a separate thread on
cfe-dev to discuss them. We don't expose every possible LLVM optimization
and code generation option through clang. Users have a strong expectation of
stability for clang options, and that means we need to evaluate each new option
carefully, to decide whether it's something we really want to support
indefinitely.
>
> Understood.
>
> Thanks
> Sri
>
> >
> > -Eli
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev