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