299 lines · plain
1; RUN: llc < %s -mtriple=thumb-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android2; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux3; RUN: llc < %s -mtriple=thumb-linux-androideabi -filetype=obj4; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -filetype=obj5 6 7; Just to prevent the alloca from being optimized away8declare void @dummy_use(ptr, i32)9 10define void @test_basic() #0 {11 %mem = alloca i32, i32 1012 call void @dummy_use (ptr %mem, i32 10)13 ret void14 15; Thumb-android-LABEL: test_basic:16 17; Thumb-android: push {r4, r5}18; Thumb-android-NEXT: mov r5, sp19; Thumb-android-NEXT: ldr r4, .LCPI0_020; Thumb-android-NEXT: ldr r4, [r4]21; Thumb-android-NEXT: cmp r4, r522; Thumb-android-NEXT: bls .LBB0_223 24; Thumb-android: mov r4, #4825; Thumb-android-NEXT: mov r5, #026; Thumb-android-NEXT: push {lr}27; Thumb-android-NEXT: bl __morestack28; Thumb-android-NEXT: pop {r4}29; Thumb-android-NEXT: mov lr, r430; Thumb-android-NEXT: pop {r4, r5}31; Thumb-android-NEXT: bx lr32 33; Thumb-android: pop {r4, r5}34 35; Thumb-android: .p2align 236; Thumb-android: .LCPI0_0:37; Thumb-android-NEXT: .long __STACK_LIMIT38 39; Thumb-linux-LABEL: test_basic:40 41; Thumb-linux: push {r4, r5}42; Thumb-linux-NEXT: mov r5, sp43; Thumb-linux-NEXT: ldr r4, .LCPI0_044; Thumb-linux-NEXT: ldr r4, [r4]45; Thumb-linux-NEXT: cmp r4, r546; Thumb-linux-NEXT: bls .LBB0_247 48; Thumb-linux: mov r4, #4849; Thumb-linux-NEXT: mov r5, #050; Thumb-linux-NEXT: push {lr}51; Thumb-linux-NEXT: bl __morestack52; Thumb-linux-NEXT: pop {r4}53; Thumb-linux-NEXT: mov lr, r454; Thumb-linux-NEXT: pop {r4, r5}55; Thumb-linux-NEXT: bx lr56 57; Thumb-linux: pop {r4, r5}58 59}60 61define i32 @test_nested(ptr nest %closure, i32 %other) #0 {62 %addend = load i32 , ptr %closure63 %result = add i32 %other, %addend64 %mem = alloca i32, i32 1065 call void @dummy_use (ptr %mem, i32 10)66 ret i32 %result67 68; Thumb-android-LABEL: test_nested:69 70; Thumb-android: push {r4, r5}71; Thumb-android-NEXT: mov r5, sp72; Thumb-android-NEXT: ldr r4, .LCPI1_073; Thumb-android-NEXT: ldr r4, [r4]74; Thumb-android-NEXT: cmp r4, r575; Thumb-android-NEXT: bls .LBB1_276 77; Thumb-android: mov r4, #5678; Thumb-android-NEXT: mov r5, #079; Thumb-android-NEXT: push {lr}80; Thumb-android-NEXT: bl __morestack81; Thumb-android-NEXT: pop {r4}82; Thumb-android-NEXT: mov lr, r483; Thumb-android-NEXT: pop {r4, r5}84; Thumb-android-NEXT: bx lr85 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, sp92; Thumb-linux-NEXT: ldr r4, .LCPI1_093; Thumb-linux-NEXT: ldr r4, [r4]94; Thumb-linux-NEXT: cmp r4, r595; Thumb-linux-NEXT: bls .LBB1_296 97; Thumb-linux: mov r4, #5698; Thumb-linux-NEXT: mov r5, #099; Thumb-linux-NEXT: push {lr}100; Thumb-linux-NEXT: bl __morestack101; Thumb-linux-NEXT: pop {r4}102; Thumb-linux-NEXT: mov lr, r4103; Thumb-linux-NEXT: pop {r4, r5}104; Thumb-linux-NEXT: bx lr105 106; Thumb-linux: pop {r4, r5}107 108}109 110define void @test_large() #0 {111 %mem = alloca i32, i32 10000112 call void @dummy_use (ptr %mem, i32 0)113 ret void114 115; Thumb-android-LABEL: test_large:116 117; Thumb-android: push {r4, r5}118; Thumb-android-NEXT: mov r5, sp119; Thumb-android-NEXT: ldr r4, .LCPI2_2120; Thumb-android-NEXT: sub r5, r5, r4121; Thumb-android-NEXT: ldr r4, .LCPI2_3122; Thumb-android-NEXT: ldr r4, [r4]123; Thumb-android-NEXT: cmp r4, r5124; Thumb-android-NEXT: bls .LBB2_2125 126; Thumb-android: ldr r4, .LCPI2_2127; Thumb-android-NEXT: mov r5, #0128; Thumb-android-NEXT: push {lr}129; Thumb-android-NEXT: bl __morestack130; Thumb-android-NEXT: pop {r4}131; Thumb-android-NEXT: mov lr, r4132; Thumb-android-NEXT: pop {r4, r5}133; Thumb-android-NEXT: bx lr134 135; Thumb-android: pop {r4, r5}136 137; Thumb-android: .LCPI2_2:138; Thumb-android-NEXT: .long 40192139 140; Thumb-linux-LABEL: test_large:141 142; Thumb-linux: push {r4, r5}143; Thumb-linux-NEXT: mov r5, sp144; Thumb-linux-NEXT: ldr r4, .LCPI2_2145; Thumb-linux-NEXT: sub r5, r5, r4146; Thumb-linux-NEXT: ldr r4, .LCPI2_3147; Thumb-linux-NEXT: ldr r4, [r4]148; Thumb-linux-NEXT: cmp r4, r5149; Thumb-linux-NEXT: bls .LBB2_2150 151; Thumb-linux: ldr r4, .LCPI2_2152; Thumb-linux-NEXT: mov r5, #0153; Thumb-linux-NEXT: push {lr}154; Thumb-linux-NEXT: bl __morestack155; Thumb-linux-NEXT: pop {r4}156; Thumb-linux-NEXT: mov lr, r4157; Thumb-linux-NEXT: pop {r4, r5}158; Thumb-linux-NEXT: bx lr159 160; Thumb-linux: pop {r4, r5}161 162}163 164define fastcc void @test_fastcc() #0 {165 %mem = alloca i32, i32 10166 call void @dummy_use (ptr %mem, i32 10)167 ret void168 169; Thumb-android-LABEL: test_fastcc:170 171; Thumb-android: push {r4, r5}172; Thumb-android-NEXT: mov r5, sp173; Thumb-android-NEXT: ldr r4, .LCPI3_0174; Thumb-android-NEXT: ldr r4, [r4]175; Thumb-android-NEXT: cmp r4, r5176; Thumb-android-NEXT: bls .LBB3_2177 178; Thumb-android: mov r4, #48179; Thumb-android-NEXT: mov r5, #0180; Thumb-android-NEXT: push {lr}181; Thumb-android-NEXT: bl __morestack182; Thumb-android-NEXT: pop {r4}183; Thumb-android-NEXT: mov lr, r4184; Thumb-android-NEXT: pop {r4, r5}185; Thumb-android-NEXT: bx lr186 187; Thumb-android: pop {r4, r5}188 189; Thumb-linux-LABEL: test_fastcc:190 191; Thumb-linux: push {r4, r5}192; Thumb-linux-NEXT: mov r5, sp193; Thumb-linux-NEXT: ldr r4, .LCPI3_0194; Thumb-linux-NEXT: ldr r4, [r4]195; Thumb-linux-NEXT: cmp r4, r5196; Thumb-linux-NEXT: bls .LBB3_2197 198; Thumb-linux: mov r4, #48199; Thumb-linux-NEXT: mov r5, #0200; Thumb-linux-NEXT: push {lr}201; Thumb-linux-NEXT: bl __morestack202; Thumb-linux-NEXT: pop {r4}203; Thumb-linux-NEXT: mov lr, r4204; Thumb-linux-NEXT: pop {r4, r5}205; Thumb-linux-NEXT: bx lr206 207; Thumb-linux: pop {r4, r5}208 209}210 211define fastcc void @test_fastcc_large() #0 {212 %mem = alloca i32, i32 10000213 call void @dummy_use (ptr %mem, i32 0)214 ret void215 216; Thumb-android-LABEL: test_fastcc_large:217 218; Thumb-android: push {r4, r5}219; Thumb-android-NEXT: mov r5, sp220; Thumb-android-NEXT: ldr r4, .LCPI4_2221; Thumb-android-NEXT: sub r5, r5, r4222; Thumb-android-NEXT: ldr r4, .LCPI4_3223; Thumb-android-NEXT: ldr r4, [r4]224; Thumb-android-NEXT: cmp r4, r5225; Thumb-android-NEXT: bls .LBB4_2226 227; Thumb-android: ldr r4, .LCPI4_2228; Thumb-android-NEXT: mov r5, #0229; Thumb-android-NEXT: push {lr}230; Thumb-android-NEXT: bl __morestack231; Thumb-android-NEXT: pop {r4}232; Thumb-android-NEXT: mov lr, r4233; Thumb-android-NEXT: pop {r4, r5}234; Thumb-android-NEXT: bx lr235 236; Thumb-android: pop {r4, r5}237 238; Thumb-android: .LCPI4_2:239; Thumb-android-NEXT: .long 40192240 241; Thumb-linux-LABEL: test_fastcc_large:242 243; Thumb-linux: push {r4, r5}244; Thumb-linux-NEXT: mov r5, sp245; Thumb-linux-NEXT: ldr r4, .LCPI4_2246; Thumb-linux-NEXT: sub r5, r5, r4247; Thumb-linux-NEXT: ldr r4, .LCPI4_3248; Thumb-linux-NEXT: ldr r4, [r4]249; Thumb-linux-NEXT: cmp r4, r5250; Thumb-linux-NEXT: bls .LBB4_2251 252; Thumb-linux: ldr r4, .LCPI4_2253; Thumb-linux-NEXT: mov r5, #0254; Thumb-linux-NEXT: push {lr}255; Thumb-linux-NEXT: bl __morestack256; Thumb-linux-NEXT: pop {r4}257; Thumb-linux-NEXT: mov lr, r4258; Thumb-linux-NEXT: pop {r4, r5}259; Thumb-linux-NEXT: bx lr260 261; Thumb-linux: pop {r4, r5}262 263; Thumb-linux: .LCPI4_2:264; Thumb-linux-NEXT: .long 40192265 266}267 268define void @test_nostack() #0 {269 ret void270 271; Thumb-android-LABEL: test_nostack:272; Thumb-android-NOT: bl __morestack273 274; Thumb-linux-LABEL: test_nostack:275; Thumb-linux-NOT: bl __morestack276}277 278 279declare void @panic() unnamed_addr280 281; We used to crash while compiling the following function.282; Thumb-linux-LABEL: build_should_not_segfault:283; Thumb-android-LABEL: build_should_not_segfault:284define void @build_should_not_segfault(i8 %x) unnamed_addr #0 {285start:286 %_0 = icmp ult i8 %x, 16287 %or.cond = select i1 undef, i1 true, i1 %_0288 br i1 %or.cond, label %bb1, label %bb2289 290bb1:291 ret void292 293bb2:294 call void @panic()295 unreachable296}297 298attributes #0 = { "split-stack" }299