1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; We used to crash with filetype=obj 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-androideabi -filetype=obj 6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; Just to prevent the alloca from being optimized away 10*9880d681SAndroid Build Coastguard Workerdeclare void @dummy_use(i32*, i32) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @test_basic() #0 { 13*9880d681SAndroid Build Coastguard Worker %mem = alloca i32, i32 10 14*9880d681SAndroid Build Coastguard Worker call void @dummy_use (i32* %mem, i32 10) 15*9880d681SAndroid Build Coastguard Worker ret void 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; ARM-linux: test_basic: 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; ARM-linux: push {r4, r5} 20*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3 21*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, sp 22*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr r4, [r4, #4] 23*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp r4, r5 24*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo .LBB0_2 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker; ARM-linux: mov r4, #48 27*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, #0 28*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb sp!, {lr} 29*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl __morestack 30*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm sp!, {lr} 31*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop {r4, r5} 32*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx lr 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; ARM-linux: pop {r4, r5} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; ARM-android: test_basic: 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; ARM-android: push {r4, r5} 39*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3 40*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, sp 41*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr r4, [r4, #252] 42*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp r4, r5 43*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo .LBB0_2 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; ARM-android: mov r4, #48 46*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, #0 47*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb sp!, {lr} 48*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl __morestack 49*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm sp!, {lr} 50*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop {r4, r5} 51*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx lr 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; ARM-android: pop {r4, r5} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nested(i32 * nest %closure, i32 %other) #0 { 58*9880d681SAndroid Build Coastguard Worker %addend = load i32 , i32 * %closure 59*9880d681SAndroid Build Coastguard Worker %result = add i32 %other, %addend 60*9880d681SAndroid Build Coastguard Worker %mem = alloca i32, i32 10 61*9880d681SAndroid Build Coastguard Worker call void @dummy_use (i32* %mem, i32 10) 62*9880d681SAndroid Build Coastguard Worker ret i32 %result 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; ARM-linux: test_nested: 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; ARM-linux: push {r4, r5} 67*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3 68*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, sp 69*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr r4, [r4, #4] 70*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp r4, r5 71*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo .LBB1_2 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; ARM-linux: mov r4, #56 74*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, #0 75*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb sp!, {lr} 76*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl __morestack 77*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm sp!, {lr} 78*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop {r4, r5} 79*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx lr 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; ARM-linux: pop {r4, r5} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker; ARM-android: test_nested: 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; ARM-android: push {r4, r5} 86*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3 87*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, sp 88*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr r4, [r4, #252] 89*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp r4, r5 90*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo .LBB1_2 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; ARM-android: mov r4, #56 93*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, #0 94*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb sp!, {lr} 95*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl __morestack 96*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm sp!, {lr} 97*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop {r4, r5} 98*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx lr 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; ARM-android: pop {r4, r5} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine void @test_large() #0 { 105*9880d681SAndroid Build Coastguard Worker %mem = alloca i32, i32 10000 106*9880d681SAndroid Build Coastguard Worker call void @dummy_use (i32* %mem, i32 0) 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; ARM-linux: test_large: 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; ARM-linux: push {r4, r5} 112*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3 113*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: sub r5, sp, #40192 114*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr r4, [r4, #4] 115*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp r4, r5 116*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo .LBB2_2 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; ARM-linux: mov r4, #40192 119*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, #0 120*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb sp!, {lr} 121*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl __morestack 122*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm sp!, {lr} 123*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop {r4, r5} 124*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx lr 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; ARM-linux: pop {r4, r5} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; ARM-android: test_large: 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; ARM-android: push {r4, r5} 131*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3 132*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: sub r5, sp, #40192 133*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr r4, [r4, #252] 134*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp r4, r5 135*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo .LBB2_2 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; ARM-android: mov r4, #40192 138*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, #0 139*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb sp!, {lr} 140*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl __morestack 141*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm sp!, {lr} 142*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop {r4, r5} 143*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx lr 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; ARM-android: pop {r4, r5} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine fastcc void @test_fastcc() #0 { 150*9880d681SAndroid Build Coastguard Worker %mem = alloca i32, i32 10 151*9880d681SAndroid Build Coastguard Worker call void @dummy_use (i32* %mem, i32 10) 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker; ARM-linux: test_fastcc: 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker; ARM-linux: push {r4, r5} 157*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3 158*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, sp 159*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr r4, [r4, #4] 160*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp r4, r5 161*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo .LBB3_2 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; ARM-linux: mov r4, #48 164*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, #0 165*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb sp!, {lr} 166*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl __morestack 167*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm sp!, {lr} 168*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop {r4, r5} 169*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx lr 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; ARM-linux: pop {r4, r5} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; ARM-android: test_fastcc: 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; ARM-android: push {r4, r5} 176*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3 177*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, sp 178*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr r4, [r4, #252] 179*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp r4, r5 180*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo .LBB3_2 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; ARM-android: mov r4, #48 183*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, #0 184*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb sp!, {lr} 185*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl __morestack 186*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm sp!, {lr} 187*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop {r4, r5} 188*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx lr 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; ARM-android: pop {r4, r5} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine fastcc void @test_fastcc_large() #0 { 195*9880d681SAndroid Build Coastguard Worker %mem = alloca i32, i32 10000 196*9880d681SAndroid Build Coastguard Worker call void @dummy_use (i32* %mem, i32 0) 197*9880d681SAndroid Build Coastguard Worker ret void 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker; ARM-linux: test_fastcc_large: 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker; ARM-linux: push {r4, r5} 202*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3 203*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: sub r5, sp, #40192 204*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldr r4, [r4, #4] 205*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: cmp r4, r5 206*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: blo .LBB4_2 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; ARM-linux: mov r4, #40192 209*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: mov r5, #0 210*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: stmdb sp!, {lr} 211*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bl __morestack 212*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: ldm sp!, {lr} 213*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: pop {r4, r5} 214*9880d681SAndroid Build Coastguard Worker; ARM-linux-NEXT: bx lr 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; ARM-linux: pop {r4, r5} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; ARM-android: test_fastcc_large: 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; ARM-android: push {r4, r5} 221*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3 222*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: sub r5, sp, #40192 223*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldr r4, [r4, #252] 224*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: cmp r4, r5 225*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: blo .LBB4_2 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker; ARM-android: mov r4, #40192 228*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: mov r5, #0 229*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: stmdb sp!, {lr} 230*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bl __morestack 231*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: ldm sp!, {lr} 232*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: pop {r4, r5} 233*9880d681SAndroid Build Coastguard Worker; ARM-android-NEXT: bx lr 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; ARM-android: pop {r4, r5} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine void @test_nostack() #0 { 240*9880d681SAndroid Build Coastguard Worker ret void 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker; ARM-linux-LABEL: test_nostack: 243*9880d681SAndroid Build Coastguard Worker; ARM-linux-NOT: bl __morestack 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; ARM-android-LABEL: test_nostack: 246*9880d681SAndroid Build Coastguard Worker; ARM-android-NOT: bl __morestack 247*9880d681SAndroid Build Coastguard Worker} 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Workerattributes #0 = { "split-stack" } 250