xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/ldm-stm-base-materialization.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple armv7a-none-eabi -mattr=-neon < %s -verify-machineinstrs -o - | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Thumb1 (thumbv6m) is tested in tests/Thumb
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; We use '[rl0-9]*' to allow 'r0'..'r12', 'lr'
13*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b
14*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a
15*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4
16*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]], [[R5:[rl0-9]+]], [[R6:[rl0-9]+]]}
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]], [[R5]], [[R6]]}
19*9880d681SAndroid Build Coastguard Worker  %0 = load i32*, i32** @a, align 4
20*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
21*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i32* %arrayidx to i8*
22*9880d681SAndroid Build Coastguard Worker  %2 = load i32*, i32** @b, align 4
23*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
24*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i32* %arrayidx1 to i8*
25*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 24, i32 4, i1 false)
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine void @foo28() #0 {
30*9880d681SAndroid Build Coastguard Workerentry:
31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo28:
32*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b
33*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a
34*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4
35*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]]!, {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]]}
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]]!, {[[R1]], [[R2]], [[R3]]}
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]}
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]]}
40*9880d681SAndroid Build Coastguard Worker  %0 = load i32*, i32** @a, align 4
41*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
42*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i32* %arrayidx to i8*
43*9880d681SAndroid Build Coastguard Worker  %2 = load i32*, i32** @b, align 4
44*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
45*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i32* %arrayidx1 to i8*
46*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 28, i32 4, i1 false)
47*9880d681SAndroid Build Coastguard Worker  ret void
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine void @foo32() #0 {
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo32:
53*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b
54*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a
55*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4
56*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]]!, {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]}
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]]!, {[[R1]], [[R2]], [[R3]], [[R4]]}
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]}
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]]}
61*9880d681SAndroid Build Coastguard Worker  %0 = load i32*, i32** @a, align 4
62*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
63*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i32* %arrayidx to i8*
64*9880d681SAndroid Build Coastguard Worker  %2 = load i32*, i32** @b, align 4
65*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
66*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i32* %arrayidx1 to i8*
67*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 32, i32 4, i1 false)
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine void @foo36() #0 {
72*9880d681SAndroid Build Coastguard Workerentry:
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo36:
74*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[LB:[rl0-9]+]], :upper16:b
75*9880d681SAndroid Build Coastguard Worker; CHECK: movt [[SB:[rl0-9]+]], :upper16:a
76*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NLB:[rl0-9]+]], [[LB]], #4
77*9880d681SAndroid Build Coastguard Worker; CHECK: add [[NSB:[rl0-9]+]], [[SB]], #4
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]]!, {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]]}
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]]!, {[[R1]], [[R2]], [[R3]], [[R4]]}
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm [[NLB]], {[[R1:[rl0-9]+]], [[R2:[rl0-9]+]], [[R3:[rl0-9]+]], [[R4:[rl0-9]+]], [[R5:[rl0-9]+]]}
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm [[NSB]], {[[R1]], [[R2]], [[R3]], [[R4]], [[R5]]}
82*9880d681SAndroid Build Coastguard Worker  %0 = load i32*, i32** @a, align 4
83*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %0, i32 1
84*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i32* %arrayidx to i8*
85*9880d681SAndroid Build Coastguard Worker  %2 = load i32*, i32** @b, align 4
86*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %2, i32 1
87*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i32* %arrayidx1 to i8*
88*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %3, i32 36, i32 4, i1 false)
89*9880d681SAndroid Build Coastguard Worker  ret void
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
93*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #1
94