Skip to content

Commit 07244e7

Browse files
[GISel][CombinerHelper] Shuffle pattern for reversing vector order
1 parent c2e6b01 commit 07244e7

File tree

2 files changed

+212
-0
lines changed

2 files changed

+212
-0
lines changed

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,50 @@ bool CombinerHelper::tryCombineShuffleVector(MachineInstr &MI) {
494494
return true;
495495
}
496496

497+
// {n/2, n/2+1, ..., n, 0, 1, ..., n/2-1}
498+
GeneratorType FirstHalf = adderGenerator(0, SrcNumElts / 2, 1);
499+
GeneratorType SecondHalf = adderGenerator(SrcNumElts / 2, SrcNumElts, 1);
500+
GeneratorType Reverse =
501+
concatGenerators(SmallVector<GeneratorType>{FirstHalf, SecondHalf});
502+
503+
if (matchCombineShuffleVector(MI, Reverse, SrcNumElts)) {
504+
// The shuffle is concatenating multiple vectors together.
505+
// Collect the different operands for that.
506+
Register UndefReg;
507+
const Register Src1 = MI.getOperand(1).getReg();
508+
const Register Src2 = MI.getOperand(2).getReg();
509+
const ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask();
510+
511+
// The destination can be longer than the source, so we separate them into
512+
// equal blocks and check them separately to see if one of the blocks can be
513+
// copied whole.
514+
unsigned NumConcat = DstNumElts / SrcNumElts;
515+
unsigned Index = 0;
516+
for (unsigned Concat = 0; Concat < NumConcat; Concat++) {
517+
unsigned Target = (Concat + 1) * SrcNumElts;
518+
while (Index < Target) {
519+
int MaskElt = Mask[Index];
520+
if (MaskElt >= 0) {
521+
Ops.push_back((MaskElt < (int)SrcNumElts) ? Src1 : Src2);
522+
break;
523+
}
524+
Index++;
525+
}
526+
527+
if (Index == Target) {
528+
if (!UndefReg) {
529+
Builder.setInsertPt(*MI.getParent(), MI);
530+
UndefReg = Builder.buildUndef(SrcTy).getReg(0);
531+
}
532+
Ops.push_back(UndefReg);
533+
}
534+
535+
Index = Target;
536+
}
537+
applyCombineShuffleVector(MI, {Ops[1], Ops[0]});
538+
return true;
539+
}
540+
497541
return false;
498542
}
499543

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

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,3 +609,171 @@ body: |
609609
%2:_(<128 x s8>) = COPY $y3
610610
%3:_(<128 x s8>) = G_SHUFFLE_VECTOR %1:_(<128 x s8>), %2:_(<128 x s8>), shufflemask(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, 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)
611611
PseudoRET implicit $lr, implicit %3
612+
...
613+
614+
---
615+
name: concat_vector_reverse_32_512
616+
legalized: false
617+
body: |
618+
bb.1.entry:
619+
liveins: $wl2, $wl4
620+
; CHECK-LABEL: name: concat_vector_reverse_32_512
621+
; CHECK: liveins: $wl2, $wl4
622+
; CHECK-NEXT: {{ $}}
623+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
624+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
625+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
626+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
627+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
628+
%1:_(<8 x s32>) = COPY $wl2
629+
%2:_(<8 x s32>) = COPY $wl4
630+
%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)
631+
$x0 = COPY %0:_(<16 x s32>)
632+
PseudoRET implicit $lr, implicit $x0
633+
...
634+
635+
---
636+
name: concat_vector_reverse_32_512_undef_start_first
637+
legalized: false
638+
body: |
639+
bb.1.entry:
640+
liveins: $wl2, $wl4
641+
; CHECK-LABEL: name: concat_vector_reverse_32_512_undef_start_first
642+
; CHECK: liveins: $wl2, $wl4
643+
; CHECK-NEXT: {{ $}}
644+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
645+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
646+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
647+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
648+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
649+
%1:_(<8 x s32>) = COPY $wl2
650+
%2:_(<8 x s32>) = COPY $wl4
651+
%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)
652+
$x0 = COPY %0:_(<16 x s32>)
653+
PseudoRET implicit $lr, implicit $x0
654+
...
655+
656+
---
657+
name: concat_vector_reverse_32_512_start_end
658+
legalized: false
659+
body: |
660+
bb.1.entry:
661+
liveins: $wl2, $wl4
662+
; CHECK-LABEL: name: concat_vector_reverse_32_512_start_end
663+
; CHECK: liveins: $wl2, $wl4
664+
; CHECK-NEXT: {{ $}}
665+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
666+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
667+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
668+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
669+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
670+
%1:_(<8 x s32>) = COPY $wl2
671+
%2:_(<8 x s32>) = COPY $wl4
672+
%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)
673+
$x0 = COPY %0:_(<16 x s32>)
674+
PseudoRET implicit $lr, implicit $x0
675+
...
676+
677+
---
678+
name: concat_vector_reverse_32_512_end_start
679+
legalized: false
680+
body: |
681+
bb.1.entry:
682+
liveins: $wl2, $wl4
683+
; CHECK-LABEL: name: concat_vector_reverse_32_512_end_start
684+
; CHECK: liveins: $wl2, $wl4
685+
; CHECK-NEXT: {{ $}}
686+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
687+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
688+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
689+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
690+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
691+
%1:_(<8 x s32>) = COPY $wl2
692+
%2:_(<8 x s32>) = COPY $wl4
693+
%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)
694+
$x0 = COPY %0:_(<16 x s32>)
695+
PseudoRET implicit $lr, implicit $x0
696+
...
697+
698+
---
699+
name: concat_vector_reverse_32_512_end_end
700+
legalized: false
701+
body: |
702+
bb.1.entry:
703+
liveins: $wl2, $wl4
704+
; CHECK-LABEL: name: concat_vector_reverse_32_512_end_end
705+
; CHECK: liveins: $wl2, $wl4
706+
; CHECK-NEXT: {{ $}}
707+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
708+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
709+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
710+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
711+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
712+
%1:_(<8 x s32>) = COPY $wl2
713+
%2:_(<8 x s32>) = COPY $wl4
714+
%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)
715+
$x0 = COPY %0:_(<16 x s32>)
716+
PseudoRET implicit $lr, implicit $x0
717+
...
718+
719+
---
720+
name: concat_vector_reverse_32_512_first_block
721+
legalized: false
722+
body: |
723+
bb.1.entry:
724+
liveins: $wl2, $wl4
725+
; CHECK-LABEL: name: concat_vector_reverse_32_512_first_block
726+
; CHECK: liveins: $wl2, $wl4
727+
; CHECK-NEXT: {{ $}}
728+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
729+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s32>) = G_IMPLICIT_DEF
730+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[DEF]](<8 x s32>), [[COPY]](<8 x s32>)
731+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
732+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
733+
%1:_(<8 x s32>) = COPY $wl2
734+
%2:_(<8 x s32>) = COPY $wl4
735+
%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)
736+
$x0 = COPY %0:_(<16 x s32>)
737+
PseudoRET implicit $lr, implicit $x0
738+
...
739+
740+
---
741+
name: concat_vector_reverse_32_512_second_block
742+
legalized: false
743+
body: |
744+
bb.1.entry:
745+
liveins: $wl2, $wl4
746+
; CHECK-LABEL: name: concat_vector_reverse_32_512_second_block
747+
; CHECK: liveins: $wl2, $wl4
748+
; CHECK-NEXT: {{ $}}
749+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
750+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s32>) = G_IMPLICIT_DEF
751+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY]](<8 x s32>), [[DEF]](<8 x s32>)
752+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
753+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
754+
%1:_(<8 x s32>) = COPY $wl2
755+
%2:_(<8 x s32>) = COPY $wl4
756+
%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)
757+
$x0 = COPY %0:_(<16 x s32>)
758+
PseudoRET implicit $lr, implicit $x0
759+
...
760+
761+
---
762+
name: concat_vector_reverse_32_512_random
763+
legalized: false
764+
body: |
765+
bb.1.entry:
766+
liveins: $wl2, $wl4
767+
; CHECK-LABEL: name: concat_vector_reverse_32_512_random
768+
; CHECK: liveins: $wl2, $wl4
769+
; CHECK-NEXT: {{ $}}
770+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
771+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
772+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
773+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
774+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
775+
%1:_(<8 x s32>) = COPY $wl2
776+
%2:_(<8 x s32>) = COPY $wl4
777+
%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)
778+
$x0 = COPY %0:_(<16 x s32>)
779+
PseudoRET implicit $lr, implicit $x0

0 commit comments

Comments
 (0)