xref: /llvm-project/llvm/test/CodeGen/LoongArch/ldptr.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5;; Check that ldptr.w is not emitted for small offsets.
6define signext i32 @ldptr_w_too_small_offset(ptr %p) nounwind {
7; LA32-LABEL: ldptr_w_too_small_offset:
8; LA32:       # %bb.0: # %entry
9; LA32-NEXT:    ld.w $a0, $a0, 2044
10; LA32-NEXT:    ret
11;
12; LA64-LABEL: ldptr_w_too_small_offset:
13; LA64:       # %bb.0: # %entry
14; LA64-NEXT:    ld.w $a0, $a0, 2044
15; LA64-NEXT:    ret
16entry:
17  %addr = getelementptr inbounds i32, ptr %p, i64 511
18  %val = load i32, ptr %addr, align 4
19  ret i32 %val
20}
21
22;; Check that ldptr.w is emitted for applicable offsets.
23define signext i32 @ldptr_w(ptr %p) nounwind {
24; LA32-LABEL: ldptr_w:
25; LA32:       # %bb.0: # %entry
26; LA32-NEXT:    addi.w $a0, $a0, 2047
27; LA32-NEXT:    addi.w $a0, $a0, 1
28; LA32-NEXT:    ld.w $a0, $a0, 0
29; LA32-NEXT:    ret
30;
31; LA64-LABEL: ldptr_w:
32; LA64:       # %bb.0: # %entry
33; LA64-NEXT:    ldptr.w $a0, $a0, 2048
34; LA64-NEXT:    ret
35entry:
36  %addr = getelementptr inbounds i32, ptr %p, i64 512
37  %val = load i32, ptr %addr, align 4
38  ret i32 %val
39}
40
41;; Check that ldptr.w is not emitted for out-of-range offsets.
42define signext i32 @ldptr_w_too_big_offset(ptr %p) nounwind {
43; LA32-LABEL: ldptr_w_too_big_offset:
44; LA32:       # %bb.0: # %entry
45; LA32-NEXT:    lu12i.w $a1, 8
46; LA32-NEXT:    add.w $a0, $a0, $a1
47; LA32-NEXT:    ld.w $a0, $a0, 0
48; LA32-NEXT:    ret
49;
50; LA64-LABEL: ldptr_w_too_big_offset:
51; LA64:       # %bb.0: # %entry
52; LA64-NEXT:    lu12i.w $a1, 8
53; LA64-NEXT:    ldx.w $a0, $a0, $a1
54; LA64-NEXT:    ret
55entry:
56  %addr = getelementptr inbounds i32, ptr %p, i64 8192
57  %val = load i32, ptr %addr, align 4
58  ret i32 %val
59}
60
61;; Check that ldptr.d is not emitted for small offsets.
62define i64 @ldptr_d_too_small_offset(ptr %p) nounwind {
63; LA32-LABEL: ldptr_d_too_small_offset:
64; LA32:       # %bb.0: # %entry
65; LA32-NEXT:    ld.w $a2, $a0, 2040
66; LA32-NEXT:    ld.w $a1, $a0, 2044
67; LA32-NEXT:    move $a0, $a2
68; LA32-NEXT:    ret
69;
70; LA64-LABEL: ldptr_d_too_small_offset:
71; LA64:       # %bb.0: # %entry
72; LA64-NEXT:    ld.d $a0, $a0, 2040
73; LA64-NEXT:    ret
74entry:
75  %addr = getelementptr inbounds i64, ptr %p, i64 255
76  %val = load i64, ptr %addr, align 8
77  ret i64 %val
78}
79
80;; Check that ldptr.d is emitted for applicable offsets.
81define i64 @ldptr_d(ptr %p) nounwind {
82; LA32-LABEL: ldptr_d:
83; LA32:       # %bb.0: # %entry
84; LA32-NEXT:    addi.w $a0, $a0, 2047
85; LA32-NEXT:    addi.w $a1, $a0, 1
86; LA32-NEXT:    ld.w $a0, $a1, 0
87; LA32-NEXT:    ld.w $a1, $a1, 4
88; LA32-NEXT:    ret
89;
90; LA64-LABEL: ldptr_d:
91; LA64:       # %bb.0: # %entry
92; LA64-NEXT:    ldptr.d $a0, $a0, 2048
93; LA64-NEXT:    ret
94entry:
95  %addr = getelementptr inbounds i64, ptr %p, i64 256
96  %val = load i64, ptr %addr, align 8
97  ret i64 %val
98}
99
100;; Check that ldptr.d is not emitted for out-of-range offsets.
101define i64 @ldptr_d_too_big_offset(ptr %p) nounwind {
102; LA32-LABEL: ldptr_d_too_big_offset:
103; LA32:       # %bb.0: # %entry
104; LA32-NEXT:    lu12i.w $a1, 8
105; LA32-NEXT:    add.w $a1, $a0, $a1
106; LA32-NEXT:    ld.w $a0, $a1, 0
107; LA32-NEXT:    ld.w $a1, $a1, 4
108; LA32-NEXT:    ret
109;
110; LA64-LABEL: ldptr_d_too_big_offset:
111; LA64:       # %bb.0: # %entry
112; LA64-NEXT:    lu12i.w $a1, 8
113; LA64-NEXT:    ldx.d $a0, $a0, $a1
114; LA64-NEXT:    ret
115entry:
116  %addr = getelementptr inbounds i64, ptr %p, i64 4096
117  %val = load i64, ptr %addr, align 8
118  ret i64 %val
119}
120