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