304 lines · plain
1; RUN: llc < %s -mtriple=arm-linux-androideabi -mattr=+v4t -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android2; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -mattr=+v4t -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux3 4; We used to crash with filetype=obj5; RUN: llc < %s -mtriple=arm-linux-androideabi -filetype=obj6; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj7 8 9; Just to prevent the alloca from being optimized away10declare void @dummy_use(ptr, i32)11 12define void @test_basic() #0 {13 %mem = alloca i32, i32 1014 call void @dummy_use (ptr %mem, i32 10)15 ret void16 17; ARM-linux-LABEL: test_basic:18 19; ARM-linux: push {r4, r5}20; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #321; ARM-linux-NEXT: mov r5, sp22; ARM-linux-NEXT: ldr r4, [r4, #4]23; ARM-linux-NEXT: cmp r4, r524; ARM-linux-NEXT: bls .LBB0_225 26; ARM-linux: mov r4, #4827; ARM-linux-NEXT: mov r5, #028; ARM-linux-NEXT: stmdb sp!, {lr}29; ARM-linux-NEXT: bl __morestack30; ARM-linux-NEXT: ldm sp!, {lr}31; ARM-linux-NEXT: pop {r4, r5}32; ARM-linux-NEXT: bx lr33 34; ARM-linux: pop {r4, r5}35 36; ARM-android-LABEL: test_basic:37 38; ARM-android: push {r4, r5}39; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #340; ARM-android-NEXT: mov r5, sp41; ARM-android-NEXT: ldr r4, [r4, #252]42; ARM-android-NEXT: cmp r4, r543; ARM-android-NEXT: bls .LBB0_244 45; ARM-android: mov r4, #4846; ARM-android-NEXT: mov r5, #047; ARM-android-NEXT: stmdb sp!, {lr}48; ARM-android-NEXT: bl __morestack49; ARM-android-NEXT: ldm sp!, {lr}50; ARM-android-NEXT: pop {r4, r5}51; ARM-android-NEXT: bx lr52 53; ARM-android: pop {r4, r5}54 55}56 57define i32 @test_nested(ptr nest %closure, i32 %other) #0 {58 %addend = load i32 , ptr %closure59 %result = add i32 %other, %addend60 %mem = alloca i32, i32 1061 call void @dummy_use (ptr %mem, i32 10)62 ret i32 %result63 64; ARM-linux-LABEL: test_nested:65 66; ARM-linux: push {r4, r5}67; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #368; ARM-linux-NEXT: mov r5, sp69; ARM-linux-NEXT: ldr r4, [r4, #4]70; ARM-linux-NEXT: cmp r4, r571; ARM-linux-NEXT: bls .LBB1_272 73; ARM-linux: mov r4, #5674; ARM-linux-NEXT: mov r5, #075; ARM-linux-NEXT: stmdb sp!, {lr}76; ARM-linux-NEXT: bl __morestack77; ARM-linux-NEXT: ldm sp!, {lr}78; ARM-linux-NEXT: pop {r4, r5}79; ARM-linux-NEXT: bx lr80 81; ARM-linux: pop {r4, r5}82 83; ARM-android-LABEL: test_nested:84 85; ARM-android: push {r4, r5}86; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #387; ARM-android-NEXT: mov r5, sp88; ARM-android-NEXT: ldr r4, [r4, #252]89; ARM-android-NEXT: cmp r4, r590; ARM-android-NEXT: bls .LBB1_291 92; ARM-android: mov r4, #5693; ARM-android-NEXT: mov r5, #094; ARM-android-NEXT: stmdb sp!, {lr}95; ARM-android-NEXT: bl __morestack96; ARM-android-NEXT: ldm sp!, {lr}97; ARM-android-NEXT: pop {r4, r5}98; ARM-android-NEXT: bx lr99 100; ARM-android: pop {r4, r5}101 102}103 104define void @test_large() #0 {105 %mem = alloca i32, i32 10000106 call void @dummy_use (ptr %mem, i32 0)107 ret void108 109; ARM-linux-LABEL: test_large:110 111; ARM-linux: push {r4, r5}112; ARM-linux-NEXT: ldr r4, .LCPI2_0113; ARM-linux-NEXT: sub r5, sp, r4114; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3115; ARM-linux-NEXT: ldr r4, [r4, #4]116; ARM-linux-NEXT: cmp r4, r5117; ARM-linux-NEXT: bls .LBB2_2118 119; ARM-linux: ldr r4, .LCPI2_0120; ARM-linux-NEXT: mov r5, #0121; ARM-linux-NEXT: stmdb sp!, {lr}122; ARM-linux-NEXT: bl __morestack123; ARM-linux-NEXT: ldm sp!, {lr}124; ARM-linux-NEXT: pop {r4, r5}125; ARM-linux-NEXT: bx lr126 127; ARM-linux: pop {r4, r5}128 129; ARM-linux: .LCPI2_0:130; ARM-linux-NEXT: .long 40192131 132; ARM-android-LABEL: test_large:133 134; ARM-android: push {r4, r5}135; ARM-android-NEXT: ldr r4, .LCPI2_0136; ARM-android-NEXT: sub r5, sp, r4137; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3138; ARM-android-NEXT: ldr r4, [r4, #252]139; ARM-android-NEXT: cmp r4, r5140; ARM-android-NEXT: bls .LBB2_2141 142; ARM-android: ldr r4, .LCPI2_0143; ARM-android-NEXT: mov r5, #0144; ARM-android-NEXT: stmdb sp!, {lr}145; ARM-android-NEXT: bl __morestack146; ARM-android-NEXT: ldm sp!, {lr}147; ARM-android-NEXT: pop {r4, r5}148; ARM-android-NEXT: bx lr149 150; ARM-android: pop {r4, r5}151 152; ARM-android: .LCPI2_0:153; ARM-android-NEXT: .long 40192154 155}156 157define fastcc void @test_fastcc() #0 {158 %mem = alloca i32, i32 10159 call void @dummy_use (ptr %mem, i32 10)160 ret void161 162; ARM-linux-LABEL: test_fastcc:163 164; ARM-linux: push {r4, r5}165; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3166; ARM-linux-NEXT: mov r5, sp167; ARM-linux-NEXT: ldr r4, [r4, #4]168; ARM-linux-NEXT: cmp r4, r5169; ARM-linux-NEXT: bls .LBB3_2170 171; ARM-linux: mov r4, #48172; ARM-linux-NEXT: mov r5, #0173; ARM-linux-NEXT: stmdb sp!, {lr}174; ARM-linux-NEXT: bl __morestack175; ARM-linux-NEXT: ldm sp!, {lr}176; ARM-linux-NEXT: pop {r4, r5}177; ARM-linux-NEXT: bx lr178 179; ARM-linux: pop {r4, r5}180 181; ARM-android-LABEL: test_fastcc:182 183; ARM-android: push {r4, r5}184; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3185; ARM-android-NEXT: mov r5, sp186; ARM-android-NEXT: ldr r4, [r4, #252]187; ARM-android-NEXT: cmp r4, r5188; ARM-android-NEXT: bls .LBB3_2189 190; ARM-android: mov r4, #48191; ARM-android-NEXT: mov r5, #0192; ARM-android-NEXT: stmdb sp!, {lr}193; ARM-android-NEXT: bl __morestack194; ARM-android-NEXT: ldm sp!, {lr}195; ARM-android-NEXT: pop {r4, r5}196; ARM-android-NEXT: bx lr197 198; ARM-android: pop {r4, r5}199 200}201 202define fastcc void @test_fastcc_large() #0 {203 %mem = alloca i32, i32 10000204 call void @dummy_use (ptr %mem, i32 0)205 ret void206 207; ARM-linux-LABEL: test_fastcc_large:208 209; ARM-linux: push {r4, r5}210; ARM-linux-NEXT: ldr r4, .LCPI4_0211; ARM-linux-NEXT: sub r5, sp, r4212; ARM-linux-NEXT: mrc p15, #0, r4, c13, c0, #3213; ARM-linux-NEXT: ldr r4, [r4, #4]214; ARM-linux-NEXT: cmp r4, r5215; ARM-linux-NEXT: bls .LBB4_2216 217; ARM-linux: ldr r4, .LCPI4_0218; ARM-linux-NEXT: mov r5, #0219; ARM-linux-NEXT: stmdb sp!, {lr}220; ARM-linux-NEXT: bl __morestack221; ARM-linux-NEXT: ldm sp!, {lr}222; ARM-linux-NEXT: pop {r4, r5}223; ARM-linux-NEXT: bx lr224 225; ARM-linux: pop {r4, r5}226 227; ARM-linux: .LCPI4_0:228; ARM-linux-NEXT: .long 40192229 230; ARM-android-LABEL: test_fastcc_large:231 232; ARM-android: push {r4, r5}233; ARM-android-NEXT: ldr r4, .LCPI4_0234; ARM-android-NEXT: sub r5, sp, r4235; ARM-android-NEXT: mrc p15, #0, r4, c13, c0, #3236; ARM-android-NEXT: ldr r4, [r4, #252]237; ARM-android-NEXT: cmp r4, r5238; ARM-android-NEXT: bls .LBB4_2239 240; ARM-android: ldr r4, .LCPI4_0241; ARM-android-NEXT: mov r5, #0242; ARM-android-NEXT: stmdb sp!, {lr}243; ARM-android-NEXT: bl __morestack244; ARM-android-NEXT: ldm sp!, {lr}245; ARM-android-NEXT: pop {r4, r5}246; ARM-android-NEXT: bx lr247 248; ARM-android: pop {r4, r5}249 250; ARM-android: .LCPI4_0:251; ARM-android-NEXT: .long 40192252 253}254 255define void @test_nostack() #0 {256 ret void257 258; ARM-linux-LABEL: test_nostack:259; ARM-linux-NOT: bl __morestack260 261; ARM-android-LABEL: test_nostack:262; ARM-android-NOT: bl __morestack263}264 265; Test to make sure that a morestack call is generated if there is a266; sibling call, even if the function in question has no stack frame267; (PR37807).268 269declare i32 @callee(i32)270 271define i32 @test_sibling_call_empty_frame(i32 %x) #0 {272 %call = tail call i32 @callee(i32 %x) #0273 ret i32 %call274 275; ARM-linux-LABEL: test_sibling_call_empty_frame:276; ARM-linux: bl __morestack277 278; ARM-android-LABEL: test_sibling_call_empty_frame:279; ARM-android: bl __morestack280 281}282 283 284declare void @panic() unnamed_addr285 286; We used to crash while compiling the following function.287; ARM-linux-LABEL: build_should_not_segfault:288; ARM-android-LABEL: build_should_not_segfault:289define void @build_should_not_segfault(i8 %x) unnamed_addr #0 {290start:291 %_0 = icmp ult i8 %x, 16292 %or.cond = select i1 undef, i1 true, i1 %_0293 br i1 %or.cond, label %bb1, label %bb2294 295bb1:296 ret void297 298bb2:299 call void @panic()300 unreachable301}302 303attributes #0 = { "split-stack" }304