Skip to content

Commit 0e664aa

Browse files
[GISel][CombinerHelper] Shuffle pattern for reversing vector order
1 parent 9502ada commit 0e664aa

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
@@ -474,6 +474,50 @@ bool CombinerHelper::tryCombineShuffleVector(MachineInstr &MI) {
474474
return true;
475475
}
476476

477+
// {n/2, n/2+1, ..., n, 0, 1, ..., n/2-1}
478+
GeneratorType FirstHalf = adderGenerator(0, SrcNumElts / 2, 1);
479+
GeneratorType SecondHalf = adderGenerator(SrcNumElts / 2, SrcNumElts, 1);
480+
GeneratorType Reverse =
481+
concatGenerators(SmallVector<GeneratorType>{FirstHalf, SecondHalf});
482+
483+
if (matchCombineShuffleVector(MI, Reverse, SrcNumElts)) {
484+
// The shuffle is concatenating multiple vectors together.
485+
// Collect the different operands for that.
486+
Register UndefReg;
487+
const Register Src1 = MI.getOperand(1).getReg();
488+
const Register Src2 = MI.getOperand(2).getReg();
489+
const ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask();
490+
491+
// The destination can be longer than the source, so we separate them into
492+
// equal blocks and check them separately to see if one of the blocks can be
493+
// copied whole.
494+
unsigned NumConcat = DstNumElts / SrcNumElts;
495+
unsigned Index = 0;
496+
for (unsigned Concat = 0; Concat < NumConcat; Concat++) {
497+
unsigned Target = (Concat + 1) * SrcNumElts;
498+
while (Index < Target) {
499+
int MaskElt = Mask[Index];
500+
if (MaskElt >= 0) {
501+
Ops.push_back((MaskElt < (int)SrcNumElts) ? Src1 : Src2);
502+
break;
503+
}
504+
Index++;
505+
}
506+
507+
if (Index == Target) {
508+
if (!UndefReg) {
509+
Builder.setInsertPt(*MI.getParent(), MI);
510+
UndefReg = Builder.buildUndef(SrcTy).getReg(0);
511+
}
512+
Ops.push_back(UndefReg);
513+
}
514+
515+
Index = Target;
516+
}
517+
applyCombineShuffleVector(MI, {Ops[1], Ops[0]});
518+
return true;
519+
}
520+
477521
return false;
478522
}
479523

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

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,172 @@ body: |
474474
%2:_(<128 x s8>) = COPY $y3
475475
%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)
476476
PseudoRET implicit $lr, implicit %3
477+
...
478+
479+
---
480+
name: concat_vector_reverse_32_512
481+
legalized: false
482+
body: |
483+
bb.1.entry:
484+
liveins: $wl2, $wl4
485+
; CHECK-LABEL: name: concat_vector_reverse_32_512
486+
; CHECK: liveins: $wl2, $wl4
487+
; CHECK-NEXT: {{ $}}
488+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
489+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
490+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
491+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
492+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
493+
%1:_(<8 x s32>) = COPY $wl2
494+
%2:_(<8 x s32>) = COPY $wl4
495+
%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)
496+
$x0 = COPY %0:_(<16 x s32>)
497+
PseudoRET implicit $lr, implicit $x0
498+
...
499+
500+
---
501+
name: concat_vector_reverse_32_512_undef_start_first
502+
legalized: false
503+
body: |
504+
bb.1.entry:
505+
liveins: $wl2, $wl4
506+
; CHECK-LABEL: name: concat_vector_reverse_32_512_undef_start_first
507+
; CHECK: liveins: $wl2, $wl4
508+
; CHECK-NEXT: {{ $}}
509+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
510+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
511+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
512+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
513+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
514+
%1:_(<8 x s32>) = COPY $wl2
515+
%2:_(<8 x s32>) = COPY $wl4
516+
%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)
517+
$x0 = COPY %0:_(<16 x s32>)
518+
PseudoRET implicit $lr, implicit $x0
519+
...
520+
521+
---
522+
name: concat_vector_reverse_32_512_start_end
523+
legalized: false
524+
body: |
525+
bb.1.entry:
526+
liveins: $wl2, $wl4
527+
; CHECK-LABEL: name: concat_vector_reverse_32_512_start_end
528+
; CHECK: liveins: $wl2, $wl4
529+
; CHECK-NEXT: {{ $}}
530+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
531+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
532+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
533+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
534+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
535+
%1:_(<8 x s32>) = COPY $wl2
536+
%2:_(<8 x s32>) = COPY $wl4
537+
%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)
538+
$x0 = COPY %0:_(<16 x s32>)
539+
PseudoRET implicit $lr, implicit $x0
540+
...
541+
542+
---
543+
name: concat_vector_reverse_32_512_end_start
544+
legalized: false
545+
body: |
546+
bb.1.entry:
547+
liveins: $wl2, $wl4
548+
; CHECK-LABEL: name: concat_vector_reverse_32_512_end_start
549+
; CHECK: liveins: $wl2, $wl4
550+
; CHECK-NEXT: {{ $}}
551+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
552+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
553+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
554+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
555+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
556+
%1:_(<8 x s32>) = COPY $wl2
557+
%2:_(<8 x s32>) = COPY $wl4
558+
%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)
559+
$x0 = COPY %0:_(<16 x s32>)
560+
PseudoRET implicit $lr, implicit $x0
561+
...
562+
563+
---
564+
name: concat_vector_reverse_32_512_end_end
565+
legalized: false
566+
body: |
567+
bb.1.entry:
568+
liveins: $wl2, $wl4
569+
; CHECK-LABEL: name: concat_vector_reverse_32_512_end_end
570+
; CHECK: liveins: $wl2, $wl4
571+
; CHECK-NEXT: {{ $}}
572+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
573+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
574+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
575+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
576+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
577+
%1:_(<8 x s32>) = COPY $wl2
578+
%2:_(<8 x s32>) = COPY $wl4
579+
%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)
580+
$x0 = COPY %0:_(<16 x s32>)
581+
PseudoRET implicit $lr, implicit $x0
582+
...
583+
584+
---
585+
name: concat_vector_reverse_32_512_first_block
586+
legalized: false
587+
body: |
588+
bb.1.entry:
589+
liveins: $wl2, $wl4
590+
; CHECK-LABEL: name: concat_vector_reverse_32_512_first_block
591+
; CHECK: liveins: $wl2, $wl4
592+
; CHECK-NEXT: {{ $}}
593+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
594+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s32>) = G_IMPLICIT_DEF
595+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[DEF]](<8 x s32>), [[COPY]](<8 x s32>)
596+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
597+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
598+
%1:_(<8 x s32>) = COPY $wl2
599+
%2:_(<8 x s32>) = COPY $wl4
600+
%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)
601+
$x0 = COPY %0:_(<16 x s32>)
602+
PseudoRET implicit $lr, implicit $x0
603+
...
604+
605+
---
606+
name: concat_vector_reverse_32_512_second_block
607+
legalized: false
608+
body: |
609+
bb.1.entry:
610+
liveins: $wl2, $wl4
611+
; CHECK-LABEL: name: concat_vector_reverse_32_512_second_block
612+
; CHECK: liveins: $wl2, $wl4
613+
; CHECK-NEXT: {{ $}}
614+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
615+
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s32>) = G_IMPLICIT_DEF
616+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY]](<8 x s32>), [[DEF]](<8 x s32>)
617+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
618+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
619+
%1:_(<8 x s32>) = COPY $wl2
620+
%2:_(<8 x s32>) = COPY $wl4
621+
%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)
622+
$x0 = COPY %0:_(<16 x s32>)
623+
PseudoRET implicit $lr, implicit $x0
624+
...
625+
626+
---
627+
name: concat_vector_reverse_32_512_random
628+
legalized: false
629+
body: |
630+
bb.1.entry:
631+
liveins: $wl2, $wl4
632+
; CHECK-LABEL: name: concat_vector_reverse_32_512_random
633+
; CHECK: liveins: $wl2, $wl4
634+
; CHECK-NEXT: {{ $}}
635+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s32>) = COPY $wl2
636+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s32>) = COPY $wl4
637+
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[COPY1]](<8 x s32>), [[COPY]](<8 x s32>)
638+
; CHECK-NEXT: $x0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
639+
; CHECK-NEXT: PseudoRET implicit $lr, implicit $x0
640+
%1:_(<8 x s32>) = COPY $wl2
641+
%2:_(<8 x s32>) = COPY $wl4
642+
%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)
643+
$x0 = COPY %0:_(<16 x s32>)
644+
PseudoRET implicit $lr, implicit $x0
645+
...

0 commit comments

Comments
 (0)