; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 5
; RUN: opt < %s -passes=norecurse-lto-inference -S | FileCheck %s

; This test includes a call graph which has a recursive function(foo2) which
; calls a non-recursive internal function (foo3) satisfying the norecurse
; attribute criteria.


define internal void @foo3() {
; CHECK: Function Attrs: norecurse
; CHECK-LABEL: define internal void @foo3(
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT:    ret void
;
  ret void
}

define internal i32 @foo2(i32 %accum, i32 %n) {
; CHECK-LABEL: define internal i32 @foo2(
; CHECK-SAME: i32 [[ACCUM:%.*]], i32 [[N:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*]]:
; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[N]], 0
; CHECK-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[RECURSE:.*]]
; CHECK:       [[RECURSE]]:
; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[N]], 1
; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[ACCUM]], [[SUB]]
; CHECK-NEXT:    [[CALL:%.*]] = call i32 @foo2(i32 [[MUL]], i32 [[SUB]])
; CHECK-NEXT:    call void @foo3()
; CHECK-NEXT:    br label %[[EXIT]]
; CHECK:       [[EXIT]]:
; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ [[ACCUM]], %[[ENTRY]] ], [ [[CALL]], %[[RECURSE]] ]
; CHECK-NEXT:    ret i32 [[RES]]
;
entry:
  %cmp = icmp eq i32 %n, 0
  br i1 %cmp, label %exit, label %recurse

recurse:
  %sub = sub i32 %n, 1
  %mul = mul i32 %accum, %sub
  %call = call i32 @foo2(i32 %mul, i32 %sub)
  call void @foo3()
  br label %exit

exit:
  %res = phi i32 [ %accum, %entry ], [ %call, %recurse ]
  ret i32 %res
}

define internal i32 @foo1() {
; CHECK-LABEL: define internal i32 @foo1() {
; CHECK-NEXT:    [[RES:%.*]] = call i32 @foo2(i32 1, i32 5)
; CHECK-NEXT:    ret i32 [[RES]]
;
  %res = call i32 @foo2(i32 1, i32 5)
  ret i32 %res
}

define dso_local i32 @main() {
; CHECK-LABEL: define dso_local i32 @main() {
; CHECK-NEXT:    [[RES:%.*]] = call i32 @foo1()
; CHECK-NEXT:    ret i32 [[RES]]
;
  %res = call i32 @foo1()
  ret i32 %res
}
;.
; CHECK: attributes #[[ATTR0]] = { norecurse }
;.
