[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