Teach the inliner to track deoptimization state
[oota-llvm.git] / test / Transforms / Inline / deopt-bundles.ll
1 ; RUN: opt -S -always-inline < %s | FileCheck %s
2
3 declare void @f()
4 declare i32 @g()
5
6 define i32 @callee_0() alwaysinline {
7  entry:
8   call void @f()
9   ret i32 2
10 }
11
12 define i32 @caller_0() {
13 ; CHECK-LABEL: @caller_0(
14  entry:
15 ; CHECK: entry:
16 ; CHECK-NEXT: call void @f()
17 ; CHECK-NEXT: ret i32 2
18   %x = call i32 @callee_0() [ "deopt"(i32 5) ]
19   ret i32 %x
20 }
21
22 define i32 @callee_1() alwaysinline {
23  entry:
24   call void @f() [ "deopt"() ]
25   call void @f() [ "deopt"(i32 0, i32 1) ]
26   call void @f() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]
27   ret i32 2
28 }
29
30 define i32 @caller_1() {
31 ; CHECK-LABEL: @caller_1(
32  entry:
33 ; CHECK: entry:
34 ; CHECK-NEXT:  call void @f() [ "deopt"(i32 5) ]
35 ; CHECK-NEXT:  call void @f() [ "deopt"(i32 5, i32 0, i32 1) ]
36 ; CHECK-NEXT:  call void @f() [ "deopt"(i32 5, i32 0, i32 1), "foo"(double 0.000000e+00) ]
37 ; CHECK-NEXT:  ret i32 2
38
39   %x = call i32 @callee_1() [ "deopt"(i32 5) ]
40   ret i32 %x
41 }
42
43 define i32 @callee_2() alwaysinline {
44  entry:
45   %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]
46   ret i32 %v
47 }
48
49 define i32 @caller_2(i32 %val) {
50 ; CHECK-LABEL: @caller_2(
51  entry:
52 ; CHECK: entry:
53 ; CHECK-NEXT:   [[RVAL:%[^ ]+]] = call i32 @g() [ "deopt"(i32 %val, i32 0, i32 1), "foo"(double 0.000000e+00) ]
54 ; CHECK-NEXT:   ret i32 [[RVAL]]
55   %x = call i32 @callee_2() [ "deopt"(i32 %val) ]
56   ret i32 %x
57 }
58
59 define i32 @callee_3() alwaysinline {
60  entry:
61   %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]
62   ret i32 %v
63 }
64
65 define i32 @caller_3() personality i8 3 {
66 ; CHECK-LABEL: @caller_3(
67  entry:
68   %x = invoke i32 @callee_3() [ "deopt"(i32 7) ] to label %normal unwind label %unwind
69 ; CHECK: invoke i32 @g() [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]
70
71  normal:
72   ret i32 %x
73
74  unwind:
75   %cleanup = landingpad i8 cleanup
76   ret i32 101
77 }
78
79 define i32 @callee_4() alwaysinline personality i8 3 {
80  entry:
81   %v = invoke i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] to label %normal unwind label %unwind
82
83  normal:
84   ret i32 %v
85
86  unwind:
87   %cleanup = landingpad i8 cleanup
88   ret i32 100
89 }
90
91 define i32 @caller_4() {
92 ; CHECK-LABEL: @caller_4(
93  entry:
94 ; CHECK: invoke i32 @g() [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ]
95   %x = call i32 @callee_4() [ "deopt"(i32 7) ]
96   ret i32 %x
97 }