blob: 0be796eb8f8dfcd3cecc4c4419225ba711b77703 [file] [log] [blame]
Moritz Rothdfdda0d2014-08-21 17:11:03 +00001; 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 i32*
6@b = external global i32*
7
8; Function Attrs: nounwind
Scott Douglass953f9082015-10-05 14:49:54 +00009define void @foo24() #0 {
Moritz Rothdfdda0d2014-08-21 17:11:03 +000010entry:
Scott Douglass953f9082015-10-05 14:49:54 +000011; CHECK-LABEL: foo24:
Moritz Rothdfdda0d2014-08-21 17:11:03 +000012; CHECK: ldr r[[LB:[0-9]]], .LCPI
13; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4
Scott Douglass953f9082015-10-05 14:49:54 +000014; CHECK: ldr r[[SB:[0-9]]], .LCPI
Moritz Rothdfdda0d2014-08-21 17:11:03 +000015; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4
Scott Douglass953f9082015-10-05 14:49:54 +000016; 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]]}
David Blaikiea79ac142015-02-27 21:17:42 +000020 %0 = load i32*, i32** @a, align 4
David Blaikie79e6c742015-02-27 19:29:02 +000021 %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
Moritz Rothdfdda0d2014-08-21 17:11:03 +000022 %1 = bitcast i32* %arrayidx to i8*
David Blaikiea79ac142015-02-27 21:17:42 +000023 %2 = load i32*, i32** @b, align 4
David Blaikie79e6c742015-02-27 19:29:02 +000024 %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
Moritz Rothdfdda0d2014-08-21 17:11:03 +000025 %3 = bitcast i32* %arrayidx1 to i8*
Pete Cooper67cf9a72015-11-19 05:56:52 +000026 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 24, i32 4, i1 false)
Moritz Rothdfdda0d2014-08-21 17:11:03 +000027 ret void
28}
29
Scott Douglass953f9082015-10-05 14:49:54 +000030define void @foo28() #0 {
31entry:
32; CHECK-LABEL: foo28:
33; CHECK: ldr r[[LB:[0-9]]], .LCPI
34; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4
35; CHECK: ldr r[[SB:[0-9]]], .LCPI
36; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4
37; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]}
38; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]}
39; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]], r[[R4:[0-9]]]}
40; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]], r[[R4]]}
41 %0 = load i32*, i32** @a, align 4
42 %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
43 %1 = bitcast i32* %arrayidx to i8*
44 %2 = load i32*, i32** @b, align 4
45 %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
46 %3 = bitcast i32* %arrayidx1 to i8*
Pete Cooper67cf9a72015-11-19 05:56:52 +000047 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 28, i32 4, i1 false)
Scott Douglass953f9082015-10-05 14:49:54 +000048 ret void
49}
50
51define void @foo32() #0 {
52entry:
53; CHECK-LABEL: foo32:
54; CHECK: ldr r[[LB:[0-9]]], .LCPI
55; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4
56; CHECK: ldr r[[SB:[0-9]]], .LCPI
57; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4
58; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]], r[[R4:[0-9]]]}
59; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]], r[[R4]]}
60; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]], r[[R4:[0-9]]]}
61; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]], r[[R4]]}
62 %0 = load i32*, i32** @a, align 4
63 %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
64 %1 = bitcast i32* %arrayidx to i8*
65 %2 = load i32*, i32** @b, align 4
66 %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
67 %3 = bitcast i32* %arrayidx1 to i8*
Pete Cooper67cf9a72015-11-19 05:56:52 +000068 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 32, i32 4, i1 false)
Scott Douglass953f9082015-10-05 14:49:54 +000069 ret void
70}
71
72define void @foo36() #0 {
73entry:
74; CHECK-LABEL: foo36:
75; CHECK: ldr r[[LB:[0-9]]], .LCPI
76; CHECK: adds r[[NLB:[0-9]]], r[[LB]], #4
77; CHECK: ldr r[[SB:[0-9]]], .LCPI
78; CHECK: adds r[[NSB:[0-9]]], r[[SB]], #4
79; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]}
80; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]}
81; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]}
82; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]}
83; CHECK-NEXT: ldm r[[NLB]]!, {r[[R1:[0-9]]], r[[R2:[0-9]]], r[[R3:[0-9]]]}
84; CHECK-NEXT: stm r[[NSB]]!, {r[[R1]], r[[R2]], r[[R3]]}
85 %0 = load i32*, i32** @a, align 4
86 %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
87 %1 = bitcast i32* %arrayidx to i8*
88 %2 = load i32*, i32** @b, align 4
89 %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
90 %3 = bitcast i32* %arrayidx1 to i8*
Pete Cooper67cf9a72015-11-19 05:56:52 +000091 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 36, i32 4, i1 false)
Scott Douglass953f9082015-10-05 14:49:54 +000092 ret void
93}
94
Moritz Rothdfdda0d2014-08-21 17:11:03 +000095; Function Attrs: nounwind
Pete Cooper67cf9a72015-11-19 05:56:52 +000096declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #1