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>