[llvm-dev] Question about GlobalOpt

Chandler Carruth via llvm-dev llvm-dev at lists.llvm.org
Mon Mar 28 15:17:15 PDT 2016


The only problem we ran into is that *many* library functions cannot be
deduced as norecurse.

I think to deduce 'main' as norecurse you would need to have language
specific knowledge, but the way the frontend could encode that knowledge
would be to annotate main with the norecurse attribute directly. ;] So that
seems to obviate the need to deduce anything for library functions.

On Tue, Mar 22, 2016 at 12:33 AM Sanjin Sijaric <ssijaric at codeaurora.org>
wrote:

> Hi Mehdi,
>
>
>
> You are right – modifying the Function Attributes pass to mark “main” as
> norecurse would break the C standard (unless it has a similar statement
> regarding “main” that the C++ standard has – I cannot find it), so that’s a
> no-go.  Looks like there was an attempt to bypass library calls in the
> Function Attributes pass for the purpose of detecting norecurse functions:
> http://reviews.llvm.org/D14769.  I’ll look for other threads on this
> topic.
>
>
>
> Thanks,
>
> Sanjin
>
>
>
> *From:* mehdi.amini at apple.com [mailto:mehdi.amini at apple.com]
> *Sent:* Monday, March 21, 2016 4:02 PM
> *To:* Sanjin Sijaric <ssijaric at codeaurora.org>
> *Cc:* LLVM Dev Mailing List <llvm-dev at lists.llvm.org>; Chandler Carruth <
> chandlerc at google.com>; James Molloy <james at jamesmolloy.co.uk>
> *Subject:* Re: [llvm-dev] Question about GlobalOpt
>
>
>
>
>
> On Mar 21, 2016, at 3:57 PM, Sanjin Sijaric via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>
>
> Hi,
>
>
>
> GlobalOpt may not consider demoting globals to locals in the “main”
> function when C is used.   It used to consider “main” specifically prior to
> commit r253168 , for both C and C++.  Since r253168, the check for the
> norecurse attribute may prevent “main” from being considered.  This happens
> because the Function Attributes pass will not add the norecurse attribute
> to functions that have calls to library functions that aren’t themselves
> marked with the norecurse attribute, such as putchar.  Even a call to
> llvm.lifetime.start, for example, will prevent a function from being
> considered as non-recursive as llvm.lifetime.start isn’t marked with the
> “norecurse” attribute.
>
>
>
> We have a C workload that benefits from this demotion with LTO, as some
> hot functions get inlined into main.
>
>
>
> The comment in tools/clang/lib/CodeGen/CodeGenFunctions.cpp explains the
> reason for marking “main” with the norecurse attribute in C++:
>
>
>
> // If we're in C++ mode and the function name is "main", it is guaranteed
>
> // to be norecurse by the standard (3.6.1.3 "The function main shall not be
>
> // used within a program").
>
>
>
> No such restriction exists in the C standard, as far as I can tell.
>
>
>
> This seem to be you problem.
>
>
>
>
>
> Is there anything that can be done to alleviate this restriction in C?
>
>
>
> Except if we had a source-level attribute, or a clang command line flag, I
> don't see how.
>
> Write your main in C++ maybe?
>
>
>
>   Can we make the Function Attributes pass more aggressive, for example?
>
>
>
> Are you suggesting to break C semantics or I misunderstand what you mean?
>
>
>
>
>
> Or mark certain library functions as “norecurse”, although I don’t see how
> this can be guaranteed.
>
>
>
> This is pretty recent and we don't have a good support for libcalls and
> norecurse. I think Chandler found also some conceptual issue to get it to
> work properly.
>
> CC: Chandler+James who probably remember more than I do now.
>
>
>
>
>
> --
>
> Mehdi
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160328/abaf66aa/attachment.html>


More information about the llvm-dev mailing list