[PATCH] D12087: always_inline codegen rewrite

Evgenii Stepanov via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 17 14:09:22 PDT 2015


On Mon, Aug 17, 2015 at 1:59 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> On Mon, Aug 17, 2015 at 11:07 AM, Evgeniy Stepanov via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> eugenis created this revision.
>> eugenis added reviewers: chandlerc, rsmith.
>> eugenis added a subscriber: cfe-commits.
>> eugenis set the repository for this revision to rL LLVM.
>>
>> Currently always_inline definitions are emitted as (in most cases) an
>> available_externally llvm function with an alwaysinline attribute.
>
>
> Naive dude missing some context here: How can that ^ be correct?
>
> A basic test case doesn't seem to indicate that that's the case:
>
> __attribute__((always_inline)) void f1() { }
> void f2() { f1(); }
>
> Compile with LLVM optimizations disabled, etc - the bitcode has no mention
> of available_externally in it...

Add "inline" and build as C, not C++.
Yes, not in "most cases". Just sometimes.

>
>
>>
>> This is not exactly right: always_inline functions are NOT available
>> externally, and, for example, libc++ uses this semantics to preserve ABI
>> stability.
>>
>> Emitting an undefined symbol for an always_inline function is always a
>> bug. The current code can still do it in certain cases.
>>  a. Inliner is an SCC pass. It traverses the graph starting from the
>> roots, which are either main() function, or all externally-visible
>> functions. Inlining does not happen in functions that are not reachable.
>>  b. Dead code elimination is not perfect. There are cases where a function
>> will become unreachable due to some late optimizations and will still be
>> emitted into the binary.
>>
>> This patch changes the way always_inline functions are emitted in the
>> Clang codegen to ensure this never happens. A function F is emitted as a
>> pair of
>>  a. internal F.inlinefunction() alwaysinline { **original function body**
>> }
>> and, depending on the function visibility, either
>>  b1. declare F()
>> or
>>  b2. define external F() { musttail call F.inlinefunction() }
>>
>> Frontend ensures that all direct calls go to F.inlinefunction().
>>
>> This provides a simple invariant that all alwaysinline functions are
>> internal, which can be checked in the IR verifier. Another invariant would
>> be that alwaysinline functions never reach the backend.
>>
>> This patch is based on ideas by Chandler Carruth and Richard Smith.
>>
>>
>> Repository:
>>   rL LLVM
>>
>> http://reviews.llvm.org/D12087
>>
>> Files:
>>   lib/CodeGen/CGCXX.cpp
>>   lib/CodeGen/CodeGenModule.cpp
>>   lib/CodeGen/CodeGenModule.h
>>   lib/CodeGen/ItaniumCXXABI.cpp
>>   test/CodeGen/2008-05-19-AlwaysInline.c
>>   test/CodeGen/always-inline.c
>>   test/CodeGen/always_inline.c
>>   test/CodeGen/alwaysinline.c
>>   test/CodeGen/dllimport.c
>>   test/CodeGen/function-attributes.c
>>   test/CodeGen/pr9614.c
>>   test/CodeGenCXX/alwaysinline.cpp
>>   test/CodeGenCXX/dllimport.cpp
>>   test/Frontend/optimization-remark-line-directive.c
>>   test/Frontend/optimization-remark.c
>>   test/Modules/cxx-irgen.cpp
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>


More information about the cfe-commits mailing list