[LLVMdev] RFC: PerfGuide for frontend authors
Philip Reames
listmail at philipreames.com
Wed Mar 4 23:37:21 PST 2015
On 03/04/2015 07:50 PM, Sean Silva wrote:
>
>
> On Fri, Feb 27, 2015 at 9:25 PM, Philip Reames
> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>
>
> > On Feb 27, 2015, at 3:58 PM, Hal Finkel <hfinkel at anl.gov
> <mailto:hfinkel at anl.gov>> wrote:
> >
> > ----- Original Message -----
> >> From: "Philip Reames" <listmail at philipreames.com
> <mailto:listmail at philipreames.com>>
> >> To: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu
> <mailto:llvmdev at cs.uiuc.edu>>
> >> Sent: Friday, February 27, 2015 5:34:36 PM
> >> Subject: Re: [LLVMdev] RFC: PerfGuide for frontend authors
> >>
> >> The first version of this document is now live:
> >> http://llvm.org/docs/Frontend/PerformanceTips.html
> >>
> >> Please feel free to add to it directly. Alternatively, feel free to
> >> reply to this thread with text describing an issue that should be
> >> documented. I'll make sure text gets turned into patches.
> >
> > First, thanks for working on this! Some things (perhaps) worth
> mentioning:
> I'll add these Monday, but am not going to take the time to write
> much. Any expansion you (or anyone else) want to do would be welcome
>
> >
> > 1. Make sure that a DataLayout is provided (this will likely
> become required in the near future, but is certainly important for
> optimization).
> >
> > 2. Add nsw/nuw/fast-math flags as appropriate
> >
> > 3. Add noalias/align/dereferenceable/nonnull to function
> arguments and return values as appropriate
> I was thinking of a more general: use metadata and function
> attributes.
>
> I don't want to end up duplicating content from the Lang ref
> here. I was thinking that this page should cover the things you
> can't learn by just reading langref.
>
>
> You can use links to langref if necessary. The audience of this
> document is people looking for how to generate code that will optimize
> well. We should bring to their attention any relevant features.
>
> LangRef has a very low density for people looking for how to generate
> code that will optimize well, and I consider it unreasonable to expect
> them to trawl through it just to pick out a couple small morsels that
> you are already aware of and can direct them to.
>
> Regardless, I think there is more to say about these
> attributes/metadata than LangRef provides. E.g., LangRef doesn't
> provide a clear picture of what transformations these things enable,
> how profitable they can be, and what sort of code they trigger on. For
> example, a frontend author may be able to get information from their
> frontend to add noalias, but doing so will require some nontrivial
> changes to their frontend (and/or slow it down): is it worth it for
> them to take the time to change their frontend? In order to make this
> decision, we need to provide them with the information they need to
> estimate the benefit noalias will bring them. Of course, it's
> impossible to predict the exact benefit, but we should provide enough
> information to allow the frontend author to at least prioritize the
> order in which they investigate using each of these features.
I'm going to take a shot at such a section eventually, but it's my
lowest priority item on this documentation. If you want to propose a
patch, please feel free.
My initial sketch would be:
Use metadata/attributes!
- topic - dereferenceability (i.e. deref, deref_or_null, deref.load!)
(The last two don't exist yet!)
- topic - aliasing properties (noalias, etc..)
- subtopic - invariant
- subtopic - tbaa
- topic - value properties (range, non-null)
The focus would be on linking to right sections in LangRef and
discussing profitability. I don't want to duplicate syntax or API docs.
>
> -- Sean Silva
>
>
> >
> > 4. Mark functions as readnone/readonly/nounwind when known
> (especially for external functions)
> >
> > 5. Use ptrtoint/inttoptr sparingly (they interfere with pointer
> aliasing analysis), prefer GEPs
> >
> > 6. Use the lifetime.start/lifetime.end and
> invariant.start/invariant.end intrinsics where possible
> Do you find these help in practice? The few experiments I ran
> were neutral at best and harmful in one or two cases. Do you have
> suggestions on how and when to use them?
>
> I am using invariant.load, tbaas is constant flag, and a custom
> hook for zero initialized memory from my allocation routines.
> >
> > 7. Use pointer aliasing metadata, especially tbaa metadata, to
> communicate otherwise-non-deducible pointer aliasing facts
> >
> > 8. Use the "most-private" possible linkage types for the
> functions being defined (private, internal or linkonce_odr preferably)
> >
> > -Hal
> >
> >>
> >> Philip
> >>
> >>> On 02/23/2015 04:46 PM, Philip Reames wrote:
> >>> I'd like to propose that we create a new Performance Guide
> >>> document.
> >>> The target of this document will be frontend authors, not
> >>> necessarily
> >>> LLVM contributors. The content will be a collection of items a
> >>> frontend author might want to know about how to generate LLVM IR
> >>> which
> >>> will optimize well.
> >>>
> >>> Some ideas on topics that might be worthwhile:
> >>> - Prefer sext over zext when value is known to be positive in the
> >>> language (e.g. range checked index on a GEP)
> >>> - Avoid loading and storing first class aggregates (i.e. they're
> >>> not
> >>> well supported in the optimizer)
> >>> - Mark invariant locations - i.e. link to !invariant.load and TBAA
> >>> constant flags
> >>> - Use globals not inttoptr for runtime structures - this gives you
> >>> dereferenceability information
> >>> - Use function attributes where possible (nonnull, deref, etc..)
> >>> - Be ware of ordered and atomic memory operations (not well
> >>> optimized), depending on source language, might be faster to use
> >>> fences.
> >>> - Range checks - make sure you test with the IRCE pass
> >>>
> >>> If folks are happy with the idea of having such a document, I
> >>> volunteer to create version 0.1 with one or two items. After
> that,
> >>> we
> >>> can add to it as folks encounter ideas. The initial content will
> >>> be
> >>> fairly minimal, I just want a link I can send to folks in reviews
> >>> to
> >>> record comments made. :)
> >>>
> >>> Philip
> >>> _______________________________________________
> >>> LLVM Developers mailing list
> >>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
> http://llvm.cs.uiuc.edu
> >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >>
> >> _______________________________________________
> >> LLVM Developers mailing list
> >> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
> http://llvm.cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
> > --
> > Hal Finkel
> > Assistant Computational Scientist
> > Leadership Computing Facility
> > Argonne National Laboratory
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
> http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150304/ccf90155/attachment.html>
More information about the llvm-dev
mailing list