[llvm-dev] [PATCH] D14227: Add a new attribute: norecurse
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Thu Nov 5 07:54:43 PST 2015
----- Original Message -----
> From: "James Molloy via llvm-dev" <llvm-dev at lists.llvm.org>
> To: "Philip Reames" <listmail at philipreames.com>,
> reviews+D14227+public+6a20206dc9791b02 at reviews.llvm.org, "James
> Molloy" <james.molloy at arm.com>, "manman ren" <manman.ren at gmail.com>,
> dexonsmith at apple.com, "mehdi amini" <mehdi.amini at apple.com>, "LLVM
> Dev" <llvm-dev at lists.llvm.org>
> Cc: "LLVM Commits" <llvm-commits at lists.llvm.org>
> Sent: Thursday, November 5, 2015 9:44:45 AM
> Subject: Re: [llvm-dev] [PATCH] D14227: Add a new attribute:
> norecurse
> [Adding llvm-dev and re-stating the situation for llvm-dev's benefit]
> RFC: A new attribute, "norecurse".
> In some cases, it is possible to demote global variables to local
> variables. This is possible when the global is only used in one
> function, and that function is known not to recurse (because if the
> function recurses, a local variable cannot be equivalent to a global
> as the global would hold state over the recursive call).
> GlobalOpt has this ability already, however it is currently (a) weak
> and (b) broken.
> GlobalOpt has a special case for the function "main". It assumes that
> any function called "main" with external linkage is by definition
> non-recursive. It does this because in C++, main is defined by the
> standard not to recurse. However, this is not the case in C, so
> GlobalOpt will happily break C code.
> GlobalOpt also currently won't even attempt to discover functions
> that don't recurse - it only checks "main".
> What I'd like to do is improve GlobalOpt to be more aggressive with
> demoting globals to locals, and to do that I need to teach it which
> functions are known to be non-recursive. At the same time I'd really
> like to fix the "main" kludge.
> There are three options I see:
> 1. Just use an analysis pass to infer non-recursiveness as a
> property. This can be a simple SCC pass which is queried by
> GlobalOpt.
> 2. Add an attribute, "norecurse". This would be inferred just like
> above by FunctionAttrs in the general case, but it also allows
> frontends to add the attribute if they have specific knowledge - for
> example "main" in C++ mode.
> 3. (1), but use metadata to add the non-recursiveness information in
> the frontend, to solve the "main" problem.
> What I'm suggesting here is (2).
+1
This is a very generic property, and I'm happy with the conciseness provided by an attribute.
-Hal
> I have no real problem implementing (3) instead, and I think it's
> something that's worthwhile discussing. Adding new metadata is very
> cheap and easy and doesn't seem to have many downsides as an option.
> Hopefully I've described the problem and potential solutions well
> enough - what are peoples' thoughts? I quite like the attribute
> solution best, but I'd be happy with anything that moves us forward.
> Cheers,
> James
> On Wed, 4 Nov 2015 at 17:46 Philip Reames via llvm-commits <
> llvm-commits at lists.llvm.org > wrote:
> > This should probably be raised on llvm-dev for boarder visibility.
>
> > Side question: What optimizations or codegen opportunities does
> > this
> > enable? i.e. what's the actual use case?
>
> > On 11/02/2015 05:03 AM, James Molloy via llvm-commits wrote:
>
> > > jmolloy created this revision.
> >
>
> > > jmolloy added reviewers: manmanren, dexonsmith, joker.eph.
> >
>
> > > jmolloy added a subscriber: llvm-commits.
> >
>
> > > jmolloy set the repository for this revision to rL LLVM.
> >
>
> > > This attribute allows the compiler to assume that the function
> > > never
> > > recurses into itself, either directly or indirectly
> > > (transitively).
> > > This can be used among other things to demote global variables to
> > > locals.
> >
>
> > > The norecurse attribute indicates that the function does not call
> > > itself either directly or indirectly down any possible call path.
> >
>
> > > Repository:
> >
>
> > > rL LLVM http://reviews.llvm.org/D14227 Files:
> >
>
> > > docs/LangRef.rst
> >
>
> > > include/llvm/Bitcode/LLVMBitCodes.h
> >
>
> > > include/llvm/IR/Attributes.h
> >
>
> > > include/llvm/IR/Function.h
> >
>
> > > lib/AsmParser/LLLexer.cpp
> >
>
> > > lib/AsmParser/LLParser.cpp
> >
>
> > > lib/AsmParser/LLToken.h
> >
>
> > > lib/Bitcode/Reader/BitcodeReader.cpp
> >
>
> > > lib/Bitcode/Writer/BitcodeWriter.cpp
> >
>
> > > lib/IR/Attributes.cpp
> >
>
> > > lib/IR/Verifier.cpp
> >
>
> > > test/Bindings/llvm-c/invalid-bitcode.test
> >
>
> > > test/Bitcode/attributes.ll
> >
>
> > > test/Bitcode/compatibility.ll
> >
>
> > > test/Bitcode/invalid.ll
> >
>
> > > test/LTO/X86/invalid.ll
> >
>
> > > _______________________________________________
> >
>
> > > llvm-commits mailing list llvm-commits at lists.llvm.org
> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >
>
> > _______________________________________________
>
> > llvm-commits mailing list
>
> > llvm-commits at lists.llvm.org
>
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151105/d39f9c31/attachment.html>
More information about the llvm-dev
mailing list