1; RUN: opt -passes=attributor-cgscc -attributor-annotate-decl-cs -attributor-allow-shallow-wrappers -S < %s | FileCheck %s --check-prefix=CHECK 2 3; TEST 1: simple test, without argument 4; A wrapper will be generated for this function, Check the wrapper first 5; CHECK-NOT: Function Attrs: 6; CHECK: define linkonce i32 @inner1() 7; CHECK: tail call i32 @0() 8; CHECK: ret 9; 10; Check the original function, which is wrapped and becomes anonymous 11; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) 12; CHECK: define internal noundef i32 @0() 13; CHECK: ret i32 1 14define linkonce i32 @inner1() { 15entry: 16 %a = alloca i32 17 store i32 1, ptr %a 18 %b = load i32, ptr %a 19 ret i32 %b 20} 21 22; Check for call 23; CHECK: define i32 @outer1 24; CHECK: call i32 @inner1 25; CHECK: ret 26define i32 @outer1() { 27entry: 28 %ret = call i32 @inner1() 29 ret i32 %ret 30} 31 32; TEST 2: with argument 33; CHECK-NOT: Function Attrs 34; CHECK: define linkonce i32 @inner2(i32 %a, i32 %b) 35; CHECK: tail call i32 @1(i32 %a, i32 %b) 36; CHECK: ret 37; 38; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) 39; CHECK: define internal i32 @1(i32 %a, i32 %b) 40; CHECK: %c = add i32 %a, %b 41; CHECK: ret i32 %c 42define linkonce i32 @inner2(i32 %a, i32 %b) { 43entry: 44 %c = add i32 %a, %b 45 ret i32 %c 46} 47 48; CHECK: define i32 @outer2 49; CHECK: call i32 @inner2 50; CHECK: ret 51define i32 @outer2() { 52entry: 53 %ret = call i32 @inner2(i32 1, i32 2) 54 ret i32 %ret 55} 56 57; TEST 3: check nocurse 58; This function calls itself, there will be no attribute 59; CHECK-NOT: Function Attrs 60; CHECK: define linkonce i32 @inner3(i32 %0) 61; CHECK: tail call i32 @2(i32 %0) 62; CHECK: ret 63; 64; CHECK-NOT: Function Attrs: 65; CHECK: define internal i32 @2(i32 %0) 66define linkonce i32 @inner3(i32) { 67entry: 68 %1 = alloca i32 69 store i32 %0, ptr %1 70 br label %2 712: 72 %3 = load i32, ptr %1 73 %4 = icmp slt i32 %3, 4 74 br i1 %4, label %5, label %9 755: 76 %6 = load i32, ptr %1 77 %7 = add nsw i32 %6, 1 78 %8 = call i32 @inner3(i32 %7) 79 store i32 %8, ptr %1 80 br label %2 819: 82 %10 = load i32, ptr %1 83 ret i32 %10 84} 85 86