[llvm-dev] Inline function not eventually inlined is removed

Fangrui Song via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 30 10:15:54 PDT 2021


On 2021-07-30, David Blaikie via llvm-dev wrote:
>You're probably looking for some documentation about C inline semantics:
>https://www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/

Additional notes: I think the -fgnu89-inline & C99 inline semantics were
designed explicitly the way so that vague linkage
(https://itanium-cxx-abi.github.io/cxx-abi/abi/prop-72-comdat.html) can
be avoided. The C inline behaviors are like always explicit
instantiation in C++.

(Seems that GNU has extensions for weak symbols on the a.out binary
format. Otherwise, if a binary format has neither weak symbol nor
COMDAT, vague linkage is not representable.)

>On Fri, Jul 30, 2021 at 9:16 AM Mariusz Sikora via llvm-dev <
>llvm-dev at lists.llvm.org> wrote:
>
>> Hello,
>>
>> I'm trying to understand why LLVM-12 is removing function which is marked
>> inline despite the fact it was not inlined inside caller. Caller function
>> still has a call to inline function and compilation is failing because of a
>> lack of the symbol.
>>
>> Looking at debug logs I see:
>>
>> Inliner visiting SCC: sort: 1 call sites.
>>       Analyzing call of calculate... (caller:sort)
>>       .
>>       Cost: 960
>>       Threshold: 487
>>     NOT Inlining (cost=960, threshold=487), Call:   call void
>> @calculate(i32* %a, i32* %b)
>>
>> Code:
>> int global = 0;
>> void inline calculate(int a[100], int b[100]) {
>>     int i;
>> #pragma unroll
>>     for (i = 0; i < 50; i++) {
>>         a[i] = b[i] + a[i];
>>     }
>> }
>>
>> int sort(int a[100], int b[100]) {
>>     calculate(a, b);
>>     return a[20] + b[30] + global;
>> }
>>
>> cli: clang -O3 -c inline1.c -o inline1_clang.o
>>
>> ll file:
>> ; Function Attrs: nounwind uwtable
>>  define dso_local i32 @sort(i32* %a, i32* %b) local_unnamed_addr #0 {
>> entry:
>>    tail call void @calculate(i32* %a, i32* %b)
>>    %arrayidx = getelementptr inbounds i32, i32* %a, i64 20
>>    %0 = load i32, i32* %arrayidx, align 4, !tbaa !2
>>    %arrayidx1 = getelementptr inbounds i32, i32* %b, i64 30
>>    %1 = load i32, i32* %arrayidx1, align 4, !tbaa !2
>>    %add = add nsw i32 %1, %0
>>    %2 = load i32, i32* @global, align 4, !tbaa !2
>>    %add2 = add nsw i32 %add, %2
>>    ret i32 %add2
>> }
>>
>> ; Function Attrs: inlinehint nounwind uwtable
>>  declare dso_local void @calculate(i32*, i32*) local_unnamed_addr #1
>>
>> Thanks
>> Mariusz Sikora
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>

>_______________________________________________
>LLVM Developers mailing list
>llvm-dev at lists.llvm.org
>https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list