1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1
2
; RUN: llc < %s -mtriple=arm64eb-unknown | FileCheck %s
2
3
3
4
; i8* p; // p is 4 byte aligned
4
5
; ((i32) p[0] << 24) | ((i32) p[1] << 16) | ((i32) p[2] << 8) | (i32) p[3]
5
6
define i32 @load_i32_by_i8_big_endian (i32* %arg ) {
6
7
; CHECK-LABEL: load_i32_by_i8_big_endian:
7
- ; CHECK: ldr w0, [x0]
8
- ; CHECK-NEXT: ret
8
+ ; CHECK: // %bb.0:
9
+ ; CHECK-NEXT: ldr w0, [x0]
10
+ ; CHECK-NEXT: ret
9
11
%tmp = bitcast i32* %arg to i8*
10
12
%tmp1 = load i8 , i8* %tmp , align 4
11
13
%tmp2 = zext i8 %tmp1 to i32
@@ -31,8 +33,9 @@ define i32 @load_i32_by_i8_big_endian(i32* %arg) {
31
33
; ((i32) (((i16) p[0] << 8) | (i16) p[1]) << 16) | (i32) (((i16) p[3] << 8) | (i16) p[4])
32
34
define i32 @load_i32_by_i16_by_i8_big_endian (i32* %arg ) {
33
35
; CHECK-LABEL: load_i32_by_i16_by_i8_big_endian:
34
- ; CHECK: ldr w0, [x0]
35
- ; CHECK-NEXT: ret
36
+ ; CHECK: // %bb.0:
37
+ ; CHECK-NEXT: ldr w0, [x0]
38
+ ; CHECK-NEXT: ret
36
39
%tmp = bitcast i32* %arg to i8*
37
40
%tmp1 = load i8 , i8* %tmp , align 4
38
41
%tmp2 = zext i8 %tmp1 to i16
@@ -60,8 +63,9 @@ define i32 @load_i32_by_i16_by_i8_big_endian(i32* %arg) {
60
63
; ((i32) p[0] << 16) | (i32) p[1]
61
64
define i32 @load_i32_by_i16 (i32* %arg ) {
62
65
; CHECK-LABEL: load_i32_by_i16:
63
- ; CHECK: ldr w0, [x0]
64
- ; CHECK-NEXT: ret
66
+ ; CHECK: // %bb.0:
67
+ ; CHECK-NEXT: ldr w0, [x0]
68
+ ; CHECK-NEXT: ret
65
69
%tmp = bitcast i32* %arg to i16*
66
70
%tmp1 = load i16 , i16* %tmp , align 4
67
71
%tmp2 = zext i16 %tmp1 to i32
@@ -78,8 +82,9 @@ define i32 @load_i32_by_i16(i32* %arg) {
78
82
; (i32) (p_16[0] << 16) | ((i32) p[2] << 8) | (i32) p[3]
79
83
define i32 @load_i32_by_i16_i8 (i32* %arg ) {
80
84
; CHECK-LABEL: load_i32_by_i16_i8:
81
- ; CHECK: ldr w0, [x0]
82
- ; CHECK-NEXT: ret
85
+ ; CHECK: // %bb.0:
86
+ ; CHECK-NEXT: ldr w0, [x0]
87
+ ; CHECK-NEXT: ret
83
88
%tmp = bitcast i32* %arg to i16*
84
89
%tmp1 = bitcast i32* %arg to i8*
85
90
%tmp2 = load i16 , i16* %tmp , align 4
@@ -101,9 +106,10 @@ define i32 @load_i32_by_i16_i8(i32* %arg) {
101
106
; (i64) p[0] | ((i64) p[1] << 8) | ((i64) p[2] << 16) | ((i64) p[3] << 24) | ((i64) p[4] << 32) | ((i64) p[5] << 40) | ((i64) p[6] << 48) | ((i64) p[7] << 56)
102
107
define i64 @load_i64_by_i8_bswap (i64* %arg ) {
103
108
; CHECK-LABEL: load_i64_by_i8_bswap:
104
- ; CHECK: ldr x8, [x0]
105
- ; CHECK-NEXT: rev x0, x8
106
- ; CHECK-NEXT: ret
109
+ ; CHECK: // %bb.0:
110
+ ; CHECK-NEXT: ldr x8, [x0]
111
+ ; CHECK-NEXT: rev x0, x8
112
+ ; CHECK-NEXT: ret
107
113
%tmp = bitcast i64* %arg to i8*
108
114
%tmp1 = load i8 , i8* %tmp , align 8
109
115
%tmp2 = zext i8 %tmp1 to i64
@@ -149,8 +155,9 @@ define i64 @load_i64_by_i8_bswap(i64* %arg) {
149
155
; ((i64) p[0] << 56) | ((i64) p[1] << 48) | ((i64) p[2] << 40) | ((i64) p[3] << 32) | ((i64) p[4] << 24) | ((i64) p[5] << 16) | ((i64) p[6] << 8) | (i64) p[7]
150
156
define i64 @load_i64_by_i8 (i64* %arg ) {
151
157
; CHECK-LABEL: load_i64_by_i8:
152
- ; CHECK: ldr x0, [x0]
153
- ; CHECK-NEXT: ret
158
+ ; CHECK: // %bb.0:
159
+ ; CHECK-NEXT: ldr x0, [x0]
160
+ ; CHECK-NEXT: ret
154
161
%tmp = bitcast i64* %arg to i8*
155
162
%tmp1 = load i8 , i8* %tmp , align 8
156
163
%tmp2 = zext i8 %tmp1 to i64
@@ -196,9 +203,10 @@ define i64 @load_i64_by_i8(i64* %arg) {
196
203
; (i32) p[1] | ((i32) p[2] << 8) | ((i32) p[3] << 16) | ((i32) p[4] << 24)
197
204
define i32 @load_i32_by_i8_nonzero_offset (i32* %arg ) {
198
205
; CHECK-LABEL: load_i32_by_i8_nonzero_offset:
199
- ; CHECK: ldur w8, [x0, #1]
200
- ; CHECK-NEXT: rev w0, w8
201
- ; CHECK-NEXT: ret
206
+ ; CHECK: // %bb.0:
207
+ ; CHECK-NEXT: ldur w8, [x0, #1]
208
+ ; CHECK-NEXT: rev w0, w8
209
+ ; CHECK-NEXT: ret
202
210
203
211
%tmp = bitcast i32* %arg to i8*
204
212
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 1
@@ -226,9 +234,10 @@ define i32 @load_i32_by_i8_nonzero_offset(i32* %arg) {
226
234
; (i32) p[-4] | ((i32) p[-3] << 8) | ((i32) p[-2] << 16) | ((i32) p[-1] << 24)
227
235
define i32 @load_i32_by_i8_neg_offset (i32* %arg ) {
228
236
; CHECK-LABEL: load_i32_by_i8_neg_offset:
229
- ; CHECK: ldur w8, [x0, #-4]
230
- ; CHECK-NEXT: rev w0, w8
231
- ; CHECK-NEXT: ret
237
+ ; CHECK: // %bb.0:
238
+ ; CHECK-NEXT: ldur w8, [x0, #-4]
239
+ ; CHECK-NEXT: rev w0, w8
240
+ ; CHECK-NEXT: ret
232
241
233
242
%tmp = bitcast i32* %arg to i8*
234
243
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 -4
@@ -256,8 +265,9 @@ define i32 @load_i32_by_i8_neg_offset(i32* %arg) {
256
265
; (i32) p[4] | ((i32) p[3] << 8) | ((i32) p[2] << 16) | ((i32) p[1] << 24)
257
266
define i32 @load_i32_by_i8_nonzero_offset_bswap (i32* %arg ) {
258
267
; CHECK-LABEL: load_i32_by_i8_nonzero_offset_bswap:
259
- ; CHECK: ldur w0, [x0, #1]
260
- ; CHECK-NEXT: ret
268
+ ; CHECK: // %bb.0:
269
+ ; CHECK-NEXT: ldur w0, [x0, #1]
270
+ ; CHECK-NEXT: ret
261
271
262
272
%tmp = bitcast i32* %arg to i8*
263
273
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 4
@@ -285,8 +295,9 @@ define i32 @load_i32_by_i8_nonzero_offset_bswap(i32* %arg) {
285
295
; (i32) p[-1] | ((i32) p[-2] << 8) | ((i32) p[-3] << 16) | ((i32) p[-4] << 24)
286
296
define i32 @load_i32_by_i8_neg_offset_bswap (i32* %arg ) {
287
297
; CHECK-LABEL: load_i32_by_i8_neg_offset_bswap:
288
- ; CHECK: ldur w0, [x0, #-4]
289
- ; CHECK-NEXT: ret
298
+ ; CHECK: // %bb.0:
299
+ ; CHECK-NEXT: ldur w0, [x0, #-4]
300
+ ; CHECK-NEXT: ret
290
301
291
302
%tmp = bitcast i32* %arg to i8*
292
303
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 -1
@@ -316,9 +327,10 @@ declare i16 @llvm.bswap.i16(i16)
316
327
; (i32) bswap(p[0]) | (i32) bswap(p[1] << 16)
317
328
define i32 @load_i32_by_bswap_i16 (i32* %arg ) {
318
329
; CHECK-LABEL: load_i32_by_bswap_i16:
319
- ; CHECK: ldr w8, [x0]
320
- ; CHECK-NEXT: rev w0, w8
321
- ; CHECK-NEXT: ret
330
+ ; CHECK: // %bb.0:
331
+ ; CHECK-NEXT: ldr w8, [x0]
332
+ ; CHECK-NEXT: rev w0, w8
333
+ ; CHECK-NEXT: ret
322
334
%tmp = bitcast i32* %arg to i16*
323
335
%tmp1 = load i16 , i16* %tmp , align 4
324
336
%tmp11 = call i16 @llvm.bswap.i16 (i16 %tmp1 )
@@ -336,8 +348,9 @@ define i32 @load_i32_by_bswap_i16(i32* %arg) {
336
348
; (i32) p[1] | (sext(p[0] << 16) to i32)
337
349
define i32 @load_i32_by_sext_i16 (i32* %arg ) {
338
350
; CHECK-LABEL: load_i32_by_sext_i16:
339
- ; CHECK: ldr w0, [x0]
340
- ; CHECK-NEXT: ret
351
+ ; CHECK: // %bb.0:
352
+ ; CHECK-NEXT: ldr w0, [x0]
353
+ ; CHECK-NEXT: ret
341
354
%tmp = bitcast i32* %arg to i16*
342
355
%tmp1 = load i16 , i16* %tmp , align 4
343
356
%tmp2 = sext i16 %tmp1 to i32
@@ -354,10 +367,11 @@ define i32 @load_i32_by_sext_i16(i32* %arg) {
354
367
; (i32) p[i] | ((i32) p[i + 1] << 8) | ((i32) p[i + 2] << 16) | ((i32) p[i + 3] << 24)
355
368
define i32 @load_i32_by_i8_base_offset_index (i8* %arg , i32 %i ) {
356
369
; CHECK-LABEL: load_i32_by_i8_base_offset_index:
357
- ; CHECK: add x8, x0, w1, uxtw
358
- ; CHECK-NEXT: ldr w8, [x8, #12]
359
- ; CHECK-NEXT: rev w0, w8
360
- ; CHECK-NEXT: ret
370
+ ; CHECK: // %bb.0:
371
+ ; CHECK-NEXT: add x8, x0, w1, uxtw
372
+ ; CHECK-NEXT: ldr w8, [x8, #12]
373
+ ; CHECK-NEXT: rev w0, w8
374
+ ; CHECK-NEXT: ret
361
375
%tmp = add nuw nsw i32 %i , 3
362
376
%tmp2 = add nuw nsw i32 %i , 2
363
377
%tmp3 = add nuw nsw i32 %i , 1
@@ -392,10 +406,11 @@ define i32 @load_i32_by_i8_base_offset_index(i8* %arg, i32 %i) {
392
406
; (i32) p[i + 1] | ((i32) p[i + 2] << 8) | ((i32) p[i + 3] << 16) | ((i32) p[i + 4] << 24)
393
407
define i32 @load_i32_by_i8_base_offset_index_2 (i8* %arg , i32 %i ) {
394
408
; CHECK-LABEL: load_i32_by_i8_base_offset_index_2:
395
- ; CHECK: add x8, x0, w1, uxtw
396
- ; CHECK-NEXT: ldur w8, [x8, #13]
397
- ; CHECK-NEXT: rev w0, w8
398
- ; CHECK-NEXT: ret
409
+ ; CHECK: // %bb.0:
410
+ ; CHECK-NEXT: add x8, x0, w1, uxtw
411
+ ; CHECK-NEXT: ldur w8, [x8, #13]
412
+ ; CHECK-NEXT: rev w0, w8
413
+ ; CHECK-NEXT: ret
399
414
%tmp = add nuw nsw i32 %i , 4
400
415
%tmp2 = add nuw nsw i32 %i , 3
401
416
%tmp3 = add nuw nsw i32 %i , 2
@@ -429,11 +444,12 @@ define i32 @load_i32_by_i8_base_offset_index_2(i8* %arg, i32 %i) {
429
444
; (i32) p[0] | ((i32) p[1] << 8)
430
445
define i32 @zext_load_i32_by_i8 (i32* %arg ) {
431
446
; CHECK-LABEL: zext_load_i32_by_i8:
432
- ; CHECK: ldrb w8, [x0]
433
- ; CHECK-NEXT: ldrb w9, [x0, #1]
434
- ; CHECK-NEXT: bfi w8, w9, #8, #8
435
- ; CHECK-NEXT: mov w0, w8
436
- ; CHECK-NEXT: ret
447
+ ; CHECK: // %bb.0:
448
+ ; CHECK-NEXT: ldrb w8, [x0]
449
+ ; CHECK-NEXT: ldrb w9, [x0, #1]
450
+ ; CHECK-NEXT: bfi w8, w9, #8, #8
451
+ ; CHECK-NEXT: mov w0, w8
452
+ ; CHECK-NEXT: ret
437
453
438
454
%tmp = bitcast i32* %arg to i8*
439
455
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 0
@@ -451,11 +467,12 @@ define i32 @zext_load_i32_by_i8(i32* %arg) {
451
467
; ((i32) p[0] << 8) | ((i32) p[1] << 16)
452
468
define i32 @zext_load_i32_by_i8_shl_8 (i32* %arg ) {
453
469
; CHECK-LABEL: zext_load_i32_by_i8_shl_8:
454
- ; CHECK: ldrb w8, [x0]
455
- ; CHECK-NEXT: ldrb w9, [x0, #1]
456
- ; CHECK-NEXT: lsl w0, w8, #8
457
- ; CHECK-NEXT: bfi w0, w9, #16, #8
458
- ; CHECK-NEXT: ret
470
+ ; CHECK: // %bb.0:
471
+ ; CHECK-NEXT: ldrb w8, [x0]
472
+ ; CHECK-NEXT: ldrb w9, [x0, #1]
473
+ ; CHECK-NEXT: lsl w0, w8, #8
474
+ ; CHECK-NEXT: bfi w0, w9, #16, #8
475
+ ; CHECK-NEXT: ret
459
476
460
477
%tmp = bitcast i32* %arg to i8*
461
478
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 0
@@ -474,11 +491,12 @@ define i32 @zext_load_i32_by_i8_shl_8(i32* %arg) {
474
491
; ((i32) p[0] << 16) | ((i32) p[1] << 24)
475
492
define i32 @zext_load_i32_by_i8_shl_16 (i32* %arg ) {
476
493
; CHECK-LABEL: zext_load_i32_by_i8_shl_16:
477
- ; CHECK: ldrb w8, [x0]
478
- ; CHECK-NEXT: ldrb w9, [x0, #1]
479
- ; CHECK-NEXT: lsl w0, w8, #16
480
- ; CHECK-NEXT: bfi w0, w9, #24, #8
481
- ; CHECK-NEXT: ret
494
+ ; CHECK: // %bb.0:
495
+ ; CHECK-NEXT: ldrb w8, [x0]
496
+ ; CHECK-NEXT: ldrb w9, [x0, #1]
497
+ ; CHECK-NEXT: lsl w0, w8, #16
498
+ ; CHECK-NEXT: bfi w0, w9, #24, #8
499
+ ; CHECK-NEXT: ret
482
500
483
501
%tmp = bitcast i32* %arg to i8*
484
502
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 0
@@ -496,11 +514,12 @@ define i32 @zext_load_i32_by_i8_shl_16(i32* %arg) {
496
514
; (i32) p[1] | ((i32) p[0] << 8)
497
515
define i32 @zext_load_i32_by_i8_bswap (i32* %arg ) {
498
516
; CHECK-LABEL: zext_load_i32_by_i8_bswap:
499
- ; CHECK: ldrb w8, [x0, #1]
500
- ; CHECK-NEXT: ldrb w9, [x0]
501
- ; CHECK-NEXT: bfi w8, w9, #8, #8
502
- ; CHECK-NEXT: mov w0, w8
503
- ; CHECK-NEXT: ret
517
+ ; CHECK: // %bb.0:
518
+ ; CHECK-NEXT: ldrb w8, [x0, #1]
519
+ ; CHECK-NEXT: ldrb w9, [x0]
520
+ ; CHECK-NEXT: bfi w8, w9, #8, #8
521
+ ; CHECK-NEXT: mov w0, w8
522
+ ; CHECK-NEXT: ret
504
523
505
524
%tmp = bitcast i32* %arg to i8*
506
525
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 1
@@ -518,11 +537,12 @@ define i32 @zext_load_i32_by_i8_bswap(i32* %arg) {
518
537
; ((i32) p[1] << 8) | ((i32) p[0] << 16)
519
538
define i32 @zext_load_i32_by_i8_bswap_shl_8 (i32* %arg ) {
520
539
; CHECK-LABEL: zext_load_i32_by_i8_bswap_shl_8:
521
- ; CHECK: ldrb w8, [x0, #1]
522
- ; CHECK-NEXT: ldrb w9, [x0]
523
- ; CHECK-NEXT: lsl w0, w8, #8
524
- ; CHECK-NEXT: bfi w0, w9, #16, #8
525
- ; CHECK-NEXT: ret
540
+ ; CHECK: // %bb.0:
541
+ ; CHECK-NEXT: ldrb w8, [x0, #1]
542
+ ; CHECK-NEXT: ldrb w9, [x0]
543
+ ; CHECK-NEXT: lsl w0, w8, #8
544
+ ; CHECK-NEXT: bfi w0, w9, #16, #8
545
+ ; CHECK-NEXT: ret
526
546
527
547
%tmp = bitcast i32* %arg to i8*
528
548
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 1
@@ -541,11 +561,12 @@ define i32 @zext_load_i32_by_i8_bswap_shl_8(i32* %arg) {
541
561
; ((i32) p[1] << 16) | ((i32) p[0] << 24)
542
562
define i32 @zext_load_i32_by_i8_bswap_shl_16 (i32* %arg ) {
543
563
; CHECK-LABEL: zext_load_i32_by_i8_bswap_shl_16:
544
- ; CHECK: ldrb w8, [x0, #1]
545
- ; CHECK-NEXT: ldrb w9, [x0]
546
- ; CHECK-NEXT: lsl w0, w8, #16
547
- ; CHECK-NEXT: bfi w0, w9, #24, #8
548
- ; CHECK-NEXT: ret
564
+ ; CHECK: // %bb.0:
565
+ ; CHECK-NEXT: ldrb w8, [x0, #1]
566
+ ; CHECK-NEXT: ldrb w9, [x0]
567
+ ; CHECK-NEXT: lsl w0, w8, #16
568
+ ; CHECK-NEXT: bfi w0, w9, #24, #8
569
+ ; CHECK-NEXT: ret
549
570
550
571
%tmp = bitcast i32* %arg to i8*
551
572
%tmp1 = getelementptr inbounds i8 , i8* %tmp , i32 1
@@ -568,10 +589,11 @@ define i32 @zext_load_i32_by_i8_bswap_shl_16(i32* %arg) {
568
589
; because in the original DAG we don't have p[1] address available
569
590
define i16 @load_i16_from_nonzero_offset (i8* %p ) {
570
591
; CHECK-LABEL: load_i16_from_nonzero_offset:
571
- ; CHECK: ldrh w8, [x0]
572
- ; CHECK-NEXT: ldrb w0, [x0, #2]
573
- ; CHECK-NEXT: bfi w0, w8, #8, #24
574
- ; CHECK-NEXT: ret
592
+ ; CHECK: // %bb.0:
593
+ ; CHECK-NEXT: ldrh w8, [x0]
594
+ ; CHECK-NEXT: ldrb w0, [x0, #2]
595
+ ; CHECK-NEXT: bfi w0, w8, #8, #24
596
+ ; CHECK-NEXT: ret
575
597
576
598
%p1.i16 = bitcast i8* %p to i16*
577
599
%p2.i8 = getelementptr i8 , i8* %p , i64 2
0 commit comments