[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