llvm/llvm/test/Transforms/Inline/inline-history-noinline.ll

; RUN: opt -passes=inline -S < %s | FileCheck %s

; This will inline @f1 into @a, causing two new calls to @f2, which will get inlined for two calls to @f1.
; The inline history should stop recursive inlining here, and make sure to mark the inlined calls as noinline so we don't repeat the inlining later on when @a gets inlined into @b.

define internal void @f1(ptr %p) {
  call void %p(ptr @f1)
  ret void
}

define internal void @f2(ptr %p) {
  call void %p(ptr @f2)
  call void %p(ptr @f2)
  ret void
}

define void @b() {
; CHECK-LABEL: define void @b() {
; CHECK-NEXT:    call void @f1(ptr @f2) #[[NOINLINE:[0-9]+]]
; CHECK-NEXT:    call void @f1(ptr @f2) #[[NOINLINE]]
; CHECK-NEXT:    ret void
;
  call void @a()
  ret void
}

define internal void @a() {
  call void @f1(ptr @f2)
  ret void
}

; CHECK: [[NOINLINE]] = { noinline }