blob: 5be707bef86552b5665591d48b9df0775513e5c6 [file] [log] [blame] [edit]
; 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 }
;.