1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -always-inline < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.experimental.deoptimize.i8(...) 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.experimental.deoptimize.i32(...) 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i8 @callee(i1* %c) alwaysinline { 7*9880d681SAndroid Build Coastguard Worker %c0 = load volatile i1, i1* %c 8*9880d681SAndroid Build Coastguard Worker br i1 %c0, label %left, label %right 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerleft: 11*9880d681SAndroid Build Coastguard Worker %c1 = load volatile i1, i1* %c 12*9880d681SAndroid Build Coastguard Worker br i1 %c1, label %lleft, label %lright 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerlleft: 15*9880d681SAndroid Build Coastguard Worker %v0 = call i8(...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i32 1) ] 16*9880d681SAndroid Build Coastguard Worker ret i8 %v0 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerlright: 19*9880d681SAndroid Build Coastguard Worker ret i8 10 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerright: 22*9880d681SAndroid Build Coastguard Worker %c2 = load volatile i1, i1* %c 23*9880d681SAndroid Build Coastguard Worker br i1 %c2, label %rleft, label %rright 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerrleft: 26*9880d681SAndroid Build Coastguard Worker %v1 = call i8(...) @llvm.experimental.deoptimize.i8(i32 1, i32 300, float 500.0, <2 x i32*> undef) [ "deopt"(i32 1) ] 27*9880d681SAndroid Build Coastguard Worker ret i8 %v1 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerrright: 30*9880d681SAndroid Build Coastguard Worker %v2 = call i8(...) @llvm.experimental.deoptimize.i8() [ "deopt"(i32 1) ] 31*9880d681SAndroid Build Coastguard Worker ret i8 %v2 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine void @caller_0(i1* %c, i8* %ptr) { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_0( 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker %v = call i8 @callee(i1* %c) [ "deopt"(i32 2) ] 38*9880d681SAndroid Build Coastguard Worker store i8 %v, i8* %ptr 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK: lleft.i: 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"(i32 2, i32 1) ] 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK: rleft.i: 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid(i32 1, i32 300, float 5.000000e+02, <2 x i32*> undef) [ "deopt"(i32 2, i32 1) ] 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker; CHECK: rright.i: 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"(i32 2, i32 1) ] 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK: callee.exit: 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8 10, i8* %ptr 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_1(i1* %c, i8* %ptr) personality i8 3 { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_1( 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker %v = invoke i8 @callee(i1* %c) [ "deopt"(i32 3) ] to label %normal 63*9880d681SAndroid Build Coastguard Worker unwind label %unwind 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; CHECK: lleft.i: 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %0 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 1) [ "deopt"(i32 3, i32 1) ] 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %0 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK: rleft.i: 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = call i32 (...) @llvm.experimental.deoptimize.i32(i32 1, i32 300, float 5.000000e+02, <2 x i32*> undef) [ "deopt"(i32 3, i32 1) ] 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %1 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK: rright.i: 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 3, i32 1) ] 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %2 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; CHECK: callee.exit: 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %normal 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK: normal: 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i8 10, i8* %ptr 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 42 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerunwind: 85*9880d681SAndroid Build Coastguard Worker %lp = landingpad i32 cleanup 86*9880d681SAndroid Build Coastguard Worker ret i32 43 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workernormal: 89*9880d681SAndroid Build Coastguard Worker store i8 %v, i8* %ptr 90*9880d681SAndroid Build Coastguard Worker ret i32 42 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i8 @callee_with_alloca() alwaysinline { 94*9880d681SAndroid Build Coastguard Worker %t = alloca i8 95*9880d681SAndroid Build Coastguard Worker %v0 = call i8(...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i8* %t) ] 96*9880d681SAndroid Build Coastguard Worker ret i8 %v0 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine void @caller_with_lifetime() { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABLE: @caller_with_lifetime( 101*9880d681SAndroid Build Coastguard Worker; CHECK: call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"(i8* %t.i) ] 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker call i8 @callee_with_alloca(); 106*9880d681SAndroid Build Coastguard Worker ret void 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine i8 @callee_with_dynamic_alloca(i32 %n) alwaysinline { 110*9880d681SAndroid Build Coastguard Worker %p = alloca i8, i32 %n 111*9880d681SAndroid Build Coastguard Worker %v = call i8(...) @llvm.experimental.deoptimize.i8(i32 1) [ "deopt"(i8* %p) ] 112*9880d681SAndroid Build Coastguard Worker ret i8 %v 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine void @caller_with_stacksaverestore(i32 %n) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: void @caller_with_stacksaverestore( 117*9880d681SAndroid Build Coastguard Worker; CHECK: call void (...) @llvm.experimental.deoptimize.isVoid(i32 1) [ "deopt"(i8* %p.i) ] 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker %p = alloca i32, i32 %n 121*9880d681SAndroid Build Coastguard Worker call i8 @callee_with_dynamic_alloca(i32 %n) 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124