Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / Attributor / wrapper.ll
blobebc27194162211ca9e8dc62112d261ab2b70e2a0
1 ; RUN: opt -passes=attributor-cgscc  -attributor-annotate-decl-cs -attributor-allow-shallow-wrappers -S < %s | FileCheck %s --check-prefix=CHECK
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
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
14 define linkonce i32 @inner1() {
15 entry:
16   %a = alloca i32
17   store i32 1, ptr %a
18   %b = load i32, ptr %a
19   ret i32 %b
22 ; Check for call
23 ; CHECK: define i32 @outer1
24 ; CHECK: call i32 @inner1
25 ; CHECK: ret
26 define i32 @outer1() {
27 entry:
28   %ret = call i32 @inner1()
29   ret i32 %ret
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
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
42 define linkonce i32 @inner2(i32 %a, i32 %b) {
43 entry:
44   %c = add i32 %a, %b
45   ret i32 %c
48 ; CHECK: define i32 @outer2
49 ; CHECK: call i32 @inner2
50 ; CHECK: ret
51 define i32 @outer2() {
52 entry:
53   %ret = call i32 @inner2(i32 1, i32 2)
54   ret i32 %ret
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
64 ; CHECK-NOT: Function Attrs:
65 ; CHECK: define internal i32 @2(i32 %0)
66 define linkonce i32 @inner3(i32) {
67 entry:
68   %1 = alloca i32
69   store i32 %0, ptr %1
70   br label %2
72   %3 = load i32, ptr %1
73   %4 = icmp slt i32 %3, 4
74   br i1 %4, label %5, label %9
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
82   %10 = load i32, ptr %1
83   ret i32 %10