xref: /llvm-project/llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll (revision 8b26c02caaa002edc2d70af9e6a8024c4b1343cf)
147601815SWeining Lu; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
247601815SWeining Lu
347601815SWeining Lu;; Test how memcpy is optimized when ual is turned off which is similar to AArch64/arm64-misaligned-memcpy-inline.ll.
447601815SWeining Lu
547601815SWeining Lu; RUN: llc --mtriple=loongarch32 --mattr=-ual < %s | FileCheck %s --check-prefix=LA32
647601815SWeining Lu; RUN: llc --mtriple=loongarch64 --mattr=-ual < %s | FileCheck %s --check-prefix=LA64
747601815SWeining Lu
847601815SWeining Lu;; Small (16 bytes here) unaligned memcpy() should be a function call if
947601815SWeining Lu;; ual is turned off.
1047601815SWeining Ludefine void @t0(ptr %out, ptr %in) {
1147601815SWeining Lu; LA32-LABEL: t0:
1247601815SWeining Lu; LA32:       # %bb.0: # %entry
1347601815SWeining Lu; LA32-NEXT:    addi.w $sp, $sp, -16
1447601815SWeining Lu; LA32-NEXT:    .cfi_def_cfa_offset 16
1547601815SWeining Lu; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1647601815SWeining Lu; LA32-NEXT:    .cfi_offset 1, -4
1747601815SWeining Lu; LA32-NEXT:    ori $a2, $zero, 16
1847601815SWeining Lu; LA32-NEXT:    bl %plt(memcpy)
1947601815SWeining Lu; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
2047601815SWeining Lu; LA32-NEXT:    addi.w $sp, $sp, 16
2147601815SWeining Lu; LA32-NEXT:    ret
2247601815SWeining Lu;
2347601815SWeining Lu; LA64-LABEL: t0:
2447601815SWeining Lu; LA64:       # %bb.0: # %entry
2547601815SWeining Lu; LA64-NEXT:    addi.d $sp, $sp, -16
2647601815SWeining Lu; LA64-NEXT:    .cfi_def_cfa_offset 16
2747601815SWeining Lu; LA64-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
2847601815SWeining Lu; LA64-NEXT:    .cfi_offset 1, -8
2947601815SWeining Lu; LA64-NEXT:    ori $a2, $zero, 16
3047601815SWeining Lu; LA64-NEXT:    bl %plt(memcpy)
3147601815SWeining Lu; LA64-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
3247601815SWeining Lu; LA64-NEXT:    addi.d $sp, $sp, 16
3347601815SWeining Lu; LA64-NEXT:    ret
3447601815SWeining Luentry:
3547601815SWeining Lu  call void @llvm.memcpy.p0.p0.i64(ptr %out, ptr %in, i64 16, i1 false)
3647601815SWeining Lu  ret void
3747601815SWeining Lu}
3847601815SWeining Lu
3947601815SWeining Lu;; Small (16 bytes here) aligned memcpy() should be inlined even if
4047601815SWeining Lu;; ual is turned off.
4147601815SWeining Ludefine void @t1(ptr align 8 %out, ptr align 8 %in) {
4247601815SWeining Lu; LA32-LABEL: t1:
4347601815SWeining Lu; LA32:       # %bb.0: # %entry
4447601815SWeining Lu; LA32-NEXT:    ld.w $a2, $a1, 12
4547601815SWeining Lu; LA32-NEXT:    st.w $a2, $a0, 12
4647601815SWeining Lu; LA32-NEXT:    ld.w $a2, $a1, 8
4747601815SWeining Lu; LA32-NEXT:    st.w $a2, $a0, 8
4847601815SWeining Lu; LA32-NEXT:    ld.w $a2, $a1, 4
4947601815SWeining Lu; LA32-NEXT:    st.w $a2, $a0, 4
5047601815SWeining Lu; LA32-NEXT:    ld.w $a1, $a1, 0
5147601815SWeining Lu; LA32-NEXT:    st.w $a1, $a0, 0
5247601815SWeining Lu; LA32-NEXT:    ret
5347601815SWeining Lu;
5447601815SWeining Lu; LA64-LABEL: t1:
5547601815SWeining Lu; LA64:       # %bb.0: # %entry
5647601815SWeining Lu; LA64-NEXT:    ld.d $a2, $a1, 8
5747601815SWeining Lu; LA64-NEXT:    st.d $a2, $a0, 8
5847601815SWeining Lu; LA64-NEXT:    ld.d $a1, $a1, 0
5947601815SWeining Lu; LA64-NEXT:    st.d $a1, $a0, 0
6047601815SWeining Lu; LA64-NEXT:    ret
6147601815SWeining Luentry:
6247601815SWeining Lu  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %out, ptr align 8 %in, i64 16, i1 false)
6347601815SWeining Lu  ret void
6447601815SWeining Lu}
6547601815SWeining Lu
6647601815SWeining Lu;; Tiny (4 bytes here) unaligned memcpy() should be inlined with byte sized
6747601815SWeining Lu;; loads and stores if ual is turned off.
6847601815SWeining Ludefine void @t2(ptr %out, ptr %in) {
6947601815SWeining Lu; LA32-LABEL: t2:
7047601815SWeining Lu; LA32:       # %bb.0: # %entry
7147601815SWeining Lu; LA32-NEXT:    ld.b $a2, $a1, 3
7247601815SWeining Lu; LA32-NEXT:    st.b $a2, $a0, 3
7347601815SWeining Lu; LA32-NEXT:    ld.b $a2, $a1, 2
7447601815SWeining Lu; LA32-NEXT:    st.b $a2, $a0, 2
7547601815SWeining Lu; LA32-NEXT:    ld.b $a2, $a1, 1
7647601815SWeining Lu; LA32-NEXT:    st.b $a2, $a0, 1
7747601815SWeining Lu; LA32-NEXT:    ld.b $a1, $a1, 0
7847601815SWeining Lu; LA32-NEXT:    st.b $a1, $a0, 0
7947601815SWeining Lu; LA32-NEXT:    ret
8047601815SWeining Lu;
8147601815SWeining Lu; LA64-LABEL: t2:
8247601815SWeining Lu; LA64:       # %bb.0: # %entry
8347601815SWeining Lu; LA64-NEXT:    ld.b $a2, $a1, 3
8447601815SWeining Lu; LA64-NEXT:    st.b $a2, $a0, 3
8547601815SWeining Lu; LA64-NEXT:    ld.b $a2, $a1, 2
8647601815SWeining Lu; LA64-NEXT:    st.b $a2, $a0, 2
8747601815SWeining Lu; LA64-NEXT:    ld.b $a2, $a1, 1
8847601815SWeining Lu; LA64-NEXT:    st.b $a2, $a0, 1
8947601815SWeining Lu; LA64-NEXT:    ld.b $a1, $a1, 0
9047601815SWeining Lu; LA64-NEXT:    st.b $a1, $a0, 0
9147601815SWeining Lu; LA64-NEXT:    ret
9247601815SWeining Luentry:
9347601815SWeining Lu  call void @llvm.memcpy.p0.p0.i64(ptr %out, ptr %in, i64 4, i1 false)
9447601815SWeining Lu  ret void
9547601815SWeining Lu}
9647601815SWeining Lu
97f51a4795SWANG Rui@.str = private constant [22 x i8] c"preemption imbalance \00", align 1
98f51a4795SWANG Rui
99f51a4795SWANG Ruidefine void @t3() {
100f51a4795SWANG Rui; LA32-LABEL: t3:
101f51a4795SWANG Rui; LA32:       # %bb.0: # %entry
102f51a4795SWANG Rui; LA32-NEXT:    addi.w $sp, $sp, -64
103f51a4795SWANG Rui; LA32-NEXT:    .cfi_def_cfa_offset 64
104f51a4795SWANG Rui; LA32-NEXT:    pcalau12i $a0, %pc_hi20(.L.str)
105f51a4795SWANG Rui; LA32-NEXT:    addi.w $a0, $a0, %pc_lo12(.L.str)
106*8b26c02cShev; LA32-NEXT:    ld.h $a1, $a0, 20
107*8b26c02cShev; LA32-NEXT:    ld.w $a2, $a0, 16
108f51a4795SWANG Rui; LA32-NEXT:    st.h $a1, $sp, 20
109*8b26c02cShev; LA32-NEXT:    st.w $a2, $sp, 16
110*8b26c02cShev; LA32-NEXT:    ld.w $a1, $a0, 12
111*8b26c02cShev; LA32-NEXT:    ld.w $a2, $a0, 8
112*8b26c02cShev; LA32-NEXT:    ld.w $a3, $a0, 4
113*8b26c02cShev; LA32-NEXT:    ld.w $a0, $a0, 0
114f51a4795SWANG Rui; LA32-NEXT:    st.w $a1, $sp, 12
115*8b26c02cShev; LA32-NEXT:    st.w $a2, $sp, 8
116*8b26c02cShev; LA32-NEXT:    st.w $a3, $sp, 4
117f51a4795SWANG Rui; LA32-NEXT:    st.w $a0, $sp, 0
118f51a4795SWANG Rui; LA32-NEXT:    addi.w $sp, $sp, 64
119f51a4795SWANG Rui; LA32-NEXT:    ret
120f51a4795SWANG Rui;
121f51a4795SWANG Rui; LA64-LABEL: t3:
122f51a4795SWANG Rui; LA64:       # %bb.0: # %entry
123f51a4795SWANG Rui; LA64-NEXT:    addi.d $sp, $sp, -64
124f51a4795SWANG Rui; LA64-NEXT:    .cfi_def_cfa_offset 64
125f51a4795SWANG Rui; LA64-NEXT:    pcalau12i $a0, %pc_hi20(.L.str)
126f51a4795SWANG Rui; LA64-NEXT:    addi.d $a0, $a0, %pc_lo12(.L.str)
127*8b26c02cShev; LA64-NEXT:    ld.h $a1, $a0, 20
128*8b26c02cShev; LA64-NEXT:    ld.w $a2, $a0, 16
129*8b26c02cShev; LA64-NEXT:    ld.d $a3, $a0, 8
130*8b26c02cShev; LA64-NEXT:    ld.d $a0, $a0, 0
131f51a4795SWANG Rui; LA64-NEXT:    st.h $a1, $sp, 20
132*8b26c02cShev; LA64-NEXT:    st.w $a2, $sp, 16
133*8b26c02cShev; LA64-NEXT:    st.d $a3, $sp, 8
134f51a4795SWANG Rui; LA64-NEXT:    st.d $a0, $sp, 0
135f51a4795SWANG Rui; LA64-NEXT:    addi.d $sp, $sp, 64
136f51a4795SWANG Rui; LA64-NEXT:    ret
137f51a4795SWANG Ruientry:
138f51a4795SWANG Rui  %msgbuf = alloca [64 x i8], align 1
139f51a4795SWANG Rui  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %msgbuf, ptr align 1 @.str, i64 22, i1 false)
140f51a4795SWANG Rui  ret void
141f51a4795SWANG Rui}
142f51a4795SWANG Rui
14347601815SWeining Ludeclare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i1)
144