1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -relocation-model=pic -enable-mips-tail-calls \ 2*9880d681SAndroid Build Coastguard Worker; RUN: -verify-machineinstrs < %s | FileCheck %s -check-prefix=PIC32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -relocation-model=static -enable-mips-tail-calls \ 4*9880d681SAndroid Build Coastguard Worker; RUN: -verify-machineinstrs < %s | FileCheck %s -check-prefix=STATIC32 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64r2 -enable-mips-tail-calls \ 6*9880d681SAndroid Build Coastguard Worker; RUN: -verify-machineinstrs < %s | FileCheck %s -check-prefix=N64 7*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic \ 8*9880d681SAndroid Build Coastguard Worker; RUN: -enable-mips-tail-calls -verify-machineinstrs < %s | \ 9*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefix=PIC16 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker@g0 = common global i32 0, align 4 12*9880d681SAndroid Build Coastguard Worker@g1 = common global i32 0, align 4 13*9880d681SAndroid Build Coastguard Worker@g2 = common global i32 0, align 4 14*9880d681SAndroid Build Coastguard Worker@g3 = common global i32 0, align 4 15*9880d681SAndroid Build Coastguard Worker@g4 = common global i32 0, align 4 16*9880d681SAndroid Build Coastguard Worker@g5 = common global i32 0, align 4 17*9880d681SAndroid Build Coastguard Worker@g6 = common global i32 0, align 4 18*9880d681SAndroid Build Coastguard Worker@g7 = common global i32 0, align 4 19*9880d681SAndroid Build Coastguard Worker@g8 = common global i32 0, align 4 20*9880d681SAndroid Build Coastguard Worker@g9 = common global i32 0, align 4 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @caller1(i32 %a0) nounwind { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr 25*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal 26*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 27*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee1(i32 1, i32 1, i32 1, i32 %a0) nounwind 30*9880d681SAndroid Build Coastguard Worker ret i32 %call 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee1(i32, i32, i32, i32) 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i32 @caller2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 38*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 39*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 40*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee2(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind 43*9880d681SAndroid Build Coastguard Worker ret i32 %call 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee2(i32, i32, i32, i32, i32) 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @caller3(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 51*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 52*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 53*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee3(i32 1, i32 1, i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind 56*9880d681SAndroid Build Coastguard Worker ret i32 %call 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee3(i32, i32, i32, i32, i32, i32, i32, i32) 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine i32 @caller4(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 64*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 65*9880d681SAndroid Build Coastguard Worker; N64: jalr 66*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee4(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind 69*9880d681SAndroid Build Coastguard Worker ret i32 %call 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee4(i32, i32, i32, i32, i32, i32, i32, i32, i32) 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine i32 @caller5() nounwind readonly { 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller5 77*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr 78*9880d681SAndroid Build Coastguard Worker; PIC32: .end caller5 79*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller5 80*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal 81*9880d681SAndroid Build Coastguard Worker; STATIC32: .end caller5 82*9880d681SAndroid Build Coastguard Worker; N64: .ent caller5 83*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 84*9880d681SAndroid Build Coastguard Worker; N64: .end caller5 85*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller5 86*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 87*9880d681SAndroid Build Coastguard Worker; PIC16: .end caller5 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @g0, align 4 90*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @g1, align 4 91*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* @g2, align 4 92*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* @g3, align 4 93*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* @g4, align 4 94*9880d681SAndroid Build Coastguard Worker %5 = load i32, i32* @g5, align 4 95*9880d681SAndroid Build Coastguard Worker %6 = load i32, i32* @g6, align 4 96*9880d681SAndroid Build Coastguard Worker %7 = load i32, i32* @g7, align 4 97*9880d681SAndroid Build Coastguard Worker %8 = load i32, i32* @g8, align 4 98*9880d681SAndroid Build Coastguard Worker %9 = load i32, i32* @g9, align 4 99*9880d681SAndroid Build Coastguard Worker %call = tail call fastcc i32 @callee5(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9) 100*9880d681SAndroid Build Coastguard Worker ret i32 %call 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine internal fastcc i32 @callee5(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8, i32 %a9) nounwind readnone noinline { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %a1, %a0 106*9880d681SAndroid Build Coastguard Worker %add1 = add nsw i32 %add, %a2 107*9880d681SAndroid Build Coastguard Worker %add2 = add nsw i32 %add1, %a3 108*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %add2, %a4 109*9880d681SAndroid Build Coastguard Worker %add4 = add nsw i32 %add3, %a5 110*9880d681SAndroid Build Coastguard Worker %add5 = add nsw i32 %add4, %a6 111*9880d681SAndroid Build Coastguard Worker %add6 = add nsw i32 %add5, %a7 112*9880d681SAndroid Build Coastguard Worker %add7 = add nsw i32 %add6, %a8 113*9880d681SAndroid Build Coastguard Worker %add8 = add nsw i32 %add7, %a9 114*9880d681SAndroid Build Coastguard Worker ret i32 %add8 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee8(i32, ...) 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine i32 @caller8_0() nounwind { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %call = tail call fastcc i32 @caller8_1() 122*9880d681SAndroid Build Coastguard Worker ret i32 %call 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine internal fastcc i32 @caller8_1() nounwind noinline { 126*9880d681SAndroid Build Coastguard Workerentry: 127*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller8_1 128*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 129*9880d681SAndroid Build Coastguard Worker; PIC32: .end caller8_1 130*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller8_1 131*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 132*9880d681SAndroid Build Coastguard Worker; STATIC32: .end caller8_1 133*9880d681SAndroid Build Coastguard Worker; N64: .ent caller8_1 134*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 135*9880d681SAndroid Build Coastguard Worker; N64: .end caller8_1 136*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller8_1 137*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 138*9880d681SAndroid Build Coastguard Worker; PIC16: .end caller8_1 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker %call = tail call i32 (i32, ...) @callee8(i32 2, i32 1) nounwind 141*9880d681SAndroid Build Coastguard Worker ret i32 %call 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker%struct.S = type { [2 x i32] } 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker@gs1 = external global %struct.S 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee9(%struct.S* byval) 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerdefine i32 @caller9_0() nounwind { 151*9880d681SAndroid Build Coastguard Workerentry: 152*9880d681SAndroid Build Coastguard Worker %call = tail call fastcc i32 @caller9_1() 153*9880d681SAndroid Build Coastguard Worker ret i32 %call 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine internal fastcc i32 @caller9_1() nounwind noinline { 157*9880d681SAndroid Build Coastguard Workerentry: 158*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller9_1 159*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 160*9880d681SAndroid Build Coastguard Worker; PIC32: .end caller9_1 161*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller9_1 162*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 163*9880d681SAndroid Build Coastguard Worker; STATIC32: .end caller9_1 164*9880d681SAndroid Build Coastguard Worker; N64: .ent caller9_1 165*9880d681SAndroid Build Coastguard Worker; N64: jalr 166*9880d681SAndroid Build Coastguard Worker; N64: .end caller9_1 167*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller9_1 168*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 169*9880d681SAndroid Build Coastguard Worker; PIC16: .end caller9_1 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee9(%struct.S* byval @gs1) nounwind 172*9880d681SAndroid Build Coastguard Worker ret i32 %call 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee10(i32, i32, i32, i32, i32, i32, i32, i32, i32) 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine i32 @caller10(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8) nounwind { 178*9880d681SAndroid Build Coastguard Workerentry: 179*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller10 180*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr 181*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller10 182*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal 183*9880d681SAndroid Build Coastguard Worker; N64: .ent caller10 184*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 185*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller10 186*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee10(i32 %a8, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind 189*9880d681SAndroid Build Coastguard Worker ret i32 %call 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee11(%struct.S* byval) 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i32 @caller11() nounwind noinline { 195*9880d681SAndroid Build Coastguard Workerentry: 196*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller11 197*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 198*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller11 199*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 200*9880d681SAndroid Build Coastguard Worker; N64: .ent caller11 201*9880d681SAndroid Build Coastguard Worker; N64: jalr 202*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller11 203*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee11(%struct.S* byval @gs1) nounwind 206*9880d681SAndroid Build Coastguard Worker ret i32 %call 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee12() 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine i32 @caller12(%struct.S* nocapture byval %a0) nounwind { 214*9880d681SAndroid Build Coastguard Workerentry: 215*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller12 216*9880d681SAndroid Build Coastguard Worker; PIC32: jalr 217*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller12 218*9880d681SAndroid Build Coastguard Worker; STATIC32: jal 219*9880d681SAndroid Build Coastguard Worker; N64: .ent caller12 220*9880d681SAndroid Build Coastguard Worker; N64: jalr 221*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller12 222*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker %0 = bitcast %struct.S* %a0 to i8* 225*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast (%struct.S* @gs1 to i8*), i8* %0, i32 8, i32 4, i1 false) 226*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @callee12() nounwind 227*9880d681SAndroid Build Coastguard Worker ret i32 %call 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee13(i32, ...) 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdefine i32 @caller13() nounwind { 233*9880d681SAndroid Build Coastguard Workerentry: 234*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller13 235*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr 236*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller13 237*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal 238*9880d681SAndroid Build Coastguard Worker; N64: .ent caller13 239*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr 240*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller13 241*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker %call = tail call i32 (i32, ...) @callee13(i32 1, i32 2) nounwind 244*9880d681SAndroid Build Coastguard Worker ret i32 %call 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker; Check that there is a chain edge between the load and store nodes. 248*9880d681SAndroid Build Coastguard Worker; 249*9880d681SAndroid Build Coastguard Worker; PIC32-LABEL: caller14: 250*9880d681SAndroid Build Coastguard Worker; PIC32: lw ${{[0-9]+}}, 16($sp) 251*9880d681SAndroid Build Coastguard Worker; PIC32: sw $4, 16($sp) 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine void @caller14(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { 254*9880d681SAndroid Build Coastguard Workerentry: 255*9880d681SAndroid Build Coastguard Worker tail call void @callee14(i32 %e, i32 %b, i32 %c, i32 %d, i32 %a) 256*9880d681SAndroid Build Coastguard Worker ret void 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdeclare void @callee14(i32, i32, i32, i32, i32) 260