@@ -209,3 +209,90 @@ define void @t17(i64 %a) {
209
209
%3 = load volatile i64 , ptr %2 , align 8
210
210
ret void
211
211
}
212
+
213
+ define i32 @LdOffset_i8 (ptr %a ) {
214
+ ; CHECK-LABEL: LdOffset_i8:
215
+ ; CHECK: // %bb.0:
216
+ ; CHECK-NEXT: mov w8, #56952 // =0xde78
217
+ ; CHECK-NEXT: movk w8, #15, lsl #16
218
+ ; CHECK-NEXT: ldrb w0, [x0, x8]
219
+ ; CHECK-NEXT: ret
220
+ %arrayidx = getelementptr inbounds i8 , ptr %a , i64 1039992
221
+ %val = load i8 , ptr %arrayidx , align 1
222
+ %conv = zext i8 %val to i32
223
+ ret i32 %conv
224
+ }
225
+
226
+ define i32 @LdOffset_i16 (ptr %a ) {
227
+ ; CHECK-LABEL: LdOffset_i16:
228
+ ; CHECK: // %bb.0:
229
+ ; CHECK-NEXT: mov w8, #48368 // =0xbcf0
230
+ ; CHECK-NEXT: movk w8, #31, lsl #16
231
+ ; CHECK-NEXT: ldrsh w0, [x0, x8]
232
+ ; CHECK-NEXT: ret
233
+ %arrayidx = getelementptr inbounds i16 , ptr %a , i64 1039992
234
+ %val = load i16 , ptr %arrayidx , align 2
235
+ %conv = sext i16 %val to i32
236
+ ret i32 %conv
237
+ }
238
+
239
+ define i32 @LdOffset_i32 (ptr %a ) {
240
+ ; CHECK-LABEL: LdOffset_i32:
241
+ ; CHECK: // %bb.0:
242
+ ; CHECK-NEXT: mov w8, #31200 // =0x79e0
243
+ ; CHECK-NEXT: movk w8, #63, lsl #16
244
+ ; CHECK-NEXT: ldr w0, [x0, x8]
245
+ ; CHECK-NEXT: ret
246
+ %arrayidx = getelementptr inbounds i32 , ptr %a , i64 1039992
247
+ %val = load i32 , ptr %arrayidx , align 4
248
+ ret i32 %val
249
+ }
250
+
251
+ define i64 @LdOffset_i64_multi_offset (ptr %a ) {
252
+ ; CHECK-LABEL: LdOffset_i64_multi_offset:
253
+ ; CHECK: // %bb.0:
254
+ ; CHECK-NEXT: add x8, x0, #2031, lsl #12 // =8318976
255
+ ; CHECK-NEXT: add x8, x8, #960
256
+ ; CHECK-NEXT: ldr x9, [x8]
257
+ ; CHECK-NEXT: ldr x8, [x8, #2056]
258
+ ; CHECK-NEXT: add x0, x8, x9
259
+ ; CHECK-NEXT: ret
260
+ %arrayidx = getelementptr inbounds i64 , ptr %a , i64 1039992
261
+ %val0 = load i64 , ptr %arrayidx , align 8
262
+ %arrayidx1 = getelementptr inbounds i64 , ptr %a , i64 1040249
263
+ %val1 = load i64 , ptr %arrayidx1 , align 8
264
+ %add = add nsw i64 %val1 , %val0
265
+ ret i64 %add
266
+ }
267
+
268
+ define i64 @LdOffset_i64_multi_offset_with_commmon_base (ptr %a ) {
269
+ ; CHECK-LABEL: LdOffset_i64_multi_offset_with_commmon_base:
270
+ ; CHECK: // %bb.0:
271
+ ; CHECK-NEXT: add x8, x0, #507, lsl #12 // =2076672
272
+ ; CHECK-NEXT: ldr x9, [x8, #26464]
273
+ ; CHECK-NEXT: ldr x8, [x8, #26496]
274
+ ; CHECK-NEXT: add x0, x8, x9
275
+ ; CHECK-NEXT: ret
276
+ %b = getelementptr inbounds i16 , ptr %a , i64 1038336
277
+ %arrayidx = getelementptr inbounds i64 , ptr %b , i64 3308
278
+ %val0 = load i64 , ptr %arrayidx , align 8
279
+ %arrayidx1 = getelementptr inbounds i64 , ptr %b , i64 3312
280
+ %val1 = load i64 , ptr %arrayidx1 , align 8
281
+ %add = add nsw i64 %val1 , %val0
282
+ ret i64 %add
283
+ }
284
+
285
+ ; Negative test: the offset is odd
286
+ define i32 @LdOffset_i16_odd_offset (ptr nocapture noundef readonly %a ) {
287
+ ; CHECK-LABEL: LdOffset_i16_odd_offset:
288
+ ; CHECK: // %bb.0:
289
+ ; CHECK-NEXT: mov w8, #56953 // =0xde79
290
+ ; CHECK-NEXT: movk w8, #15, lsl #16
291
+ ; CHECK-NEXT: ldrsh w0, [x0, x8]
292
+ ; CHECK-NEXT: ret
293
+ %arrayidx = getelementptr inbounds i8 , ptr %a , i64 1039993
294
+ %val = load i16 , ptr %arrayidx , align 2
295
+ %conv = sext i16 %val to i32
296
+ ret i32 %conv
297
+ }
298
+
0 commit comments