| 
 | 1 | +; RUN: llc %s -o - | FileCheck %s  | 
 | 2 | + | 
 | 3 | +; Tail calls which have stack arguments in the same offsets as the caller do not  | 
 | 4 | +; need to load and store the arguments from the stack.  | 
 | 5 | + | 
 | 6 | +target triple = "armv7"  | 
 | 7 | + | 
 | 8 | +declare void @func(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j)  | 
 | 9 | + | 
 | 10 | +; CHECK-LABEL: wrapper_func:  | 
 | 11 | +define void @wrapper_func(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j) {  | 
 | 12 | +  ; CHECK: @ %bb.  | 
 | 13 | +  ; CHECK-NEXT: b func  | 
 | 14 | +  tail call void @func(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j)  | 
 | 15 | +  ret void  | 
 | 16 | +}  | 
 | 17 | + | 
 | 18 | +; CHECK-LABEL: wrapper_func_zero_arg:  | 
 | 19 | +define void @wrapper_func_zero_arg(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j) {  | 
 | 20 | +  ; CHECK: @ %bb.  | 
 | 21 | +  ; CHECK-NEXT: mov r12, #0  | 
 | 22 | +  ; CHECK-NEXT: r12, [sp, #20]  | 
 | 23 | +  ; CHECK-NEXT: b func  | 
 | 24 | +  tail call void @func(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 0)  | 
 | 25 | +  ret void  | 
 | 26 | +}  | 
 | 27 | + | 
 | 28 | +; CHECK-LABEL: wrapper_func_overriden_arg:  | 
 | 29 | +define void @wrapper_func_overriden_arg(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j) {  | 
 | 30 | +  ; CHECK: @ %bb.  | 
 | 31 | +  ; CHECK-NEXT: push {r11, lr}  | 
 | 32 | +  ; CHECK-NEXT: ldr r12, [sp, #24]  | 
 | 33 | +  ; CHECK-NEXT: mov lr, #0  | 
 | 34 | +  ; CHECK-NEXT: str lr, [sp, #24]  | 
 | 35 | +  ; CHECK-NEXT: str r12, [sp, #28]  | 
 | 36 | +  ; CHECK-NEXT: pop {r11, lr}  | 
 | 37 | +  ; CHECK-NEXT: b func  | 
 | 38 | +  tail call void @func(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 0, i32 %i)  | 
 | 39 | +  ret void  | 
 | 40 | +}  | 
 | 41 | + | 
 | 42 | +declare void @func_i1(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i1 %j)  | 
 | 43 | + | 
 | 44 | +; CHECK-LABEL: wrapper_func_i1:  | 
 | 45 | +define void @wrapper_func_i1(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i1 %j) {  | 
 | 46 | +  ; CHECK: @ %bb.  | 
 | 47 | +  ; CHECK-NEXT: b func_i1  | 
 | 48 | +  tail call void @func_i1(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i1 %j)  | 
 | 49 | +  ret void  | 
 | 50 | +}  | 
 | 51 | + | 
 | 52 | +declare void @func_signext_i1(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i1 signext %j)  | 
 | 53 | + | 
 | 54 | +; FIXME: Support zero/sign-extended stack arguments.  | 
 | 55 | +; CHECK-LABEL: wrapper_func_i8:  | 
 | 56 | +define void @wrapper_func_i8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i1 signext %j) {  | 
 | 57 | +  ; CHECK: @ %bb.  | 
 | 58 | +  ; CHECK-NEXT: ldr r12, [sp, #20]  | 
 | 59 | +  ; CHECK-NEXT: str r12, [sp, #20]  | 
 | 60 | +  ; CHECK-NEXT: b func_signext_i1  | 
 | 61 | +  tail call void @func_signext_i1(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i1 signext %j)  | 
 | 62 | +  ret void  | 
 | 63 | +}  | 
0 commit comments