[RS4GC] Fix rematerialization of bitcast of bitcast.
[oota-llvm.git] / test / Transforms / Inline / inline_returns_twice.ll
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
6 declare i32 @a() returns_twice
7
8 define i32 @inner1() {
9 entry:
10   %call = call i32 @a() returns_twice
11   %add = add nsw i32 1, %call
12   ret i32 %add
13 }
14
15 define i32 @outer1() {
16 entry:
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
24 define i32 @inner2() returns_twice {
25 entry:
26   %call = call i32 @a() returns_twice
27   %add = add nsw i32 1, %call
28   ret i32 %add
29 }
30
31 define i32 @outer2() {
32 entry:
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
40 define i32 @inner3() personality i8* null {
41 entry:
42   %invoke = invoke i32 @a() returns_twice
43       to label %cont unwind label %lpad
44
45 cont:
46   %add = add nsw i32 1, %invoke
47   ret i32 %add
48
49 lpad:
50   %lp = landingpad i32 cleanup
51   resume i32 %lp
52 }
53
54 define i32 @outer3() {
55 entry:
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
63 define i32 @inner4() returns_twice personality i8* null {
64 entry:
65   %invoke = invoke i32 @a() returns_twice
66       to label %cont unwind label %lpad
67
68 cont:
69   %add = add nsw i32 1, %invoke
70   ret i32 %add
71
72 lpad:
73   %lp = landingpad i32 cleanup
74   resume i32 %lp
75 }
76
77 define i32 @outer4() {
78 entry:
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 }