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