295 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=thumbv6m | FileCheck %s3; RUN: llc < %s -mtriple=thumbv6m -mattr=+execute-only | FileCheck %s -check-prefix=V6M4; RUN: llc < %s -mtriple=thumbv8m.base -mattr=+execute-only | FileCheck %s -check-prefix=V8MBASE5 6define dso_local i32 @main() #0 {7; CHECK-LABEL: main:8; CHECK: @ %bb.0: @ %entry9; CHECK-NEXT: push {r7, lr}10; CHECK-NEXT: sub sp, #2411; CHECK-NEXT: movs r0, #012; CHECK-NEXT: str r0, [sp, #4]13; CHECK-NEXT: ldr r0, .LCPI0_014; CHECK-NEXT: ldr r0, [r0]15; CHECK-NEXT: str r0, [sp, #20]16; CHECK-NEXT: add r0, sp, #817; CHECK-NEXT: ldrb r0, [r0]18; CHECK-NEXT: ldr r1, [sp, #20]19; CHECK-NEXT: ldr r2, .LCPI0_020; CHECK-NEXT: ldr r2, [r2]21; CHECK-NEXT: cmp r2, r122; CHECK-NEXT: bne .LBB0_223; CHECK-NEXT: @ %bb.1: @ %entry24; CHECK-NEXT: add sp, #2425; CHECK-NEXT: pop {r7, pc}26; CHECK-NEXT: .LBB0_2: @ %entry27; CHECK-NEXT: bl __stack_chk_fail28; CHECK-NEXT: .p2align 229; CHECK-NEXT: @ %bb.3:30; CHECK-NEXT: .LCPI0_0:31; CHECK-NEXT: .long __stack_chk_guard32;33; V6M-LABEL: main:34; V6M: @ %bb.0: @ %entry35; V6M-NEXT: push {r7, lr}36; V6M-NEXT: sub sp, #2437; V6M-NEXT: movs r0, #038; V6M-NEXT: str r0, [sp, #4]39; V6M-NEXT: mrs r12, apsr40; V6M-NEXT: movs r0, :upper8_15:__stack_chk_guard41; V6M-NEXT: lsls r0, r0, #842; V6M-NEXT: adds r0, :upper0_7:__stack_chk_guard43; V6M-NEXT: lsls r0, r0, #844; V6M-NEXT: adds r0, :lower8_15:__stack_chk_guard45; V6M-NEXT: lsls r0, r0, #846; V6M-NEXT: adds r0, :lower0_7:__stack_chk_guard47; V6M-NEXT: msr apsr, r1248; V6M-NEXT: ldr r0, [r0]49; V6M-NEXT: str r0, [sp, #20]50; V6M-NEXT: add r0, sp, #851; V6M-NEXT: ldrb r0, [r0]52; V6M-NEXT: ldr r1, [sp, #20]53; V6M-NEXT: mrs r12, apsr54; V6M-NEXT: movs r2, :upper8_15:__stack_chk_guard55; V6M-NEXT: lsls r2, r2, #856; V6M-NEXT: adds r2, :upper0_7:__stack_chk_guard57; V6M-NEXT: lsls r2, r2, #858; V6M-NEXT: adds r2, :lower8_15:__stack_chk_guard59; V6M-NEXT: lsls r2, r2, #860; V6M-NEXT: adds r2, :lower0_7:__stack_chk_guard61; V6M-NEXT: msr apsr, r1262; V6M-NEXT: ldr r2, [r2]63; V6M-NEXT: cmp r2, r164; V6M-NEXT: bne .LBB0_265; V6M-NEXT: @ %bb.1: @ %entry66; V6M-NEXT: add sp, #2467; V6M-NEXT: pop {r7, pc}68; V6M-NEXT: .LBB0_2: @ %entry69; V6M-NEXT: bl __stack_chk_fail70;71; V8MBASE-LABEL: main:72; V8MBASE: @ %bb.0: @ %entry73; V8MBASE-NEXT: push {r7, lr}74; V8MBASE-NEXT: sub sp, #2475; V8MBASE-NEXT: movs r0, #076; V8MBASE-NEXT: str r0, [sp, #4]77; V8MBASE-NEXT: movw r0, :lower16:__stack_chk_guard78; V8MBASE-NEXT: movt r0, :upper16:__stack_chk_guard79; V8MBASE-NEXT: ldr r0, [r0]80; V8MBASE-NEXT: str r0, [sp, #20]81; V8MBASE-NEXT: add r0, sp, #882; V8MBASE-NEXT: ldrb r0, [r0]83; V8MBASE-NEXT: ldr r1, [sp, #20]84; V8MBASE-NEXT: movw r2, :lower16:__stack_chk_guard85; V8MBASE-NEXT: movt r2, :upper16:__stack_chk_guard86; V8MBASE-NEXT: ldr r2, [r2]87; V8MBASE-NEXT: cmp r2, r188; V8MBASE-NEXT: bne .LBB0_289; V8MBASE-NEXT: @ %bb.1: @ %entry90; V8MBASE-NEXT: add sp, #2491; V8MBASE-NEXT: pop {r7, pc}92; V8MBASE-NEXT: .LBB0_2: @ %entry93; V8MBASE-NEXT: bl __stack_chk_fail94entry:95 %retval = alloca i32, align 496 %buffer = alloca [9 x i8], align 197 store i32 0, ptr %retval, align 498 %arrayidx = getelementptr inbounds [9 x i8], ptr %buffer, i32 0, i32 099 %0 = load i8, ptr %arrayidx, align 1100 %conv = zext i8 %0 to i32101 ret i32 %conv102}103 104@aa = hidden local_unnamed_addr global i32 0, align 4105@bb = hidden local_unnamed_addr global i64 0, align 8106 107define dso_local i64 @cc() local_unnamed_addr #1 {108; CHECK-LABEL: cc:109; CHECK: @ %bb.0: @ %entry110; CHECK-NEXT: push {r4, r5, r7, lr}111; CHECK-NEXT: sub sp, #8112; CHECK-NEXT: movs r0, #1113; CHECK-NEXT: lsls r3, r0, #31114; CHECK-NEXT: ldr r0, .LCPI1_0115; CHECK-NEXT: ldr r2, [r0]116; CHECK-NEXT: asrs r4, r2, #31117; CHECK-NEXT: eors r3, r4118; CHECK-NEXT: ldr r0, .LCPI1_1119; CHECK-NEXT: ldm r0!, {r1, r5}120; CHECK-NEXT: subs r0, r2, r1121; CHECK-NEXT: sbcs r3, r5122; CHECK-NEXT: subs r0, r2, r1123; CHECK-NEXT: ldr r1, .LCPI1_2124; CHECK-NEXT: ldr r1, [r1]125; CHECK-NEXT: str r1, [sp, #4]126; CHECK-NEXT: mov r1, r4127; CHECK-NEXT: sbcs r1, r5128; CHECK-NEXT: ands r3, r4129; CHECK-NEXT: ands r2, r0130; CHECK-NEXT: mov r4, r2131; CHECK-NEXT: orrs r4, r3132; CHECK-NEXT: cmp r4, #0133; CHECK-NEXT: beq .LBB1_2134; CHECK-NEXT: @ %bb.1: @ %entry135; CHECK-NEXT: mov r1, r3136; CHECK-NEXT: .LBB1_2: @ %entry137; CHECK-NEXT: beq .LBB1_4138; CHECK-NEXT: @ %bb.3: @ %entry139; CHECK-NEXT: mov r0, r2140; CHECK-NEXT: .LBB1_4: @ %entry141; CHECK-NEXT: ldr r2, [sp, #4]142; CHECK-NEXT: ldr r3, .LCPI1_2143; CHECK-NEXT: ldr r3, [r3]144; CHECK-NEXT: cmp r3, r2145; CHECK-NEXT: bne .LBB1_6146; CHECK-NEXT: @ %bb.5: @ %entry147; CHECK-NEXT: add sp, #8148; CHECK-NEXT: pop {r4, r5, r7, pc}149; CHECK-NEXT: .LBB1_6: @ %entry150; CHECK-NEXT: bl __stack_chk_fail151; CHECK-NEXT: .p2align 2152; CHECK-NEXT: @ %bb.7:153; CHECK-NEXT: .LCPI1_0:154; CHECK-NEXT: .long aa155; CHECK-NEXT: .LCPI1_1:156; CHECK-NEXT: .long bb157; CHECK-NEXT: .LCPI1_2:158; CHECK-NEXT: .long __stack_chk_guard159;160; V6M-LABEL: cc:161; V6M: @ %bb.0: @ %entry162; V6M-NEXT: push {r4, r5, r7, lr}163; V6M-NEXT: sub sp, #8164; V6M-NEXT: movs r0, #1165; V6M-NEXT: lsls r3, r0, #31166; V6M-NEXT: movs r0, :upper8_15:aa167; V6M-NEXT: lsls r0, r0, #8168; V6M-NEXT: adds r0, :upper0_7:aa169; V6M-NEXT: lsls r0, r0, #8170; V6M-NEXT: adds r0, :lower8_15:aa171; V6M-NEXT: lsls r0, r0, #8172; V6M-NEXT: adds r0, :lower0_7:aa173; V6M-NEXT: ldr r2, [r0]174; V6M-NEXT: asrs r4, r2, #31175; V6M-NEXT: eors r3, r4176; V6M-NEXT: movs r0, :upper8_15:bb177; V6M-NEXT: lsls r0, r0, #8178; V6M-NEXT: adds r0, :upper0_7:bb179; V6M-NEXT: lsls r0, r0, #8180; V6M-NEXT: adds r0, :lower8_15:bb181; V6M-NEXT: lsls r0, r0, #8182; V6M-NEXT: adds r0, :lower0_7:bb183; V6M-NEXT: ldm r0!, {r1, r5}184; V6M-NEXT: subs r0, r2, r1185; V6M-NEXT: sbcs r3, r5186; V6M-NEXT: subs r0, r2, r1187; V6M-NEXT: mrs r12, apsr188; V6M-NEXT: movs r1, :upper8_15:__stack_chk_guard189; V6M-NEXT: lsls r1, r1, #8190; V6M-NEXT: adds r1, :upper0_7:__stack_chk_guard191; V6M-NEXT: lsls r1, r1, #8192; V6M-NEXT: adds r1, :lower8_15:__stack_chk_guard193; V6M-NEXT: lsls r1, r1, #8194; V6M-NEXT: adds r1, :lower0_7:__stack_chk_guard195; V6M-NEXT: msr apsr, r12196; V6M-NEXT: ldr r1, [r1]197; V6M-NEXT: str r1, [sp, #4]198; V6M-NEXT: mov r1, r4199; V6M-NEXT: sbcs r1, r5200; V6M-NEXT: ands r3, r4201; V6M-NEXT: ands r2, r0202; V6M-NEXT: mov r4, r2203; V6M-NEXT: orrs r4, r3204; V6M-NEXT: cmp r4, #0205; V6M-NEXT: beq .LBB1_2206; V6M-NEXT: @ %bb.1: @ %entry207; V6M-NEXT: mov r1, r3208; V6M-NEXT: .LBB1_2: @ %entry209; V6M-NEXT: beq .LBB1_4210; V6M-NEXT: @ %bb.3: @ %entry211; V6M-NEXT: mov r0, r2212; V6M-NEXT: .LBB1_4: @ %entry213; V6M-NEXT: ldr r2, [sp, #4]214; V6M-NEXT: mrs r12, apsr215; V6M-NEXT: movs r3, :upper8_15:__stack_chk_guard216; V6M-NEXT: lsls r3, r3, #8217; V6M-NEXT: adds r3, :upper0_7:__stack_chk_guard218; V6M-NEXT: lsls r3, r3, #8219; V6M-NEXT: adds r3, :lower8_15:__stack_chk_guard220; V6M-NEXT: lsls r3, r3, #8221; V6M-NEXT: adds r3, :lower0_7:__stack_chk_guard222; V6M-NEXT: msr apsr, r12223; V6M-NEXT: ldr r3, [r3]224; V6M-NEXT: cmp r3, r2225; V6M-NEXT: bne .LBB1_6226; V6M-NEXT: @ %bb.5: @ %entry227; V6M-NEXT: add sp, #8228; V6M-NEXT: pop {r4, r5, r7, pc}229; V6M-NEXT: .LBB1_6: @ %entry230; V6M-NEXT: bl __stack_chk_fail231;232; V8MBASE-LABEL: cc:233; V8MBASE: @ %bb.0: @ %entry234; V8MBASE-NEXT: push {r4, r5, r7, lr}235; V8MBASE-NEXT: sub sp, #8236; V8MBASE-NEXT: movs r0, #1237; V8MBASE-NEXT: lsls r3, r0, #31238; V8MBASE-NEXT: movw r0, :lower16:aa239; V8MBASE-NEXT: movt r0, :upper16:aa240; V8MBASE-NEXT: ldr r2, [r0]241; V8MBASE-NEXT: asrs r4, r2, #31242; V8MBASE-NEXT: eors r3, r4243; V8MBASE-NEXT: movw r0, :lower16:bb244; V8MBASE-NEXT: movt r0, :upper16:bb245; V8MBASE-NEXT: ldm r0!, {r1, r5}246; V8MBASE-NEXT: subs r0, r2, r1247; V8MBASE-NEXT: sbcs r3, r5248; V8MBASE-NEXT: subs r0, r2, r1249; V8MBASE-NEXT: movw r1, :lower16:__stack_chk_guard250; V8MBASE-NEXT: movt r1, :upper16:__stack_chk_guard251; V8MBASE-NEXT: ldr r1, [r1]252; V8MBASE-NEXT: str r1, [sp, #4]253; V8MBASE-NEXT: mov r1, r4254; V8MBASE-NEXT: sbcs r1, r5255; V8MBASE-NEXT: ands r3, r4256; V8MBASE-NEXT: ands r2, r0257; V8MBASE-NEXT: mov r4, r2258; V8MBASE-NEXT: orrs r4, r3259; V8MBASE-NEXT: cmp r4, #0260; V8MBASE-NEXT: beq .LBB1_2261; V8MBASE-NEXT: @ %bb.1: @ %entry262; V8MBASE-NEXT: mov r1, r3263; V8MBASE-NEXT: .LBB1_2: @ %entry264; V8MBASE-NEXT: beq .LBB1_4265; V8MBASE-NEXT: @ %bb.3: @ %entry266; V8MBASE-NEXT: mov r0, r2267; V8MBASE-NEXT: .LBB1_4: @ %entry268; V8MBASE-NEXT: ldr r2, [sp, #4]269; V8MBASE-NEXT: movw r3, :lower16:__stack_chk_guard270; V8MBASE-NEXT: movt r3, :upper16:__stack_chk_guard271; V8MBASE-NEXT: ldr r3, [r3]272; V8MBASE-NEXT: cmp r3, r2273; V8MBASE-NEXT: bne .LBB1_6274; V8MBASE-NEXT: @ %bb.5: @ %entry275; V8MBASE-NEXT: add sp, #8276; V8MBASE-NEXT: pop {r4, r5, r7, pc}277; V8MBASE-NEXT: .LBB1_6: @ %entry278; V8MBASE-NEXT: bl __stack_chk_fail279 280entry:281 %0 = load i32, ptr @aa, align 4282 %conv = sext i32 %0 to i64283 %xor = xor i64 %conv, -9223372036854775808284 %1 = load i64, ptr @bb, align 8285 %sub = sub nsw i64 %xor, %1286 %and = and i64 %sub, %conv287 %tobool.not = icmp eq i64 %and, 0288 %sub3 = sub nsw i64 %conv, %1289 %spec.select = select i1 %tobool.not, i64 %sub3, i64 %and290 ret i64 %spec.select291}292 293attributes #0 = { ssp "stack-protector-buffer-size"="8" }294attributes #1 = { sspreq }295