Skip to content

Commit 4836f6a

Browse files
[GISel][CombinerHelper] Shuffle pattern for reversing vector order
1 parent dd2555b commit 4836f6a

File tree

2 files changed

+213
-0
lines changed

2 files changed

+213
-0
lines changed

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,50 @@ bool CombinerHelper::tryCombineShuffleVector(MachineInstr &MI) {
594594
return true;
595595
}
596596

597+
// {n/2, n/2+1, ..., n, 0, 1, ..., n/2-1}
598+
GeneratorType FirstHalf = adderGenerator(0, SrcNumElts / 2, 1);
599+
GeneratorType SecondHalf = adderGenerator(SrcNumElts / 2, SrcNumElts, 1);
600+
GeneratorType Reverse =
601+
concatGenerators(SmallVector<GeneratorType>{FirstHalf, SecondHalf});
602+
603+
if (matchCombineShuffleVector(MI, Reverse, SrcNumElts)) {
604+
// The shuffle is concatenating multiple vectors together.
605+
// Collect the different operands for that.
606+
Register UndefReg;
607+
const Register Src1 = MI.getOperand(1).getReg();
608+
const Register Src2 = MI.getOperand(2).getReg();
609+
const ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask();
610+
611+
// The destination can be longer than the source, so we separate them into
612+
// equal blocks and check them separately to see if one of the blocks can be
613+
// copied whole.
614+
unsigned NumConcat = DstNumElts / SrcNumElts;
615+
unsigned Index = 0;
616+
for (unsigned Concat = 0; Concat < NumConcat; Concat++) {
617+
unsigned Target = (Concat + 1) * SrcNumElts;
618+
while (Index < Target) {
619+
int MaskElt = Mask[Index];
620+
if (MaskElt >= 0) {
621+
Ops.push_back((MaskElt < (int)SrcNumElts) ? Src1 : Src2);
622+
break;
623+
}
624+
Index++;
625+
}
626+
627+
if (Index == Target) {
628+
if (!UndefReg) {
629+
Builder.setInsertPt(*MI.getParent(), MI);
630+
UndefReg = Builder.buildUndef(SrcTy).getReg(0);
631+
}
632+
Ops.push_back(UndefReg);
633+
}
634+
635+
Index = Target;
636+
}
637+
applyCombineShuffleVector(MI, {Ops[1], Ops[0]});
638+
return true;
639+
}
640+
597641
return false;
598642
}
599643

llvm/test/CodeGen/AIE/aie2/GlobalISel/prelegalizercombiner-shufflevector.mir

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,3 +682,172 @@ body: |
682682
%3:_(<128 x s8>) = G_SHUFFLE_VECTOR %1:_(<128 x s8>), %2:_(<128 x s8>), shufflemask(128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63)
683683
PseudoRET implicit $lr, implicit %3
684684
...
685+
686+
---
687+
name: concat_vector_reverse_32_512
688+
legalized: false
689+
body: |
690+
bb.1.entry:
691+
liveins: $wl2, $wl4
692+
; CHECK-LABEL: name: concat_vector_reverse_32_512
693+
; CHECK: liveins: $wl2, $wl4
694+
; CHECK-NEXT: {{ $}}
695+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
696+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
697+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
698+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
699+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
700+
%1:_(<8 x s32>) = COPY $wl2
701+
%2:_(<8 x s32>) = COPY $wl4
702+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7)
703+
$x0 = COPY %0:_(<16 x s32>)
704+
PseudoRET implicit $lr, implicit $x0
705+
...
706+
707+
---
708+
name: concat_vector_reverse_32_512_undef_start_first
709+
legalized: false
710+
body: |
711+
bb.1.entry:
712+
liveins: $wl2, $wl4
713+
; CHECK-LABEL: name: concat_vector_reverse_32_512_undef_start_first
714+
; CHECK: liveins: $wl2, $wl4
715+
; CHECK-NEXT: {{ $}}
716+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
717+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
718+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
719+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
720+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
721+
%1:_(<8 x s32>) = COPY $wl2
722+
%2:_(<8 x s32>) = COPY $wl4
723+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(-1, -1, -1, -1, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7)
724+
$x0 = COPY %0:_(<16 x s32>)
725+
PseudoRET implicit $lr, implicit $x0
726+
...
727+
728+
---
729+
name: concat_vector_reverse_32_512_start_end
730+
legalized: false
731+
body: |
732+
bb.1.entry:
733+
liveins: $wl2, $wl4
734+
; CHECK-LABEL: name: concat_vector_reverse_32_512_start_end
735+
; CHECK: liveins: $wl2, $wl4
736+
; CHECK-NEXT: {{ $}}
737+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
738+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
739+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
740+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
741+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
742+
%1:_(<8 x s32>) = COPY $wl2
743+
%2:_(<8 x s32>) = COPY $wl4
744+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(8, 9, 10, 11, 12, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7)
745+
$x0 = COPY %0:_(<16 x s32>)
746+
PseudoRET implicit $lr, implicit $x0
747+
...
748+
749+
---
750+
name: concat_vector_reverse_32_512_end_start
751+
legalized: false
752+
body: |
753+
bb.1.entry:
754+
liveins: $wl2, $wl4
755+
; CHECK-LABEL: name: concat_vector_reverse_32_512_end_start
756+
; CHECK: liveins: $wl2, $wl4
757+
; CHECK-NEXT: {{ $}}
758+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
759+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
760+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
761+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
762+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
763+
%1:_(<8 x s32>) = COPY $wl2
764+
%2:_(<8 x s32>) = COPY $wl4
765+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(8, 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, 4, 5, 6, 7)
766+
$x0 = COPY %0:_(<16 x s32>)
767+
PseudoRET implicit $lr, implicit $x0
768+
...
769+
770+
---
771+
name: concat_vector_reverse_32_512_end_end
772+
legalized: false
773+
body: |
774+
bb.1.entry:
775+
liveins: $wl2, $wl4
776+
; CHECK-LABEL: name: concat_vector_reverse_32_512_end_end
777+
; CHECK: liveins: $wl2, $wl4
778+
; CHECK-NEXT: {{ $}}
779+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
780+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
781+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
782+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
783+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
784+
%1:_(<8 x s32>) = COPY $wl2
785+
%2:_(<8 x s32>) = COPY $wl4
786+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, -1, -1, -1, -1)
787+
$x0 = COPY %0:_(<16 x s32>)
788+
PseudoRET implicit $lr, implicit $x0
789+
...
790+
791+
---
792+
name: concat_vector_reverse_32_512_first_block
793+
legalized: false
794+
body: |
795+
bb.1.entry:
796+
liveins: $wl2, $wl4
797+
; CHECK-LABEL: name: concat_vector_reverse_32_512_first_block
798+
; CHECK: liveins: $wl2, $wl4
799+
; CHECK-NEXT: {{ $}}
800+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
801+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s32>) = G_IMPLICIT_DEF
802+
; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
803+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[DEF]](<8 x s32>), [[COPY]](<8 x s32>)
804+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
805+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
806+
%1:_(<8 x s32>) = COPY $wl2
807+
%2:_(<8 x s32>) = COPY $wl4
808+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(-1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7)
809+
$x0 = COPY %0:_(<16 x s32>)
810+
PseudoRET implicit $lr, implicit $x0
811+
...
812+
813+
---
814+
name: concat_vector_reverse_32_512_second_block
815+
legalized: false
816+
body: |
817+
bb.1.entry:
818+
liveins: $wl2, $wl4
819+
; CHECK-LABEL: name: concat_vector_reverse_32_512_second_block
820+
; CHECK: liveins: $wl2, $wl4
821+
; CHECK-NEXT: {{ $}}
822+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
823+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s32>) = G_IMPLICIT_DEF
824+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY]](<8 x s32>), [[DEF]](<8 x s32>)
825+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
826+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
827+
%1:_(<8 x s32>) = COPY $wl2
828+
%2:_(<8 x s32>) = COPY $wl4
829+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(8, 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1)
830+
$x0 = COPY %0:_(<16 x s32>)
831+
PseudoRET implicit $lr, implicit $x0
832+
...
833+
834+
---
835+
name: concat_vector_reverse_32_512_random
836+
legalized: false
837+
body: |
838+
bb.1.entry:
839+
liveins: $wl2, $wl4
840+
; CHECK-LABEL: name: concat_vector_reverse_32_512_random
841+
; CHECK: liveins: $wl2, $wl4
842+
; CHECK-NEXT: {{ $}}
843+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
844+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
845+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
846+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
847+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
848+
%1:_(<8 x s32>) = COPY $wl2
849+
%2:_(<8 x s32>) = COPY $wl4
850+
%0:_(<16 x s32>) = G_SHUFFLE_VECTOR %1:_(<8 x s32>), %2:_, shufflemask(8, 9, -1, 11, 12, 13, -1, 15, 0, 1, -1, 3, 4, 5, -1, 7)
851+
$x0 = COPY %0:_(<16 x s32>)
852+
PseudoRET implicit $lr, implicit $x0
853+
...

0 commit comments

Comments
 (0)