[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-addrmode.ll
blob69c558d9d5599dcb36d494466ec1b09b0a0801e2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=arm64-eabi < %s | FileCheck %s
3 ; rdar://10232252
5 @object = external hidden global i64, section "__DATA, __objc_ivar", align 8
7 ; base + offset (imm9)
8 define void @t1(ptr %object) {
9 ; CHECK-LABEL: t1:
10 ; CHECK:       // %bb.0:
11 ; CHECK-NEXT:    ldr xzr, [x0, #8]
12 ; CHECK-NEXT:    ret
13   %incdec.ptr = getelementptr inbounds i64, ptr %object, i64 1
14   %tmp = load volatile i64, ptr %incdec.ptr, align 8
15   ret void
18 ; base + offset (> imm9)
19 define void @t2(ptr %object) {
20 ; CHECK-LABEL: t2:
21 ; CHECK:       // %bb.0:
22 ; CHECK-NEXT:    sub x8, x0, #264
23 ; CHECK-NEXT:    ldr xzr, [x8]
24 ; CHECK-NEXT:    ret
25   %incdec.ptr = getelementptr inbounds i64, ptr %object, i64 -33
26   %tmp = load volatile i64, ptr %incdec.ptr, align 8
27   ret void
30 ; base + unsigned offset (> imm9 and <= imm12 * size of type in bytes)
31 define void @t3(ptr %object) {
32 ; CHECK-LABEL: t3:
33 ; CHECK:       // %bb.0:
34 ; CHECK-NEXT:    ldr xzr, [x0, #32760]
35 ; CHECK-NEXT:    ret
36   %incdec.ptr = getelementptr inbounds i64, ptr %object, i64 4095
37   %tmp = load volatile i64, ptr %incdec.ptr, align 8
38   ret void
41 ; base + unsigned offset (> imm12 * size of type in bytes)
42 define void @t4(ptr %object) {
43 ; CHECK-LABEL: t4:
44 ; CHECK:       // %bb.0:
45 ; CHECK-NEXT:    mov w8, #32768 // =0x8000
46 ; CHECK-NEXT:    ldr xzr, [x0, x8]
47 ; CHECK-NEXT:    ret
48   %incdec.ptr = getelementptr inbounds i64, ptr %object, i64 4096
49   %tmp = load volatile i64, ptr %incdec.ptr, align 8
50   ret void
53 ; base + reg
54 define void @t5(i64 %a) {
55 ; CHECK-LABEL: t5:
56 ; CHECK:       // %bb.0:
57 ; CHECK-NEXT:    adrp x8, object
58 ; CHECK-NEXT:    add x8, x8, :lo12:object
59 ; CHECK-NEXT:    ldr xzr, [x8, x0, lsl #3]
60 ; CHECK-NEXT:    ret
61   %incdec.ptr = getelementptr inbounds i64, ptr @object, i64 %a
62   %tmp = load volatile i64, ptr %incdec.ptr, align 8
63   ret void
66 ; base + reg + imm
67 define void @t6(i64 %a, ptr %object) {
68 ; CHECK-LABEL: t6:
69 ; CHECK:       // %bb.0:
70 ; CHECK-NEXT:    add x8, x1, x0, lsl #3
71 ; CHECK-NEXT:    mov w9, #32768 // =0x8000
72 ; CHECK-NEXT:    ldr xzr, [x8, x9]
73 ; CHECK-NEXT:    ret
74   %tmp1 = getelementptr inbounds i64, ptr %object, i64 %a
75   %incdec.ptr = getelementptr inbounds i64, ptr %tmp1, i64 4096
76   %tmp = load volatile i64, ptr %incdec.ptr, align 8
77   ret void
80 ; Test base + wide immediate
81 define void @t7(i64 %a) {
82 ; CHECK-LABEL: t7:
83 ; CHECK:       // %bb.0:
84 ; CHECK-NEXT:    mov w8, #65535 // =0xffff
85 ; CHECK-NEXT:    ldr xzr, [x0, x8]
86 ; CHECK-NEXT:    ret
87   %1 = add i64 %a, 65535   ;0xffff
88   %2 = inttoptr i64 %1 to ptr
89   %3 = load volatile i64, ptr %2, align 8
90   ret void
93 define void @t8(i64 %a) {
94 ; CHECK-LABEL: t8:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    mov x8, #-4662 // =0xffffffffffffedca
97 ; CHECK-NEXT:    ldr xzr, [x0, x8]
98 ; CHECK-NEXT:    ret
99   %1 = sub i64 %a, 4662   ;-4662 is 0xffffffffffffedca
100   %2 = inttoptr i64 %1 to ptr
101   %3 = load volatile i64, ptr %2, align 8
102   ret void
105 define void @t9(i64 %a) {
106 ; CHECK-LABEL: t9:
107 ; CHECK:       // %bb.0:
108 ; CHECK-NEXT:    mov x8, #-305463297 // =0xffffffffedcaffff
109 ; CHECK-NEXT:    ldr xzr, [x0, x8]
110 ; CHECK-NEXT:    ret
111   %1 = add i64 -305463297, %a   ;-305463297 is 0xffffffffedcaffff
112   %2 = inttoptr i64 %1 to ptr
113   %3 = load volatile i64, ptr %2, align 8
114   ret void
117 define void @t10(i64 %a) {
118 ; CHECK-LABEL: t10:
119 ; CHECK:       // %bb.0:
120 ; CHECK-NEXT:    mov x8, #81909218222800896 // =0x123000000000000
121 ; CHECK-NEXT:    ldr xzr, [x0, x8]
122 ; CHECK-NEXT:    ret
123   %1 = add i64 %a, 81909218222800896   ;0x123000000000000
124   %2 = inttoptr i64 %1 to ptr
125   %3 = load volatile i64, ptr %2, align 8
126   ret void
129 define void @t11(i64 %a) {
130 ; CHECK-LABEL: t11:
131 ; CHECK:       // %bb.0:
132 ; CHECK-NEXT:    mov w8, #17767 // =0x4567
133 ; CHECK-NEXT:    movk w8, #291, lsl #16
134 ; CHECK-NEXT:    ldr xzr, [x0, x8]
135 ; CHECK-NEXT:    ret
136   %1 = add i64 %a, 19088743   ;0x1234567
137   %2 = inttoptr i64 %1 to ptr
138   %3 = load volatile i64, ptr %2, align 8
139   ret void
142 ; Test some boundaries that should not use movz/movn/orr
143 define void @t12(i64 %a) {
144 ; CHECK-LABEL: t12:
145 ; CHECK:       // %bb.0:
146 ; CHECK-NEXT:    add x8, x0, #4095
147 ; CHECK-NEXT:    ldr xzr, [x8]
148 ; CHECK-NEXT:    ret
149   %1 = add i64 %a, 4095   ;0xfff
150   %2 = inttoptr i64 %1 to ptr
151   %3 = load volatile i64, ptr %2, align 8
152   ret void
155 define void @t13(i64 %a) {
156 ; CHECK-LABEL: t13:
157 ; CHECK:       // %bb.0:
158 ; CHECK-NEXT:    sub x8, x0, #4095
159 ; CHECK-NEXT:    ldr xzr, [x8]
160 ; CHECK-NEXT:    ret
161   %1 = add i64 %a, -4095   ;-0xfff
162   %2 = inttoptr i64 %1 to ptr
163   %3 = load volatile i64, ptr %2, align 8
164   ret void
167 define void @t14(i64 %a) {
168 ; CHECK-LABEL: t14:
169 ; CHECK:       // %bb.0:
170 ; CHECK-NEXT:    add x8, x0, #291, lsl #12 // =1191936
171 ; CHECK-NEXT:    ldr xzr, [x8]
172 ; CHECK-NEXT:    ret
173   %1 = add i64 %a, 1191936   ;0x123000
174   %2 = inttoptr i64 %1 to ptr
175   %3 = load volatile i64, ptr %2, align 8
176   ret void
179 define void @t15(i64 %a) {
180 ; CHECK-LABEL: t15:
181 ; CHECK:       // %bb.0:
182 ; CHECK-NEXT:    sub x8, x0, #291, lsl #12 // =1191936
183 ; CHECK-NEXT:    ldr xzr, [x8]
184 ; CHECK-NEXT:    ret
185   %1 = add i64 %a, -1191936   ;0xFFFFFFFFFFEDD000
186   %2 = inttoptr i64 %1 to ptr
187   %3 = load volatile i64, ptr %2, align 8
188   ret void
191 define void @t16(i64 %a) {
192 ; CHECK-LABEL: t16:
193 ; CHECK:       // %bb.0:
194 ; CHECK-NEXT:    ldr xzr, [x0, #28672]
195 ; CHECK-NEXT:    ret
196   %1 = add i64 %a, 28672   ;0x7000
197   %2 = inttoptr i64 %1 to ptr
198   %3 = load volatile i64, ptr %2, align 8
199   ret void
202 define void @t17(i64 %a) {
203 ; CHECK-LABEL: t17:
204 ; CHECK:       // %bb.0:
205 ; CHECK-NEXT:    ldur xzr, [x0, #-256]
206 ; CHECK-NEXT:    ret
207   %1 = add i64 %a, -256   ;-0x100
208   %2 = inttoptr i64 %1 to ptr
209   %3 = load volatile i64, ptr %2, align 8
210   ret void