Mariusz Sikora via llvm-dev
2021-Jul-29 15:42 UTC
[llvm-dev] Inline function not eventually inlined is removed
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20210729/1c394dc6/attachment.html>
David Blaikie via llvm-dev
2021-Jul-30 16:46 UTC
[llvm-dev] Inline function not eventually inlined is removed
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/ 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 >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210730/982977ac/attachment.html>