[llvm-dev] Inline function not eventually inlined is removed
Mariusz Sikora via llvm-dev
llvm-dev at lists.llvm.org
Thu Jul 29 08:42:20 PDT 2021
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>
More information about the llvm-dev
mailing list