70 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 52; RUN: opt < %s -passes=norecurse-lto-inference -S | FileCheck %s3 4; This test includes a call graph which has a recursive function(foo2) which5; calls a non-recursive internal function (foo3) satisfying the norecurse6; attribute criteria.7 8 9define internal void @foo3() {10; CHECK: Function Attrs: norecurse11; CHECK-LABEL: define internal void @foo3(12; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {13; CHECK-NEXT: ret void14;15 ret void16}17 18define internal i32 @foo2(i32 %accum, i32 %n) {19; CHECK-LABEL: define internal i32 @foo2(20; CHECK-SAME: i32 [[ACCUM:%.*]], i32 [[N:%.*]]) {21; CHECK-NEXT: [[ENTRY:.*]]:22; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[N]], 023; CHECK-NEXT: br i1 [[CMP]], label %[[EXIT:.*]], label %[[RECURSE:.*]]24; CHECK: [[RECURSE]]:25; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[N]], 126; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[ACCUM]], [[SUB]]27; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo2(i32 [[MUL]], i32 [[SUB]])28; CHECK-NEXT: call void @foo3()29; CHECK-NEXT: br label %[[EXIT]]30; CHECK: [[EXIT]]:31; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[ACCUM]], %[[ENTRY]] ], [ [[CALL]], %[[RECURSE]] ]32; CHECK-NEXT: ret i32 [[RES]]33;34entry:35 %cmp = icmp eq i32 %n, 036 br i1 %cmp, label %exit, label %recurse37 38recurse:39 %sub = sub i32 %n, 140 %mul = mul i32 %accum, %sub41 %call = call i32 @foo2(i32 %mul, i32 %sub)42 call void @foo3()43 br label %exit44 45exit:46 %res = phi i32 [ %accum, %entry ], [ %call, %recurse ]47 ret i32 %res48}49 50define internal i32 @foo1() {51; CHECK-LABEL: define internal i32 @foo1() {52; CHECK-NEXT: [[RES:%.*]] = call i32 @foo2(i32 1, i32 5)53; CHECK-NEXT: ret i32 [[RES]]54;55 %res = call i32 @foo2(i32 1, i32 5)56 ret i32 %res57}58 59define dso_local i32 @main() {60; CHECK-LABEL: define dso_local i32 @main() {61; CHECK-NEXT: [[RES:%.*]] = call i32 @foo1()62; CHECK-NEXT: ret i32 [[RES]]63;64 %res = call i32 @foo1()65 ret i32 %res66}67;.68; CHECK: attributes #[[ATTR0]] = { norecurse }69;.70