314 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 -pre-RA-sched=source -disable-post-ra | FileCheck %s3; RUN: llc < %s -mtriple=thumbv6m-none-eabi -mcpu=cortex-m0 -pre-RA-sched=source -disable-post-ra -mattr=+strict-align | FileCheck %s --check-prefix=CHECK-T14%struct.x = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 }5 6@src = external global %struct.x7@dst = external global %struct.x8 9@.str1 = private unnamed_addr constant [31 x i8] c"DHRYSTONE PROGRAM, SOME STRING\00", align 110@.str2 = private unnamed_addr constant [36 x i8] c"DHRYSTONE PROGRAM, SOME STRING BLAH\00", align 111@.str3 = private unnamed_addr constant [24 x i8] c"DHRYSTONE PROGRAM, SOME\00", align 112@.str4 = private unnamed_addr constant [18 x i8] c"DHRYSTONE PROGR \00", align 113@.str5 = private unnamed_addr constant [7 x i8] c"DHRYST\00", align 114@.str6 = private unnamed_addr constant [14 x i8] c"/tmp/rmXXXXXX\00", align 115@empty = private unnamed_addr constant [31 x i8] zeroinitializer, align 116@spool.splbuf = internal global [512 x i8] zeroinitializer, align 1617 18define i32 @t0() {19; CHECK-LABEL: t0:20; CHECK: @ %bb.0: @ %entry21; CHECK-NEXT: movw r0, :lower16:(L_dst$non_lazy_ptr-(LPC0_0+4))22; CHECK-NEXT: movt r0, :upper16:(L_dst$non_lazy_ptr-(LPC0_0+4))23; CHECK-NEXT: LPC0_0:24; CHECK-NEXT: add r0, pc25; CHECK-NEXT: ldr r0, [r0]26; CHECK-NEXT: movw r1, :lower16:(L_src$non_lazy_ptr-(LPC0_1+4))27; CHECK-NEXT: movt r1, :upper16:(L_src$non_lazy_ptr-(LPC0_1+4))28; CHECK-NEXT: LPC0_1:29; CHECK-NEXT: add r1, pc30; CHECK-NEXT: ldr r1, [r1]31; CHECK-NEXT: ldr.w r2, [r1, #7]32; CHECK-NEXT: str.w r2, [r0, #7]33; CHECK-NEXT: vldr d16, [r1]34; CHECK-NEXT: vstr d16, [r0]35; CHECK-NEXT: movs r0, #036; CHECK-NEXT: bx lr37;38; CHECK-T1-LABEL: t0:39; CHECK-T1: @ %bb.0: @ %entry40; CHECK-T1-NEXT: ldr r0, .LCPI0_041; CHECK-T1-NEXT: ldrb r1, [r0, #10]42; CHECK-T1-NEXT: ldr r2, .LCPI0_143; CHECK-T1-NEXT: strb r1, [r2, #10]44; CHECK-T1-NEXT: ldrh r1, [r0, #8]45; CHECK-T1-NEXT: strh r1, [r2, #8]46; CHECK-T1-NEXT: ldr r1, [r0]47; CHECK-T1-NEXT: ldr r0, [r0, #4]48; CHECK-T1-NEXT: str r1, [r2]49; CHECK-T1-NEXT: str r0, [r2, #4]50; CHECK-T1-NEXT: movs r0, #051; CHECK-T1-NEXT: bx lr52; CHECK-T1-NEXT: .p2align 253; CHECK-T1-NEXT: @ %bb.1:54; CHECK-T1-NEXT: .LCPI0_0:55; CHECK-T1-NEXT: .long src56; CHECK-T1-NEXT: .LCPI0_1:57; CHECK-T1-NEXT: .long dst58entry:59 call void @llvm.memcpy.p0.p0.i32(ptr align 8 @dst, ptr align 8 @src, i32 11, i1 false)60 ret i32 061}62 63define void @t1(ptr nocapture %C) nounwind {64; CHECK-LABEL: t1:65; CHECK: @ %bb.0: @ %entry66; CHECK-NEXT: movw r1, :lower16:(L_.str1-(LPC1_0+4))67; CHECK-NEXT: movt r1, :upper16:(L_.str1-(LPC1_0+4))68; CHECK-NEXT: LPC1_0:69; CHECK-NEXT: add r1, pc70; CHECK-NEXT: movs r2, #1571; CHECK-NEXT: vld1.8 {d16, d17}, [r1], r272; CHECK-NEXT: vst1.8 {d16, d17}, [r0], r273; CHECK-NEXT: vld1.8 {d16, d17}, [r1]74; CHECK-NEXT: vst1.8 {d16, d17}, [r0]75; CHECK-NEXT: bx lr76;77; CHECK-T1-LABEL: t1:78; CHECK-T1: @ %bb.0: @ %entry79; CHECK-T1-NEXT: .save {r7, lr}80; CHECK-T1-NEXT: push {r7, lr}81; CHECK-T1-NEXT: ldr r1, .LCPI1_082; CHECK-T1-NEXT: movs r2, #3183; CHECK-T1-NEXT: bl __aeabi_memcpy84; CHECK-T1-NEXT: pop {r7, pc}85; CHECK-T1-NEXT: .p2align 286; CHECK-T1-NEXT: @ %bb.1:87; CHECK-T1-NEXT: .LCPI1_0:88; CHECK-T1-NEXT: .long .L.str189entry:90 tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str1, i64 31, i1 false)91 ret void92}93 94define void @t2(ptr nocapture %C) nounwind {95; CHECK-LABEL: t2:96; CHECK: @ %bb.0: @ %entry97; CHECK-NEXT: movw r1, :lower16:(L_.str2-(LPC2_0+4))98; CHECK-NEXT: movt r1, :upper16:(L_.str2-(LPC2_0+4))99; CHECK-NEXT: LPC2_0:100; CHECK-NEXT: add r1, pc101; CHECK-NEXT: vld1.8 {d16, d17}, [r1]!102; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!103; CHECK-NEXT: vld1.64 {d16, d17}, [r1]104; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!105; CHECK-NEXT: movw r1, #16716106; CHECK-NEXT: movt r1, #72107; CHECK-NEXT: str r1, [r0]108; CHECK-NEXT: bx lr109;110; CHECK-T1-LABEL: t2:111; CHECK-T1: @ %bb.0: @ %entry112; CHECK-T1-NEXT: .save {r7, lr}113; CHECK-T1-NEXT: push {r7, lr}114; CHECK-T1-NEXT: ldr r1, .LCPI2_0115; CHECK-T1-NEXT: movs r2, #36116; CHECK-T1-NEXT: bl __aeabi_memcpy117; CHECK-T1-NEXT: pop {r7, pc}118; CHECK-T1-NEXT: .p2align 2119; CHECK-T1-NEXT: @ %bb.1:120; CHECK-T1-NEXT: .LCPI2_0:121; CHECK-T1-NEXT: .long .L.str2122entry:123 tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str2, i64 36, i1 false)124 ret void125}126 127define void @t3(ptr nocapture %C) nounwind {128; CHECK-LABEL: t3:129; CHECK: @ %bb.0: @ %entry130; CHECK-NEXT: movw r1, :lower16:(L_.str3-(LPC3_0+4))131; CHECK-NEXT: movt r1, :upper16:(L_.str3-(LPC3_0+4))132; CHECK-NEXT: LPC3_0:133; CHECK-NEXT: add r1, pc134; CHECK-NEXT: vld1.8 {d16, d17}, [r1]!135; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!136; CHECK-NEXT: vldr d16, [r1]137; CHECK-NEXT: vst1.8 {d16}, [r0]138; CHECK-NEXT: bx lr139;140; CHECK-T1-LABEL: t3:141; CHECK-T1: @ %bb.0: @ %entry142; CHECK-T1-NEXT: .save {r7, lr}143; CHECK-T1-NEXT: push {r7, lr}144; CHECK-T1-NEXT: ldr r1, .LCPI3_0145; CHECK-T1-NEXT: movs r2, #24146; CHECK-T1-NEXT: bl __aeabi_memcpy147; CHECK-T1-NEXT: pop {r7, pc}148; CHECK-T1-NEXT: .p2align 2149; CHECK-T1-NEXT: @ %bb.1:150; CHECK-T1-NEXT: .LCPI3_0:151; CHECK-T1-NEXT: .long .L.str3152entry:153 tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str3, i64 24, i1 false)154 ret void155}156 157define void @t4(ptr nocapture %C) nounwind {158; CHECK-LABEL: t4:159; CHECK: @ %bb.0: @ %entry160; CHECK-NEXT: movw r1, :lower16:(L_.str4-(LPC4_0+4))161; CHECK-NEXT: movt r1, :upper16:(L_.str4-(LPC4_0+4))162; CHECK-NEXT: LPC4_0:163; CHECK-NEXT: add r1, pc164; CHECK-NEXT: vld1.64 {d16, d17}, [r1]165; CHECK-NEXT: vst1.8 {d16, d17}, [r0]!166; CHECK-NEXT: movs r1, #32167; CHECK-NEXT: strh r1, [r0]168; CHECK-NEXT: bx lr169;170; CHECK-T1-LABEL: t4:171; CHECK-T1: @ %bb.0: @ %entry172; CHECK-T1-NEXT: .save {r7, lr}173; CHECK-T1-NEXT: push {r7, lr}174; CHECK-T1-NEXT: ldr r1, .LCPI4_0175; CHECK-T1-NEXT: movs r2, #18176; CHECK-T1-NEXT: bl __aeabi_memcpy177; CHECK-T1-NEXT: pop {r7, pc}178; CHECK-T1-NEXT: .p2align 2179; CHECK-T1-NEXT: @ %bb.1:180; CHECK-T1-NEXT: .LCPI4_0:181; CHECK-T1-NEXT: .long .L.str4182entry:183 tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str4, i64 18, i1 false)184 ret void185}186 187define void @t5(ptr nocapture %C) nounwind {188; CHECK-LABEL: t5:189; CHECK: @ %bb.0: @ %entry190; CHECK-NEXT: movw r1, #21337191; CHECK-NEXT: movt r1, #84192; CHECK-NEXT: str.w r1, [r0, #3]193; CHECK-NEXT: movw r1, #18500194; CHECK-NEXT: movt r1, #22866195; CHECK-NEXT: str r1, [r0]196; CHECK-NEXT: bx lr197;198; CHECK-T1-LABEL: t5:199; CHECK-T1: @ %bb.0: @ %entry200; CHECK-T1-NEXT: .save {r7, lr}201; CHECK-T1-NEXT: push {r7, lr}202; CHECK-T1-NEXT: ldr r1, .LCPI5_0203; CHECK-T1-NEXT: movs r2, #7204; CHECK-T1-NEXT: bl __aeabi_memcpy205; CHECK-T1-NEXT: pop {r7, pc}206; CHECK-T1-NEXT: .p2align 2207; CHECK-T1-NEXT: @ %bb.1:208; CHECK-T1-NEXT: .LCPI5_0:209; CHECK-T1-NEXT: .long .L.str5210entry:211 tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str5, i64 7, i1 false)212 ret void213}214 215define void @t6() nounwind {216; CHECK-LABEL: t6:217; CHECK: @ %bb.0: @ %entry218; CHECK-NEXT: movw r0, :lower16:(L_.str6-(LPC6_0+4))219; CHECK-NEXT: movt r0, :upper16:(L_.str6-(LPC6_0+4))220; CHECK-NEXT: LPC6_0:221; CHECK-NEXT: add r0, pc222; CHECK-NEXT: vldr d16, [r0]223; CHECK-NEXT: movw r1, :lower16:(_spool.splbuf-(LPC6_1+4))224; CHECK-NEXT: movt r1, :upper16:(_spool.splbuf-(LPC6_1+4))225; CHECK-NEXT: LPC6_1:226; CHECK-NEXT: add r1, pc227; CHECK-NEXT: vstr d16, [r1]228; CHECK-NEXT: adds r1, #6229; CHECK-NEXT: adds r0, #6230; CHECK-NEXT: vld1.16 {d16}, [r0]231; CHECK-NEXT: vst1.16 {d16}, [r1]232; CHECK-NEXT: bx lr233;234; CHECK-T1-LABEL: t6:235; CHECK-T1: @ %bb.0: @ %entry236; CHECK-T1-NEXT: ldr r0, .LCPI6_0237; CHECK-T1-NEXT: movs r1, #88238; CHECK-T1-NEXT: strh r1, [r0, #12]239; CHECK-T1-NEXT: ldr r1, .LCPI6_1240; CHECK-T1-NEXT: ldr r2, .LCPI6_2241; CHECK-T1-NEXT: ldr r3, .LCPI6_3242; CHECK-T1-NEXT: str r3, [r0]243; CHECK-T1-NEXT: str r2, [r0, #4]244; CHECK-T1-NEXT: str r1, [r0, #8]245; CHECK-T1-NEXT: bx lr246; CHECK-T1-NEXT: .p2align 2247; CHECK-T1-NEXT: @ %bb.1:248; CHECK-T1-NEXT: .LCPI6_0:249; CHECK-T1-NEXT: .long spool.splbuf250; CHECK-T1-NEXT: .LCPI6_1:251; CHECK-T1-NEXT: .long 1482184792 @ 0x58585858252; CHECK-T1-NEXT: .LCPI6_2:253; CHECK-T1-NEXT: .long 1483567663 @ 0x586d722f254; CHECK-T1-NEXT: .LCPI6_3:255; CHECK-T1-NEXT: .long 1886221359 @ 0x706d742f256entry:257 call void @llvm.memcpy.p0.p0.i64(ptr @spool.splbuf, ptr @.str6, i64 14, i1 false)258 ret void259}260 261%struct.Foo = type { i32, i32, i32, i32 }262 263define void @t7(ptr nocapture %a, ptr nocapture %b) nounwind {264; CHECK-LABEL: t7:265; CHECK: @ %bb.0: @ %entry266; CHECK-NEXT: vld1.32 {d16, d17}, [r1]267; CHECK-NEXT: vst1.32 {d16, d17}, [r0]268; CHECK-NEXT: bx lr269;270; CHECK-T1-LABEL: t7:271; CHECK-T1: @ %bb.0: @ %entry272; CHECK-T1-NEXT: ldr r2, [r1, #12]273; CHECK-T1-NEXT: str r2, [r0, #12]274; CHECK-T1-NEXT: ldr r2, [r1, #8]275; CHECK-T1-NEXT: str r2, [r0, #8]276; CHECK-T1-NEXT: ldr r2, [r1, #4]277; CHECK-T1-NEXT: str r2, [r0, #4]278; CHECK-T1-NEXT: ldr r1, [r1]279; CHECK-T1-NEXT: str r1, [r0]280; CHECK-T1-NEXT: bx lr281entry:282 tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 %b, i32 16, i1 false)283 ret void284}285 286define void @copy_from_zero_constant(ptr nocapture %C) nounwind {287; CHECK-LABEL: copy_from_zero_constant:288; CHECK: @ %bb.0: @ %entry289; CHECK-NEXT: vmov.i32 q8, #0x0290; CHECK-NEXT: movs r1, #15291; CHECK-NEXT: vst1.8 {d16, d17}, [r0], r1292; CHECK-NEXT: vst1.8 {d16, d17}, [r0]293; CHECK-NEXT: bx lr294;295; CHECK-T1-LABEL: copy_from_zero_constant:296; CHECK-T1: @ %bb.0: @ %entry297; CHECK-T1-NEXT: .save {r7, lr}298; CHECK-T1-NEXT: push {r7, lr}299; CHECK-T1-NEXT: ldr r1, .LCPI8_0300; CHECK-T1-NEXT: movs r2, #31301; CHECK-T1-NEXT: bl __aeabi_memcpy302; CHECK-T1-NEXT: pop {r7, pc}303; CHECK-T1-NEXT: .p2align 2304; CHECK-T1-NEXT: @ %bb.1:305; CHECK-T1-NEXT: .LCPI8_0:306; CHECK-T1-NEXT: .long .Lempty307entry:308 tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @empty, i64 31, i1 false)309 ret void310}311 312declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind313declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind314