@@ -541,18 +541,18 @@ define i32 @load_extract_clobber_store_between(ptr %x, ptr %y) {
541
541
define i32 @load_extract_clobber_store_between_limit (ptr %x , ptr %y , <8 x i32 > %z ) {
542
542
; CHECK-LABEL: @load_extract_clobber_store_between_limit(
543
543
; CHECK-NEXT: [[LV:%.*]] = load <4 x i32>, ptr [[X:%.*]], align 16
544
- ; CHECK-NEXT: [[Z_0 :%.*]] = extractelement <8 x i32> [[Z :%.*]], i32 0
545
- ; CHECK-NEXT: [[Z_1 :%.*]] = extractelement <8 x i32> [[Z ]], i32 1
546
- ; CHECK-NEXT: [[ADD_0 :%.*]] = add i32 [[Z_0 ]], [[Z_1]]
547
- ; CHECK-NEXT: [[Z_2 :%.*]] = extractelement <8 x i32> [[Z ]], i32 2
548
- ; CHECK-NEXT: [[ADD_1 :%.*]] = add i32 [[ADD_0 ]], [[Z_2]]
549
- ; CHECK-NEXT: [[Z_3 :%.*]] = extractelement <8 x i32> [[Z ]], i32 3
550
- ; CHECK-NEXT: [[ADD_2 :%.*]] = add i32 [[ADD_1 ]], [[Z_3]]
551
- ; CHECK-NEXT: [[Z_4 :%.*]] = extractelement <8 x i32> [[Z ]], i32 4
552
- ; CHECK-NEXT: [[ADD_3 :%.*]] = add i32 [[ADD_2 ]], [[Z_4]]
544
+ ; CHECK-NEXT: [[SHIFT :%.*]] = shufflevector <8 x i32> [[Z1 :%.*]], <8 x i32> poison, <8 x i32> <i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
545
+ ; CHECK-NEXT: [[TMP1 :%.*]] = add <8 x i32> [[Z1 ]], [[SHIFT]]
546
+ ; CHECK-NEXT: [[SHIFT1 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
547
+ ; CHECK-NEXT: [[TMP2 :%.*]] = add <8 x i32> [[TMP1 ]], [[SHIFT1]]
548
+ ; CHECK-NEXT: [[SHIFT2 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
549
+ ; CHECK-NEXT: [[TMP3 :%.*]] = add <8 x i32> [[TMP2 ]], [[SHIFT2]]
550
+ ; CHECK-NEXT: [[SHIFT3 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
551
+ ; CHECK-NEXT: [[Z :%.*]] = add <8 x i32> [[TMP3 ]], [[SHIFT3]]
552
+ ; CHECK-NEXT: [[Z_0 :%.*]] = extractelement <8 x i32> [[Z ]], i32 0
553
553
; CHECK-NEXT: store i8 0, ptr [[Y:%.*]], align 1
554
554
; CHECK-NEXT: [[R:%.*]] = extractelement <4 x i32> [[LV]], i32 2
555
- ; CHECK-NEXT: [[ADD_4:%.*]] = add i32 [[ADD_3 ]], [[R]]
555
+ ; CHECK-NEXT: [[ADD_4:%.*]] = add i32 [[Z_0 ]], [[R]]
556
556
; CHECK-NEXT: ret i32 [[ADD_4]]
557
557
;
558
558
%lv = load <4 x i32 >, ptr %x
@@ -573,35 +573,35 @@ define i32 @load_extract_clobber_store_between_limit(ptr %x, ptr %y, <8 x i32> %
573
573
574
574
define i32 @load_extract_clobber_store_after_limit (ptr %x , ptr %y , <8 x i32 > %z ) {
575
575
; LIMIT-DEFAULT-LABEL: @load_extract_clobber_store_after_limit(
576
- ; LIMIT-DEFAULT-NEXT: [[Z_0 :%.*]] = extractelement <8 x i32> [[Z :%.*]], i32 0
577
- ; LIMIT-DEFAULT-NEXT: [[Z_1 :%.*]] = extractelement <8 x i32> [[Z ]], i32 1
578
- ; LIMIT-DEFAULT-NEXT: [[ADD_0 :%.*]] = add i32 [[Z_0 ]], [[Z_1]]
579
- ; LIMIT-DEFAULT-NEXT: [[Z_2 :%.*]] = extractelement <8 x i32> [[Z ]], i32 2
580
- ; LIMIT-DEFAULT-NEXT: [[ADD_1 :%.*]] = add i32 [[ADD_0 ]], [[Z_2]]
581
- ; LIMIT-DEFAULT-NEXT: [[Z_3 :%.*]] = extractelement <8 x i32> [[Z ]], i32 3
582
- ; LIMIT-DEFAULT-NEXT: [[ADD_2 :%.*]] = add i32 [[ADD_1 ]], [[Z_3]]
583
- ; LIMIT-DEFAULT-NEXT: [[Z_4 :%.*]] = extractelement <8 x i32> [[Z ]], i32 4
584
- ; LIMIT-DEFAULT-NEXT: [[ADD_3 :%.*]] = add i32 [[ADD_2 ]], [[Z_4]]
576
+ ; LIMIT-DEFAULT-NEXT: [[SHIFT :%.*]] = shufflevector <8 x i32> [[Z1 :%.*]], <8 x i32> poison, <8 x i32> <i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
577
+ ; LIMIT-DEFAULT-NEXT: [[TMP4 :%.*]] = add <8 x i32> [[Z1 ]], [[SHIFT]]
578
+ ; LIMIT-DEFAULT-NEXT: [[SHIFT1 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
579
+ ; LIMIT-DEFAULT-NEXT: [[TMP2 :%.*]] = add <8 x i32> [[TMP4 ]], [[SHIFT1]]
580
+ ; LIMIT-DEFAULT-NEXT: [[SHIFT2 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
581
+ ; LIMIT-DEFAULT-NEXT: [[TMP3 :%.*]] = add <8 x i32> [[TMP2 ]], [[SHIFT2]]
582
+ ; LIMIT-DEFAULT-NEXT: [[SHIFT3 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
583
+ ; LIMIT-DEFAULT-NEXT: [[Z :%.*]] = add <8 x i32> [[TMP3 ]], [[SHIFT3]]
584
+ ; LIMIT-DEFAULT-NEXT: [[Z_0 :%.*]] = extractelement <8 x i32> [[Z ]], i32 0
585
585
; LIMIT-DEFAULT-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x i32>, ptr [[X:%.*]], i32 0, i32 2
586
586
; LIMIT-DEFAULT-NEXT: [[R:%.*]] = load i32, ptr [[TMP1]], align 8
587
587
; LIMIT-DEFAULT-NEXT: store i8 0, ptr [[Y:%.*]], align 1
588
- ; LIMIT-DEFAULT-NEXT: [[ADD_4:%.*]] = add i32 [[ADD_3 ]], [[R]]
588
+ ; LIMIT-DEFAULT-NEXT: [[ADD_4:%.*]] = add i32 [[Z_0 ]], [[R]]
589
589
; LIMIT-DEFAULT-NEXT: ret i32 [[ADD_4]]
590
590
;
591
591
; LIMIT2-LABEL: @load_extract_clobber_store_after_limit(
592
592
; LIMIT2-NEXT: [[LV:%.*]] = load <4 x i32>, ptr [[X:%.*]], align 16
593
- ; LIMIT2-NEXT: [[Z_0 :%.*]] = extractelement <8 x i32> [[Z :%.*]], i32 0
594
- ; LIMIT2-NEXT: [[Z_1 :%.*]] = extractelement <8 x i32> [[Z ]], i32 1
595
- ; LIMIT2-NEXT: [[ADD_0 :%.*]] = add i32 [[Z_0 ]], [[Z_1]]
596
- ; LIMIT2-NEXT: [[Z_2 :%.*]] = extractelement <8 x i32> [[Z ]], i32 2
597
- ; LIMIT2-NEXT: [[ADD_1 :%.*]] = add i32 [[ADD_0 ]], [[Z_2]]
598
- ; LIMIT2-NEXT: [[Z_3 :%.*]] = extractelement <8 x i32> [[Z ]], i32 3
599
- ; LIMIT2-NEXT: [[ADD_2 :%.*]] = add i32 [[ADD_1 ]], [[Z_3]]
600
- ; LIMIT2-NEXT: [[Z_4 :%.*]] = extractelement <8 x i32> [[Z ]], i32 4
601
- ; LIMIT2-NEXT: [[ADD_3 :%.*]] = add i32 [[ADD_2 ]], [[Z_4]]
593
+ ; LIMIT2-NEXT: [[SHIFT :%.*]] = shufflevector <8 x i32> [[Z1 :%.*]], <8 x i32> poison, <8 x i32> <i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
594
+ ; LIMIT2-NEXT: [[TMP1 :%.*]] = add <8 x i32> [[Z1 ]], [[SHIFT]]
595
+ ; LIMIT2-NEXT: [[SHIFT1 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 2, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
596
+ ; LIMIT2-NEXT: [[TMP2 :%.*]] = add <8 x i32> [[TMP1 ]], [[SHIFT1]]
597
+ ; LIMIT2-NEXT: [[SHIFT2 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
598
+ ; LIMIT2-NEXT: [[TMP3 :%.*]] = add <8 x i32> [[TMP2 ]], [[SHIFT2]]
599
+ ; LIMIT2-NEXT: [[SHIFT3 :%.*]] = shufflevector <8 x i32> [[Z1 ]], <8 x i32> poison, <8 x i32> <i32 4, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
600
+ ; LIMIT2-NEXT: [[Z :%.*]] = add <8 x i32> [[TMP3 ]], [[SHIFT3]]
601
+ ; LIMIT2-NEXT: [[Z_0 :%.*]] = extractelement <8 x i32> [[Z ]], i32 0
602
602
; LIMIT2-NEXT: [[R:%.*]] = extractelement <4 x i32> [[LV]], i32 2
603
603
; LIMIT2-NEXT: store i8 0, ptr [[Y:%.*]], align 1
604
- ; LIMIT2-NEXT: [[ADD_4:%.*]] = add i32 [[ADD_3 ]], [[R]]
604
+ ; LIMIT2-NEXT: [[ADD_4:%.*]] = add i32 [[Z_0 ]], [[R]]
605
605
; LIMIT2-NEXT: ret i32 [[ADD_4]]
606
606
;
607
607
%lv = load <4 x i32 >, ptr %x
@@ -671,9 +671,9 @@ define i1 @load_with_non_power_of_2_element_type_2(ptr %x) {
671
671
define i32 @load_multiple_extracts_with_constant_idx (ptr %x ) {
672
672
; CHECK-LABEL: @load_multiple_extracts_with_constant_idx(
673
673
; CHECK-NEXT: [[LV:%.*]] = load <4 x i32>, ptr [[X:%.*]], align 16
674
- ; CHECK-NEXT: [[E_0 :%.*]] = extractelement <4 x i32> [[LV]], i32 0
675
- ; CHECK-NEXT: [[E_1 :%.*]] = extractelement <4 x i32> [[LV]], i32 1
676
- ; CHECK-NEXT: [[RES:%.*]] = add i32 [[E_0 ]], [[E_1]]
674
+ ; CHECK-NEXT: [[SHIFT :%.*]] = shufflevector <4 x i32> [[LV]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
675
+ ; CHECK-NEXT: [[TMP1 :%.*]] = add <4 x i32> [[LV]], [[SHIFT]]
676
+ ; CHECK-NEXT: [[RES:%.*]] = extractelement <4 x i32> [[TMP1 ]], i32 0
677
677
; CHECK-NEXT: ret i32 [[RES]]
678
678
;
679
679
%lv = load <4 x i32 >, ptr %x
@@ -688,9 +688,9 @@ define i32 @load_multiple_extracts_with_constant_idx(ptr %x) {
688
688
define i32 @load_multiple_extracts_with_constant_idx_profitable (ptr %x ) {
689
689
; CHECK-LABEL: @load_multiple_extracts_with_constant_idx_profitable(
690
690
; CHECK-NEXT: [[LV:%.*]] = load <8 x i32>, ptr [[X:%.*]], align 16
691
- ; CHECK-NEXT: [[E_0 :%.*]] = extractelement <8 x i32> [[LV]], i32 0
692
- ; CHECK-NEXT: [[E_1 :%.*]] = extractelement <8 x i32> [[LV]], i32 6
693
- ; CHECK-NEXT: [[RES:%.*]] = add i32 [[E_0 ]], [[E_1]]
691
+ ; CHECK-NEXT: [[SHIFT :%.*]] = shufflevector <8 x i32> [[LV]], <8 x i32> poison, <8 x i32> <i32 6, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
692
+ ; CHECK-NEXT: [[TMP1 :%.*]] = add <8 x i32> [[LV]], [[SHIFT]]
693
+ ; CHECK-NEXT: [[RES:%.*]] = extractelement <8 x i32> [[TMP1 ]], i32 0
694
694
; CHECK-NEXT: ret i32 [[RES]]
695
695
;
696
696
%lv = load <8 x i32 >, ptr %x , align 16
0 commit comments