1*9880d681SAndroid Build Coastguard Worker; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Each musttail call should fail to validate. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare x86_stdcallcc void @cc_mismatch_callee() 6*9880d681SAndroid Build Coastguard Workerdefine void @cc_mismatch() { 7*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched calling conv 8*9880d681SAndroid Build Coastguard Worker musttail call x86_stdcallcc void @cc_mismatch_callee() 9*9880d681SAndroid Build Coastguard Worker ret void 10*9880d681SAndroid Build Coastguard Worker} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare void @more_parms_callee(i32) 13*9880d681SAndroid Build Coastguard Workerdefine void @more_parms() { 14*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched parameter counts 15*9880d681SAndroid Build Coastguard Worker musttail call void @more_parms_callee(i32 0) 16*9880d681SAndroid Build Coastguard Worker ret void 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdeclare void @mismatched_intty_callee(i8) 20*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_intty(i32) { 21*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched parameter types 22*9880d681SAndroid Build Coastguard Worker musttail call void @mismatched_intty_callee(i8 0) 23*9880d681SAndroid Build Coastguard Worker ret void 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdeclare void @mismatched_vararg_callee(i8*, ...) 27*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_vararg(i8*) { 28*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched varargs 29*9880d681SAndroid Build Coastguard Worker musttail call void (i8*, ...) @mismatched_vararg_callee(i8* null) 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; We would make this an implicit sret parameter, which would disturb the 34*9880d681SAndroid Build Coastguard Worker; tail call. 35*9880d681SAndroid Build Coastguard Workerdeclare { i32, i32, i32 } @mismatched_retty_callee(i32) 36*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_retty(i32) { 37*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched return types 38*9880d681SAndroid Build Coastguard Worker musttail call { i32, i32, i32 } @mismatched_retty_callee(i32 0) 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdeclare void @mismatched_byval_callee({ i32 }*) 43*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_byval({ i32 }* byval %a) { 44*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched ABI impacting function attributes 45*9880d681SAndroid Build Coastguard Worker musttail call void @mismatched_byval_callee({ i32 }* %a) 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdeclare void @mismatched_inreg_callee(i32 inreg) 50*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_inreg(i32 %a) { 51*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched ABI impacting function attributes 52*9880d681SAndroid Build Coastguard Worker musttail call void @mismatched_inreg_callee(i32 inreg %a) 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdeclare void @mismatched_sret_callee(i32* sret) 57*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_sret(i32* %a) { 58*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched ABI impacting function attributes 59*9880d681SAndroid Build Coastguard Worker musttail call void @mismatched_sret_callee(i32* sret %a) 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdeclare void @mismatched_alignment_callee(i32* byval align 8) 64*9880d681SAndroid Build Coastguard Workerdefine void @mismatched_alignment(i32* byval align 4 %a) { 65*9880d681SAndroid Build Coastguard Worker; CHECK: mismatched ABI impacting function attributes 66*9880d681SAndroid Build Coastguard Worker musttail call void @mismatched_alignment_callee(i32* byval align 8 %a) 67*9880d681SAndroid Build Coastguard Worker ret void 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdeclare i32 @not_tail_pos_callee() 71*9880d681SAndroid Build Coastguard Workerdefine i32 @not_tail_pos() { 72*9880d681SAndroid Build Coastguard Worker; CHECK: musttail call must be precede a ret with an optional bitcast 73*9880d681SAndroid Build Coastguard Worker %v = musttail call i32 @not_tail_pos_callee() 74*9880d681SAndroid Build Coastguard Worker %w = add i32 %v, 1 75*9880d681SAndroid Build Coastguard Worker ret i32 %w 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine void @inline_asm() { 79*9880d681SAndroid Build Coastguard Worker; CHECK: cannot use musttail call with inline asm 80*9880d681SAndroid Build Coastguard Worker musttail call void asm "ret", ""() 81*9880d681SAndroid Build Coastguard Worker ret void 82*9880d681SAndroid Build Coastguard Worker} 83