1; RUN: llc < %s -mtriple=thumbv6m-eabi -verify-machineinstrs -o - | FileCheck %s 2target datalayout = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-v128:64:128-a:0:32-n32-S64" 3target triple = "thumbv6m-none--eabi" 4 5@a = external global ptr 6@b = external global ptr 7 8; Function Attrs: nounwind 9define void @foo24() #0 { 10entry: 11; CHECK-LABEL: foo24: 12; CHECK: ldr r[[LB:[0-9]]], .LCPI 13; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4 14; CHECK: ldr r[[SB:[0-9]]], .LCPI 15; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4 16; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]} 17; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]} 18; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]} 19; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]} 20 %0 = load ptr, ptr @a, align 4 21 %arrayidx = getelementptr inbounds i32, ptr %0, i32 1 22 %1 = load ptr, ptr @b, align 4 23 %arrayidx1 = getelementptr inbounds i32, ptr %1, i32 1 24 tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %arrayidx, ptr align 4 %arrayidx1, i32 24, i1 false) 25 ret void 26} 27 28define void @foo28() #0 { 29entry: 30; CHECK-LABEL: foo28: 31; CHECK: ldr r[[LB:[0-9]]], .LCPI 32; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4 33; CHECK: ldr r[[SB:[0-9]]], .LCPI 34; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4 35; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]} 36; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]} 37; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]], r[[R4:[0-9]]]} 38; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]], r[[R4]]} 39 %0 = load ptr, ptr @a, align 4 40 %arrayidx = getelementptr inbounds i32, ptr %0, i32 1 41 %1 = load ptr, ptr @b, align 4 42 %arrayidx1 = getelementptr inbounds i32, ptr %1, i32 1 43 tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %arrayidx, ptr align 4 %arrayidx1, i32 28, i1 false) 44 ret void 45} 46 47define void @foo32() #0 { 48entry: 49; CHECK-LABEL: foo32: 50; CHECK: ldr r[[LB:[0-9]]], .LCPI 51; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4 52; CHECK: ldr r[[SB:[0-9]]], .LCPI 53; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4 54; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]], r[[R4:[0-9]]]} 55; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]], r[[R4]]} 56; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]], r[[R4:[0-9]]]} 57; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]], r[[R4]]} 58 %0 = load ptr, ptr @a, align 4 59 %arrayidx = getelementptr inbounds i32, ptr %0, i32 1 60 %1 = load ptr, ptr @b, align 4 61 %arrayidx1 = getelementptr inbounds i32, ptr %1, i32 1 62 tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %arrayidx, ptr align 4 %arrayidx1, i32 32, i1 false) 63 ret void 64} 65 66define void @foo36() #0 { 67entry: 68; CHECK-LABEL: foo36: 69; CHECK: ldr r[[LB:[0-9]]], .LCPI 70; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4 71; CHECK: ldr r[[SB:[0-9]]], .LCPI 72; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4 73; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]} 74; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]} 75; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]} 76; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]} 77; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]} 78; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]} 79 %0 = load ptr, ptr @a, align 4 80 %arrayidx = getelementptr inbounds i32, ptr %0, i32 1 81 %1 = load ptr, ptr @b, align 4 82 %arrayidx1 = getelementptr inbounds i32, ptr %1, i32 1 83 tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %arrayidx, ptr align 4 %arrayidx1, i32 36, i1 false) 84 ret void 85} 86 87; Function Attrs: nounwind 88declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture readonly, i32, i1) #1 89