1 ; RUN: opt -S -always-inline < %s | FileCheck %s
6 define i32 @callee_0() alwaysinline {
12 define i32 @caller_0() {
13 ; CHECK-LABEL: @caller_0(
16 ; CHECK-NEXT: call void @f()
17 ; CHECK-NEXT: ret i32 2
18 %x = call i32 @callee_0() [ "deopt"(i32 5) ]
22 define i32 @callee_1() alwaysinline {
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) ]
30 define i32 @caller_1() {
31 ; CHECK-LABEL: @caller_1(
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
39 %x = call i32 @callee_1() [ "deopt"(i32 5) ]
43 define i32 @callee_2() alwaysinline {
45 %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]
49 define i32 @caller_2(i32 %val) {
50 ; CHECK-LABEL: @caller_2(
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) ]
59 define i32 @callee_3() alwaysinline {
61 %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ]
65 define i32 @caller_3() personality i8 3 {
66 ; CHECK-LABEL: @caller_3(
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) ]
75 %cleanup = landingpad i8 cleanup
79 define i32 @callee_4() alwaysinline personality i8 3 {
81 %v = invoke i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] to label %normal unwind label %unwind
87 %cleanup = landingpad i8 cleanup
91 define i32 @caller_4() {
92 ; CHECK-LABEL: @caller_4(
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) ]