@@ -638,9 +638,8 @@ define <4 x i32> @src_v2tov4_i32_change_to_other_vector(<2 x i1> %a, <2 x i1> %b
638638 ret <4 x i32 > %res
639639}
640640
641- ; Multi-use tests - first select has multiple uses
642- define <4 x i32 > @src_v2tov4_i32_multiuse_sel0 (<2 x i1 > %a , <2 x i1 > %b , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z , ptr %p ) {
643- ; CHECK-LABEL: define <4 x i32> @src_v2tov4_i32_multiuse_sel0(
641+ define <4 x i32 > @src_v2tov4_i32_multiuse_sel1 (<2 x i1 > %a , <2 x i1 > %b , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z , ptr %p ) {
642+ ; CHECK-LABEL: define <4 x i32> @src_v2tov4_i32_multiuse_sel1(
644643; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
645644; CHECK-NEXT: [[SELECT_XZ:%.*]] = select <2 x i1> [[A]], <2 x i32> [[X]], <2 x i32> [[Z]]
646645; CHECK-NEXT: store <2 x i32> [[SELECT_XZ]], ptr [[P]], align 8
@@ -655,9 +654,8 @@ define <4 x i32> @src_v2tov4_i32_multiuse_sel0(<2 x i1> %a, <2 x i1> %b, <2 x i3
655654 ret <4 x i32 > %res
656655}
657656
658- ; Multi-use tests - second select has multiple uses
659- define <4 x i32 > @src_v2tov4_i32_multiuse_sel1 (<2 x i1 > %a , <2 x i1 > %b , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z , ptr %p ) {
660- ; CHECK-LABEL: define <4 x i32> @src_v2tov4_i32_multiuse_sel1(
657+ define <4 x i32 > @src_v2tov4_i32_multiuse_sel2 (<2 x i1 > %a , <2 x i1 > %b , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z , ptr %p ) {
658+ ; CHECK-LABEL: define <4 x i32> @src_v2tov4_i32_multiuse_sel2(
661659; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {
662660; CHECK-NEXT: [[SELECT_XZ:%.*]] = select <2 x i1> [[A]], <2 x i32> [[X]], <2 x i32> [[Z]]
663661; CHECK-NEXT: [[SELECT_YX:%.*]] = select <2 x i1> [[B]], <2 x i32> [[Y]], <2 x i32> [[X]]
@@ -672,7 +670,6 @@ define <4 x i32> @src_v2tov4_i32_multiuse_sel1(<2 x i1> %a, <2 x i1> %b, <2 x i3
672670 ret <4 x i32 > %res
673671}
674672
675- ; Multi-use tests - both selects have multiple uses
676673define <4 x i32 > @src_v2tov4_i32_multiuse_both (<2 x i1 > %a , <2 x i1 > %b , <2 x i32 > %x , <2 x i32 > %y , <2 x i32 > %z , ptr %p1 , ptr %p2 ) {
677674; CHECK-LABEL: define <4 x i32> @src_v2tov4_i32_multiuse_both(
678675; CHECK-SAME: <2 x i1> [[A:%.*]], <2 x i1> [[B:%.*]], <2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]], <2 x i32> [[Z:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) #[[ATTR0]] {
@@ -690,3 +687,37 @@ define <4 x i32> @src_v2tov4_i32_multiuse_both(<2 x i1> %a, <2 x i1> %b, <2 x i3
690687 %res = shufflevector <2 x i32 > %select.xz , <2 x i32 > %select.yx , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
691688 ret <4 x i32 > %res
692689}
690+
691+ define <2 x i32 > @src_v1024tov2_i32_multiuse_sel1 (<1024 x i1 > %a , <1024 x i1 > %b , <1024 x i32 > %x , <1024 x i32 > %y , <1024 x i32 > %z , ptr %p1 , ptr %p2 ) {
692+ ; SSE-LABEL: define <2 x i32> @src_v1024tov2_i32_multiuse_sel1(
693+ ; SSE-SAME: <1024 x i1> [[A:%.*]], <1024 x i1> [[B:%.*]], <1024 x i32> [[X:%.*]], <1024 x i32> [[Y:%.*]], <1024 x i32> [[Z:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) #[[ATTR0]] {
694+ ; SSE-NEXT: [[SELECT_XZ:%.*]] = select <1024 x i1> [[A]], <1024 x i32> [[X]], <1024 x i32> [[Z]]
695+ ; SSE-NEXT: store <1024 x i32> [[SELECT_XZ]], ptr [[P1]], align 4096
696+ ; SSE-NEXT: [[SELECT_YX:%.*]] = select <1024 x i1> [[B]], <1024 x i32> [[Y]], <1024 x i32> [[X]]
697+ ; SSE-NEXT: [[RES:%.*]] = shufflevector <1024 x i32> [[SELECT_XZ]], <1024 x i32> [[SELECT_YX]], <2 x i32> <i32 0, i32 1024>
698+ ; SSE-NEXT: ret <2 x i32> [[RES]]
699+ ;
700+ ; AVX2-LABEL: define <2 x i32> @src_v1024tov2_i32_multiuse_sel1(
701+ ; AVX2-SAME: <1024 x i1> [[A:%.*]], <1024 x i1> [[B:%.*]], <1024 x i32> [[X:%.*]], <1024 x i32> [[Y:%.*]], <1024 x i32> [[Z:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) #[[ATTR0]] {
702+ ; AVX2-NEXT: [[SELECT_XZ:%.*]] = select <1024 x i1> [[A]], <1024 x i32> [[X]], <1024 x i32> [[Z]]
703+ ; AVX2-NEXT: store <1024 x i32> [[SELECT_XZ]], ptr [[P1]], align 4096
704+ ; AVX2-NEXT: [[SELECT_YX:%.*]] = select <1024 x i1> [[B]], <1024 x i32> [[Y]], <1024 x i32> [[X]]
705+ ; AVX2-NEXT: [[RES:%.*]] = shufflevector <1024 x i32> [[SELECT_XZ]], <1024 x i32> [[SELECT_YX]], <2 x i32> <i32 0, i32 1024>
706+ ; AVX2-NEXT: ret <2 x i32> [[RES]]
707+ ;
708+ ; AVX512-LABEL: define <2 x i32> @src_v1024tov2_i32_multiuse_sel1(
709+ ; AVX512-SAME: <1024 x i1> [[A:%.*]], <1024 x i1> [[B:%.*]], <1024 x i32> [[X:%.*]], <1024 x i32> [[Y:%.*]], <1024 x i32> [[Z:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) #[[ATTR0]] {
710+ ; AVX512-NEXT: [[SELECT_XZ:%.*]] = select <1024 x i1> [[A]], <1024 x i32> [[X]], <1024 x i32> [[Z]]
711+ ; AVX512-NEXT: store <1024 x i32> [[SELECT_XZ]], ptr [[P1]], align 4096
712+ ; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <1024 x i1> [[A]], <1024 x i1> [[B]], <2 x i32> <i32 0, i32 1024>
713+ ; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <1024 x i32> [[X]], <1024 x i32> [[Y]], <2 x i32> <i32 0, i32 1024>
714+ ; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <1024 x i32> [[Z]], <1024 x i32> [[X]], <2 x i32> <i32 0, i32 1024>
715+ ; AVX512-NEXT: [[RES:%.*]] = select <2 x i1> [[TMP1]], <2 x i32> [[TMP2]], <2 x i32> [[TMP3]]
716+ ; AVX512-NEXT: ret <2 x i32> [[RES]]
717+ ;
718+ %select.xz = select <1024 x i1 > %a , <1024 x i32 > %x , <1024 x i32 > %z
719+ store <1024 x i32 > %select.xz , ptr %p1
720+ %select.yx = select <1024 x i1 > %b , <1024 x i32 > %y , <1024 x i32 > %x
721+ %res = shufflevector <1024 x i32 > %select.xz , <1024 x i32 > %select.yx , <2 x i32 > <i32 0 , i32 1024 >
722+ ret <2 x i32 > %res
723+ }
0 commit comments