1*1eb160feSEli Friedman; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*1eb160feSEli Friedman; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s 3*1eb160feSEli Friedman; RUN: llc -mtriple=thumbv7-linux-gnueabi %s -o - | FileCheck -check-prefix=SOFTFLOAT %s 4*1eb160feSEli Friedman; RUN: llc -mtriple=thumbv7-linux-gnueabihf -disable-tail-calls %s -o - | FileCheck -check-prefix=HF-NOTAIL %s 5*1eb160feSEli Friedman 6*1eb160feSEli Friedman; On hard-float targets, the register used to store a float return value 7*1eb160feSEli Friedman; changes if the call signature is varargs. The HF-NOTAIL lines are there to 8*1eb160feSEli Friedman; easily see when this happens. 9*1eb160feSEli Friedman 10*1eb160feSEli Friedmandeclare float @callee_float() 11*1eb160feSEli Friedmandeclare i32 @callee_int() 12*1eb160feSEli Friedmandeclare float @callee_float_vararg(i32, ...) 13*1eb160feSEli Friedmandeclare i32 @callee_int_vararg(i32, ...) 14*1eb160feSEli Friedman 15*1eb160feSEli Friedmandefine float @caller_float__callee_float() { 16*1eb160feSEli Friedman; CHECK-LABEL: caller_float__callee_float: 17*1eb160feSEli Friedman; CHECK: @ %bb.0: 18*1eb160feSEli Friedman; CHECK-NEXT: b callee_float 19*1eb160feSEli Friedman; 20*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float__callee_float: 21*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 22*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_float 23*1eb160feSEli Friedman; 24*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float__callee_float: 25*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 26*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 27*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 28*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_float 29*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 30*1eb160feSEli Friedman %r = tail call float @callee_float() 31*1eb160feSEli Friedman ret float %r 32*1eb160feSEli Friedman} 33*1eb160feSEli Friedman 34*1eb160feSEli Friedmandefine float @caller_float__callee_float_vararg() { 35*1eb160feSEli Friedman; CHECK-LABEL: caller_float__callee_float_vararg: 36*1eb160feSEli Friedman; CHECK: @ %bb.0: 37*1eb160feSEli Friedman; CHECK-NEXT: .save {r7, lr} 38*1eb160feSEli Friedman; CHECK-NEXT: push {r7, lr} 39*1eb160feSEli Friedman; CHECK-NEXT: movs r0, #0 40*1eb160feSEli Friedman; CHECK-NEXT: bl callee_float_vararg 41*1eb160feSEli Friedman; CHECK-NEXT: vmov s0, r0 42*1eb160feSEli Friedman; CHECK-NEXT: pop {r7, pc} 43*1eb160feSEli Friedman; 44*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float__callee_float_vararg: 45*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 46*1eb160feSEli Friedman; SOFTFLOAT-NEXT: movs r0, #0 47*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_float_vararg 48*1eb160feSEli Friedman; 49*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float__callee_float_vararg: 50*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 51*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 52*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 53*1eb160feSEli Friedman; HF-NOTAIL-NEXT: movs r0, #0 54*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_float_vararg 55*1eb160feSEli Friedman; HF-NOTAIL-NEXT: vmov s0, r0 56*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 57*1eb160feSEli Friedman %r = tail call float (i32, ...) @callee_float_vararg(i32 0) 58*1eb160feSEli Friedman ret float %r 59*1eb160feSEli Friedman} 60*1eb160feSEli Friedman 61*1eb160feSEli Friedmandefine float @caller_float_vararg__callee_float(i32, ...) { 62*1eb160feSEli Friedman; CHECK-LABEL: caller_float_vararg__callee_float: 63*1eb160feSEli Friedman; CHECK: @ %bb.0: 64*1eb160feSEli Friedman; CHECK-NEXT: .save {r7, lr} 65*1eb160feSEli Friedman; CHECK-NEXT: push {r7, lr} 66*1eb160feSEli Friedman; CHECK-NEXT: bl callee_float 67*1eb160feSEli Friedman; CHECK-NEXT: vmov r0, s0 68*1eb160feSEli Friedman; CHECK-NEXT: pop {r7, pc} 69*1eb160feSEli Friedman; 70*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float_vararg__callee_float: 71*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 72*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_float 73*1eb160feSEli Friedman; 74*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float_vararg__callee_float: 75*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 76*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 77*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 78*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_float 79*1eb160feSEli Friedman; HF-NOTAIL-NEXT: vmov r0, s0 80*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 81*1eb160feSEli Friedman %r = tail call float @callee_float() 82*1eb160feSEli Friedman ret float %r 83*1eb160feSEli Friedman} 84*1eb160feSEli Friedman 85*1eb160feSEli Friedmandefine float @caller_float_vararg__callee_float_vararg(i32, ...) { 86*1eb160feSEli Friedman; CHECK-LABEL: caller_float_vararg__callee_float_vararg: 87*1eb160feSEli Friedman; CHECK: @ %bb.0: 88*1eb160feSEli Friedman; CHECK-NEXT: movs r0, #0 89*1eb160feSEli Friedman; CHECK-NEXT: b callee_float_vararg 90*1eb160feSEli Friedman; 91*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float_vararg__callee_float_vararg: 92*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 93*1eb160feSEli Friedman; SOFTFLOAT-NEXT: movs r0, #0 94*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_float_vararg 95*1eb160feSEli Friedman; 96*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float_vararg__callee_float_vararg: 97*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 98*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 99*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 100*1eb160feSEli Friedman; HF-NOTAIL-NEXT: movs r0, #0 101*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_float_vararg 102*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 103*1eb160feSEli Friedman %r = tail call float (i32, ...) @callee_float_vararg(i32 0) 104*1eb160feSEli Friedman ret float %r 105*1eb160feSEli Friedman} 106*1eb160feSEli Friedman 107*1eb160feSEli Friedmandefine i32 @caller_int__callee_int() { 108*1eb160feSEli Friedman; CHECK-LABEL: caller_int__callee_int: 109*1eb160feSEli Friedman; CHECK: @ %bb.0: 110*1eb160feSEli Friedman; CHECK-NEXT: b callee_int 111*1eb160feSEli Friedman; 112*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int__callee_int: 113*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 114*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_int 115*1eb160feSEli Friedman; 116*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int__callee_int: 117*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 118*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 119*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 120*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_int 121*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 122*1eb160feSEli Friedman %r = tail call i32 @callee_int() 123*1eb160feSEli Friedman ret i32 %r 124*1eb160feSEli Friedman} 125*1eb160feSEli Friedman 126*1eb160feSEli Friedmandefine i32 @caller_int__callee_int_vararg() { 127*1eb160feSEli Friedman; CHECK-LABEL: caller_int__callee_int_vararg: 128*1eb160feSEli Friedman; CHECK: @ %bb.0: 129*1eb160feSEli Friedman; CHECK-NEXT: movs r0, #0 130*1eb160feSEli Friedman; CHECK-NEXT: b callee_int_vararg 131*1eb160feSEli Friedman; 132*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int__callee_int_vararg: 133*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 134*1eb160feSEli Friedman; SOFTFLOAT-NEXT: movs r0, #0 135*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_int_vararg 136*1eb160feSEli Friedman; 137*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int__callee_int_vararg: 138*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 139*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 140*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 141*1eb160feSEli Friedman; HF-NOTAIL-NEXT: movs r0, #0 142*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_int_vararg 143*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 144*1eb160feSEli Friedman %r = tail call i32 (i32, ...) @callee_int_vararg(i32 0) 145*1eb160feSEli Friedman ret i32 %r 146*1eb160feSEli Friedman} 147*1eb160feSEli Friedman 148*1eb160feSEli Friedmandefine i32 @caller_int_vararg__callee_int(i32, ...) { 149*1eb160feSEli Friedman; CHECK-LABEL: caller_int_vararg__callee_int: 150*1eb160feSEli Friedman; CHECK: @ %bb.0: 151*1eb160feSEli Friedman; CHECK-NEXT: b callee_int 152*1eb160feSEli Friedman; 153*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int_vararg__callee_int: 154*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 155*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_int 156*1eb160feSEli Friedman; 157*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int_vararg__callee_int: 158*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 159*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 160*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 161*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_int 162*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 163*1eb160feSEli Friedman %r = tail call i32 @callee_int() 164*1eb160feSEli Friedman ret i32 %r 165*1eb160feSEli Friedman} 166*1eb160feSEli Friedman 167*1eb160feSEli Friedmandefine i32 @caller_int_vararg__callee_int_vararg(i32, ...) { 168*1eb160feSEli Friedman; CHECK-LABEL: caller_int_vararg__callee_int_vararg: 169*1eb160feSEli Friedman; CHECK: @ %bb.0: 170*1eb160feSEli Friedman; CHECK-NEXT: movs r0, #0 171*1eb160feSEli Friedman; CHECK-NEXT: b callee_int_vararg 172*1eb160feSEli Friedman; 173*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int_vararg__callee_int_vararg: 174*1eb160feSEli Friedman; SOFTFLOAT: @ %bb.0: 175*1eb160feSEli Friedman; SOFTFLOAT-NEXT: movs r0, #0 176*1eb160feSEli Friedman; SOFTFLOAT-NEXT: b callee_int_vararg 177*1eb160feSEli Friedman; 178*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int_vararg__callee_int_vararg: 179*1eb160feSEli Friedman; HF-NOTAIL: @ %bb.0: 180*1eb160feSEli Friedman; HF-NOTAIL-NEXT: .save {r7, lr} 181*1eb160feSEli Friedman; HF-NOTAIL-NEXT: push {r7, lr} 182*1eb160feSEli Friedman; HF-NOTAIL-NEXT: movs r0, #0 183*1eb160feSEli Friedman; HF-NOTAIL-NEXT: bl callee_int_vararg 184*1eb160feSEli Friedman; HF-NOTAIL-NEXT: pop {r7, pc} 185*1eb160feSEli Friedman %r = tail call i32 (i32, ...) @callee_int_vararg(i32 0) 186*1eb160feSEli Friedman ret i32 %r 187*1eb160feSEli Friedman} 188