@@ -209,3 +209,90 @@ define void @t17(i64 %a) {
209209 %3 = load volatile i64 , ptr %2 , align 8
210210 ret void
211211}
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