1; RUN: opt < %s -inline -S | FileCheck %s
2
3; Check that functions with "returns_twice" calls are only inlined,
4; if they are themselves marked as such.
5
6declare i32 @a() returns_twice
7
8define i32 @inner1() {
9entry:
10  %call = call i32 @a() returns_twice
11  %add = add nsw i32 1, %call
12  ret i32 %add
13}
14
15define i32 @outer1() {
16entry:
17; CHECK-LABEL: define i32 @outer1(
18; CHECK: call i32 @inner1()
19  %call = call i32 @inner1()
20  %add = add nsw i32 1, %call
21  ret i32 %add
22}
23
24define i32 @inner2() returns_twice {
25entry:
26  %call = call i32 @a() returns_twice
27  %add = add nsw i32 1, %call
28  ret i32 %add
29}
30
31define i32 @outer2() {
32entry:
33; CHECK-LABEL: define i32 @outer2(
34; CHECK: call i32 @a()
35  %call = call i32 @inner2() returns_twice
36  %add = add nsw i32 1, %call
37  ret i32 %add
38}
39
40define i32 @inner3() {
41entry:
42  %invoke = invoke i32 @a() returns_twice
43      to label %cont unwind label %lpad
44
45cont:
46  %add = add nsw i32 1, %invoke
47  ret i32 %add
48
49lpad:
50  %lp = landingpad i32 personality i8* null cleanup
51  resume i32 %lp
52}
53
54define i32 @outer3() {
55entry:
56; CHECK-LABEL: define i32 @outer3(
57; CHECK: call i32 @inner3()
58  %call = call i32 @inner3()
59  %add = add nsw i32 1, %call
60  ret i32 %add
61}
62
63define i32 @inner4() returns_twice {
64entry:
65  %invoke = invoke i32 @a() returns_twice
66      to label %cont unwind label %lpad
67
68cont:
69  %add = add nsw i32 1, %invoke
70  ret i32 %add
71
72lpad:
73  %lp = landingpad i32 personality i8* null cleanup
74  resume i32 %lp
75}
76
77define i32 @outer4() {
78entry:
79; CHECK-LABEL: define i32 @outer4(
80; CHECK: invoke i32 @a()
81  %call = call i32 @inner4() returns_twice
82  %add = add nsw i32 1, %call
83  ret i32 %add
84}
85