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

Mariusz Sikora via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 2 10:05:25 PDT 2021


I'm just trying to understand is this _Code_ undefined behavior or this is
a bug in LLVM? Because why LLVM is removing functions without inlining it?
For example GCC is not removing function event after inlining it.

On Fri, Jul 30, 2021 at 7:16 PM Fangrui Song <maskray at google.com> wrote:

> 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
>
>

-- 
Pozdrawiam
Mariusz Sikora
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210802/89b8b1fd/attachment.html>


More information about the llvm-dev mailing list