<div dir="ltr">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.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 30, 2021 at 7:16 PM Fangrui Song <<a href="mailto:maskray@google.com">maskray@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2021-07-30, David Blaikie via llvm-dev wrote:<br>
>You're probably looking for some documentation about C inline semantics:<br>
><a href="https://www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/" rel="noreferrer" target="_blank">https://www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/</a><br>
<br>
Additional notes: I think the -fgnu89-inline & C99 inline semantics were<br>
designed explicitly the way so that vague linkage<br>
(<a href="https://itanium-cxx-abi.github.io/cxx-abi/abi/prop-72-comdat.html" rel="noreferrer" target="_blank">https://itanium-cxx-abi.github.io/cxx-abi/abi/prop-72-comdat.html</a>) can<br>
be avoided. The C inline behaviors are like always explicit<br>
instantiation in C++.<br>
<br>
(Seems that GNU has extensions for weak symbols on the a.out binary<br>
format. Otherwise, if a binary format has neither weak symbol nor<br>
COMDAT, vague linkage is not representable.)<br>
<br>
>On Fri, Jul 30, 2021 at 9:16 AM Mariusz Sikora via llvm-dev <<br>
><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
>> Hello,<br>
>><br>
>> I'm trying to understand why LLVM-12 is removing function which is marked<br>
>> inline despite the fact it was not inlined inside caller. Caller function<br>
>> still has a call to inline function and compilation is failing because of a<br>
>> lack of the symbol.<br>
>><br>
>> Looking at debug logs I see:<br>
>><br>
>> Inliner visiting SCC: sort: 1 call sites.<br>
>>       Analyzing call of calculate... (caller:sort)<br>
>>       .<br>
>>       Cost: 960<br>
>>       Threshold: 487<br>
>>     NOT Inlining (cost=960, threshold=487), Call:   call void<br>
>> @calculate(i32* %a, i32* %b)<br>
>><br>
>> Code:<br>
>> int global = 0;<br>
>> void inline calculate(int a[100], int b[100]) {<br>
>>     int i;<br>
>> #pragma unroll<br>
>>     for (i = 0; i < 50; i++) {<br>
>>         a[i] = b[i] + a[i];<br>
>>     }<br>
>> }<br>
>><br>
>> int sort(int a[100], int b[100]) {<br>
>>     calculate(a, b);<br>
>>     return a[20] + b[30] + global;<br>
>> }<br>
>><br>
>> cli: clang -O3 -c inline1.c -o inline1_clang.o<br>
>><br>
>> ll file:<br>
>> ; Function Attrs: nounwind uwtable<br>
>>  define dso_local i32 @sort(i32* %a, i32* %b) local_unnamed_addr #0 {<br>
>> entry:<br>
>>    tail call void @calculate(i32* %a, i32* %b)<br>
>>    %arrayidx = getelementptr inbounds i32, i32* %a, i64 20<br>
>>    %0 = load i32, i32* %arrayidx, align 4, !tbaa !2<br>
>>    %arrayidx1 = getelementptr inbounds i32, i32* %b, i64 30<br>
>>    %1 = load i32, i32* %arrayidx1, align 4, !tbaa !2<br>
>>    %add = add nsw i32 %1, %0<br>
>>    %2 = load i32, i32* @global, align 4, !tbaa !2<br>
>>    %add2 = add nsw i32 %add, %2<br>
>>    ret i32 %add2<br>
>> }<br>
>><br>
>> ; Function Attrs: inlinehint nounwind uwtable<br>
>>  declare dso_local void @calculate(i32*, i32*) local_unnamed_addr #1<br>
>><br>
>> Thanks<br>
>> Mariusz Sikora<br>
>> _______________________________________________<br>
>> LLVM Developers mailing list<br>
>> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
>> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>><br>
<br>
>_______________________________________________<br>
>LLVM Developers mailing list<br>
><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Pozdrawiam<div>Mariusz Sikora</div></div>