xref: /aosp_15_r20/external/llvm/test/CodeGen/Thumb/ldm-stm-base-materialization.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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