1*9880d681SAndroid Build Coastguard Worker; RUN: not opt -verify < %s 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.experimental.deoptimize.i8(...) 4*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.experimental.deoptimize.isVoid(...) 5*9880d681SAndroid Build Coastguard Workerdeclare cc40 void @llvm.experimental.deoptimize.double(...) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare void @unknown() 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine void @f_notail() { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker call void(...) @llvm.experimental.deoptimize.isVoid(i32 0) [ "deopt"() ] 12*9880d681SAndroid Build Coastguard Worker; CHECK: calls to experimental_deoptimize must be followed by a return 13*9880d681SAndroid Build Coastguard Worker call void @unknown() 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine void @f_nodeopt() { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker call void(...) @llvm.experimental.deoptimize.isVoid() 20*9880d681SAndroid Build Coastguard Worker; CHECK: experimental_deoptimize must have exactly one "deopt" operand bundle 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine void @f_invoke() personality i8 3 { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker invoke void(...) @llvm.experimental.deoptimize.isVoid(i32 0, float 0.0) to label %ok unwind label %not_ok 27*9880d681SAndroid Build Coastguard Worker; CHECK: experimental_deoptimize cannot be invoked 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerok: 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workernot_ok: 33*9880d681SAndroid Build Coastguard Worker %0 = landingpad { i8*, i32 } 34*9880d681SAndroid Build Coastguard Worker filter [0 x i8*] zeroinitializer 35*9880d681SAndroid Build Coastguard Worker ret void 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i8 @f_incorrect_return() { 39*9880d681SAndroid Build Coastguard Workerentry: 40*9880d681SAndroid Build Coastguard Worker %val = call i8(...) @llvm.experimental.deoptimize.i8() [ "deopt"() ] 41*9880d681SAndroid Build Coastguard Worker; CHECK: calls to experimental_deoptimize must be followed by a return of the value computed by experimental_deoptimize 42*9880d681SAndroid Build Coastguard Worker ret i8 0 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK: All llvm.experimental.deoptimize declarations must have the same calling convention 46