Skip to content

Commit 192cc76

Browse files
committed
Revert "[AArch64][GlobalISel][Legalizer] Legalize G_SHUFFLE_VECTOR with different lengths"
This reverts commit 4c52fb1. Breaks sanitizer ubsan buildbot: https://lab.llvm.org/buildbot/#/builders/85/builds/12983
1 parent 9112ec6 commit 192cc76

File tree

5 files changed

+3
-255
lines changed

5 files changed

+3
-255
lines changed

llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,20 +1170,6 @@ class MachineIRBuilder {
11701170
const SrcOp &Elt,
11711171
const SrcOp &Idx);
11721172

1173-
/// Build and insert \p Res = G_EXTRACT_VECTOR_ELT \p Val, \p Idx
1174-
///
1175-
/// \pre setBasicBlock or setMI must have been called.
1176-
/// \pre \p Res must be a generic virtual register with scalar type.
1177-
/// \pre \p Val must be a generic virtual register with vector type.
1178-
///
1179-
/// \return The newly created instruction.
1180-
MachineInstrBuilder buildExtractVectorElementConstant(const DstOp &Res,
1181-
const SrcOp &Val,
1182-
const int Idx) {
1183-
return buildExtractVectorElement(Res, Val,
1184-
buildConstant(LLT::scalar(64), Idx));
1185-
}
1186-
11871173
/// Build and insert \p Res = G_EXTRACT_VECTOR_ELT \p Val, \p Idx
11881174
///
11891175
/// \pre setBasicBlock or setMI must have been called.

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 3 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -4944,72 +4944,12 @@ LegalizerHelper::moreElementsVector(MachineInstr &MI, unsigned TypeIdx,
49444944
}
49454945
}
49464946

4947-
/// Expand source vectors to the size of destination vector.
4948-
static LegalizerHelper::LegalizeResult
4949-
equalizeVectorShuffleLengths(MachineInstr &MI, MachineIRBuilder &MIRBuilder) {
4950-
MachineRegisterInfo &MRI = *MIRBuilder.getMRI();
4951-
4952-
LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
4953-
LLT SrcTy = MRI.getType(MI.getOperand(1).getReg());
4954-
ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask();
4955-
unsigned MaskNumElts = Mask.size();
4956-
unsigned SrcNumElts = SrcTy.getNumElements();
4957-
Register DstReg = MI.getOperand(0).getReg();
4958-
LLT DestEltTy = DstTy.getElementType();
4959-
4960-
// TODO: Normalize the shuffle vector since mask and vector length don't
4961-
// match.
4962-
if (MaskNumElts <= SrcNumElts) {
4963-
return LegalizerHelper::LegalizeResult::UnableToLegalize;
4964-
}
4965-
4966-
unsigned PaddedMaskNumElts = alignTo(MaskNumElts, SrcNumElts);
4967-
unsigned NumConcat = PaddedMaskNumElts / SrcNumElts;
4968-
LLT PaddedTy = LLT::fixed_vector(PaddedMaskNumElts, DestEltTy);
4969-
4970-
// Create new source vectors by concatenating the initial
4971-
// source vectors with undefined vectors of the same size.
4972-
auto Undef = MIRBuilder.buildUndef(SrcTy);
4973-
SmallVector<Register, 8> MOps1(NumConcat, Undef.getReg(0));
4974-
SmallVector<Register, 8> MOps2(NumConcat, Undef.getReg(0));
4975-
MOps1[0] = MI.getOperand(1).getReg();
4976-
MOps2[0] = MI.getOperand(2).getReg();
4977-
4978-
auto Src1 = MIRBuilder.buildConcatVectors(PaddedTy, MOps1);
4979-
auto Src2 = MIRBuilder.buildConcatVectors(PaddedTy, MOps2);
4980-
4981-
// Readjust mask for new input vector length.
4982-
SmallVector<int, 8> MappedOps(PaddedMaskNumElts, -1);
4983-
for (unsigned I = 0; I != MaskNumElts; ++I) {
4984-
int Idx = Mask[I];
4985-
if (Idx >= static_cast<int>(SrcNumElts))
4986-
Idx += PaddedMaskNumElts - SrcNumElts;
4987-
MappedOps[I] = Idx;
4988-
}
4989-
4990-
// If we got more elements than required, extract subvector.
4991-
if (MaskNumElts != PaddedMaskNumElts) {
4992-
auto Shuffle =
4993-
MIRBuilder.buildShuffleVector(PaddedTy, Src1, Src2, MappedOps);
4994-
4995-
SmallVector<Register, 16> Elts(MaskNumElts);
4996-
for (unsigned I = 0; I < MaskNumElts; ++I) {
4997-
Elts[I] =
4998-
MIRBuilder.buildExtractVectorElementConstant(DestEltTy, Shuffle, I)
4999-
.getReg(0);
5000-
}
5001-
MIRBuilder.buildBuildVector(DstReg, Elts);
5002-
} else {
5003-
MIRBuilder.buildShuffleVector(DstReg, Src1, Src2, MappedOps);
5004-
}
5005-
5006-
MI.eraseFromParent();
5007-
return LegalizerHelper::LegalizeResult::Legalized;
5008-
}
5009-
50104947
LegalizerHelper::LegalizeResult
50114948
LegalizerHelper::moreElementsVectorShuffle(MachineInstr &MI,
50124949
unsigned int TypeIdx, LLT MoreTy) {
4950+
if (TypeIdx != 0)
4951+
return UnableToLegalize;
4952+
50134953
Register DstReg = MI.getOperand(0).getReg();
50144954
Register Src1Reg = MI.getOperand(1).getReg();
50154955
Register Src2Reg = MI.getOperand(2).getReg();
@@ -5020,14 +4960,6 @@ LegalizerHelper::moreElementsVectorShuffle(MachineInstr &MI,
50204960
unsigned NumElts = DstTy.getNumElements();
50214961
unsigned WidenNumElts = MoreTy.getNumElements();
50224962

5023-
if (DstTy.isVector() && Src1Ty.isVector() &&
5024-
DstTy.getNumElements() > Src1Ty.getNumElements()) {
5025-
return equalizeVectorShuffleLengths(MI, MIRBuilder);
5026-
}
5027-
5028-
if (TypeIdx != 0)
5029-
return UnableToLegalize;
5030-
50314963
// Expect a canonicalized shuffle.
50324964
if (DstTy != Src1Ty || DstTy != Src2Ty)
50334965
return UnableToLegalize;

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -686,13 +686,6 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
686686
.lowerIf([=](const LegalityQuery &Query) {
687687
return !Query.Types[1].isVector();
688688
})
689-
.moreElementsIf(
690-
[](const LegalityQuery &Query) {
691-
return Query.Types[0].isVector() && Query.Types[1].isVector() &&
692-
Query.Types[0].getNumElements() >
693-
Query.Types[1].getNumElements();
694-
},
695-
changeTo(1, 0))
696689
.moreElementsToNextPow2(0)
697690
.clampNumElements(0, v4s32, v4s32)
698691
.clampNumElements(0, v2s64, v2s64);

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ class AArch64LegalizerInfo : public LegalizerInfo {
4747
MachineIRBuilder &MIRBuilder,
4848
GISelChangeObserver &Observer) const;
4949
bool legalizeVectorTrunc(MachineInstr &MI, LegalizerHelper &Helper) const;
50-
bool legalizeShuffleVector(MachineInstr &MI, LegalizerHelper &Helper) const;
5150
bool legalizeBitfieldExtract(MachineInstr &MI, MachineRegisterInfo &MRI,
5251
LegalizerHelper &Helper) const;
5352
bool legalizeRotate(MachineInstr &MI, MachineRegisterInfo &MRI,

llvm/test/CodeGen/AArch64/GlobalISel/legalize-shuffle-vector.mir

Lines changed: 0 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -298,165 +298,3 @@ body: |
298298
RET_ReallyLR
299299
300300
...
301-
---
302-
name: shuffle_v4i32_v1i32
303-
alignment: 4
304-
tracksRegLiveness: true
305-
body: |
306-
bb.1:
307-
liveins: $w0, $w1, $w2
308-
309-
; CHECK-LABEL: name: shuffle_v4i32_v1i32
310-
; CHECK: liveins: $w0, $w1, $w2
311-
; CHECK-NEXT: {{ $}}
312-
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
313-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
314-
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $w2
315-
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
316-
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[DEF]](s32)
317-
; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[DEF]](s32)
318-
; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[BUILD_VECTOR]](<4 x s32>), [[BUILD_VECTOR1]], shufflemask(0, 1, 5, 6)
319-
%0:_(s32) = COPY $w0
320-
%1:_(s32) = COPY $w1
321-
%2:_(s32) = COPY $w2
322-
%3:_(<3 x s32>) = G_BUILD_VECTOR %0(s32), %1(s32), %2(s32)
323-
%4:_(<4 x s32>) = G_SHUFFLE_VECTOR %3(<3 x s32>), %3, shufflemask(0, 1, 4, 5)
324-
$q0 = COPY %4(<4 x s32>)
325-
RET_ReallyLR implicit $q0
326-
327-
...
328-
---
329-
name: shuffle_v4i32_v2i32
330-
alignment: 4
331-
tracksRegLiveness: true
332-
body: |
333-
bb.1:
334-
liveins: $q0, $d1
335-
336-
; CHECK-LABEL: name: shuffle_v4i32_v2i32
337-
; CHECK: liveins: $q0, $d1
338-
; CHECK-NEXT: {{ $}}
339-
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
340-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
341-
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF
342-
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[DEF]](<2 x s32>)
343-
; CHECK-NEXT: [[CONCAT_VECTORS1:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[DEF]](<2 x s32>)
344-
; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[CONCAT_VECTORS]](<4 x s32>), [[CONCAT_VECTORS1]], shufflemask(0, 1, 4, 5)
345-
; CHECK-NEXT: $q0 = COPY [[SHUF]](<4 x s32>)
346-
; CHECK-NEXT: RET_ReallyLR implicit $q0
347-
%0:_(<2 x s32>) = COPY $d0
348-
%1:_(<2 x s32>) = COPY $d1
349-
%2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1, shufflemask(0, 1, 2, 3)
350-
$q0 = COPY %2(<4 x s32>)
351-
RET_ReallyLR implicit $q0
352-
353-
...
354-
---
355-
name: shuffle_v8i16_v4i16
356-
alignment: 4
357-
tracksRegLiveness: true
358-
body: |
359-
bb.1:
360-
liveins: $d0, $d1
361-
362-
; CHECK-LABEL: name: shuffle_v8i16_v4i16
363-
; CHECK: liveins: $d0, $d1
364-
; CHECK-NEXT: {{ $}}
365-
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $d0
366-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s16>) = COPY $d1
367-
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
368-
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s16>) = G_CONCAT_VECTORS [[COPY]](<4 x s16>), [[DEF]](<4 x s16>)
369-
; CHECK-NEXT: [[CONCAT_VECTORS1:%[0-9]+]]:_(<8 x s16>) = G_CONCAT_VECTORS [[COPY1]](<4 x s16>), [[DEF]](<4 x s16>)
370-
; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<8 x s16>) = G_SHUFFLE_VECTOR [[CONCAT_VECTORS]](<8 x s16>), [[CONCAT_VECTORS1]], shufflemask(11, 10, 9, 8, 3, 2, 1, 0)
371-
; CHECK-NEXT: $q0 = COPY [[SHUF]](<8 x s16>)
372-
; CHECK-NEXT: RET_ReallyLR implicit $q0
373-
%0:_(<4 x s16>) = COPY $d0
374-
%1:_(<4 x s16>) = COPY $d1
375-
%2:_(<8 x s16>) = G_SHUFFLE_VECTOR %0(<4 x s16>), %1, shufflemask(7, 6, 5, 4, 3, 2, 1, 0)
376-
$q0 = COPY %2(<8 x s16>)
377-
RET_ReallyLR implicit $q0
378-
379-
...
380-
---
381-
name: shuffle_v16i8_v8i8
382-
alignment: 4
383-
tracksRegLiveness: true
384-
body: |
385-
bb.1:
386-
liveins: $d0, $d1
387-
388-
; CHECK-LABEL: name: shuffle_v16i8_v8i8
389-
; CHECK: liveins: $d0, $d1
390-
; CHECK-NEXT: {{ $}}
391-
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
392-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
393-
; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<8 x s8>) = G_IMPLICIT_DEF
394-
; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s8>) = G_CONCAT_VECTORS [[COPY]](<8 x s8>), [[DEF]](<8 x s8>)
395-
; CHECK-NEXT: [[CONCAT_VECTORS1:%[0-9]+]]:_(<16 x s8>) = G_CONCAT_VECTORS [[COPY1]](<8 x s8>), [[DEF]](<8 x s8>)
396-
; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<16 x s8>) = G_SHUFFLE_VECTOR [[CONCAT_VECTORS]](<16 x s8>), [[CONCAT_VECTORS1]], shufflemask(7, 21, 6, 4, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0)
397-
; CHECK-NEXT: $q0 = COPY [[SHUF]](<16 x s8>)
398-
; CHECK-NEXT: RET_ReallyLR implicit $q0
399-
%0:_(<8 x s8>) = COPY $d0
400-
%1:_(<8 x s8>) = COPY $d1
401-
%2:_(<16 x s8>) = G_SHUFFLE_VECTOR %0(<8 x s8>), %1, shufflemask(7, 13, 6, 4, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0)
402-
$q0 = COPY %2(<16 x s8>)
403-
RET_ReallyLR implicit $q0
404-
405-
...
406-
---
407-
name: size_shuffle_v6i32_v4i32
408-
alignment: 4
409-
tracksRegLiveness: true
410-
body: |
411-
bb.1:
412-
liveins: $s0, $s1, $s2, $s3, $s4, $s5, $s6, $s7, $x0
413-
414-
; CHECK-LABEL: name: size_shuffle_v6i32_v4i32
415-
; CHECK: liveins: $s0, $s1, $s2, $s3, $s4, $s5, $s6, $s7, $x0
416-
; CHECK-NEXT: {{ $}}
417-
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $s0
418-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $s1
419-
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $s2
420-
; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $s3
421-
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
422-
; CHECK-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $s4
423-
; CHECK-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY $s5
424-
; CHECK-NEXT: [[COPY6:%[0-9]+]]:_(s32) = COPY $s6
425-
; CHECK-NEXT: [[COPY7:%[0-9]+]]:_(s32) = COPY $s7
426-
; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY4]](s32), [[COPY5]](s32), [[COPY6]](s32), [[COPY7]](s32)
427-
; CHECK-NEXT: [[COPY8:%[0-9]+]]:_(p0) = COPY $x0
428-
; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[BUILD_VECTOR]](<4 x s32>), [[BUILD_VECTOR1]], shufflemask(3, 4, 7, 0)
429-
; CHECK-NEXT: [[SHUF1:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[BUILD_VECTOR]](<4 x s32>), [[BUILD_VECTOR1]], shufflemask(1, 5, undef, undef)
430-
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
431-
; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[SHUF]](<4 x s32>), [[C]](s64)
432-
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
433-
; CHECK-NEXT: [[EVEC1:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[SHUF]](<4 x s32>), [[C1]](s64)
434-
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 2
435-
; CHECK-NEXT: [[EVEC2:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[SHUF]](<4 x s32>), [[C2]](s64)
436-
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
437-
; CHECK-NEXT: [[EVEC3:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[SHUF]](<4 x s32>), [[C3]](s64)
438-
; CHECK-NEXT: [[EVEC4:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[SHUF1]](<4 x s32>), [[C]](s64)
439-
; CHECK-NEXT: [[EVEC5:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[SHUF1]](<4 x s32>), [[C1]](s64)
440-
; CHECK-NEXT: [[BUILD_VECTOR2:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[EVEC]](s32), [[EVEC1]](s32), [[EVEC2]](s32), [[EVEC3]](s32)
441-
; CHECK-NEXT: [[BUILD_VECTOR3:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[EVEC4]](s32), [[EVEC5]](s32)
442-
; CHECK-NEXT: G_STORE [[BUILD_VECTOR2]](<4 x s32>), [[COPY8]](p0) :: (store (<4 x s32>), align 32)
443-
; CHECK-NEXT: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 16
444-
; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY8]], [[C4]](s64)
445-
; CHECK-NEXT: G_STORE [[BUILD_VECTOR3]](<2 x s32>), [[PTR_ADD]](p0) :: (store (<2 x s32>) into unknown-address + 16, align 16)
446-
; CHECK-NEXT: RET_ReallyLR
447-
%3:_(s32) = COPY $s0
448-
%4:_(s32) = COPY $s1
449-
%5:_(s32) = COPY $s2
450-
%6:_(s32) = COPY $s3
451-
%0:_(<4 x s32>) = G_BUILD_VECTOR %3(s32), %4(s32), %5(s32), %6(s32)
452-
%7:_(s32) = COPY $s4
453-
%8:_(s32) = COPY $s5
454-
%9:_(s32) = COPY $s6
455-
%10:_(s32) = COPY $s7
456-
%1:_(<4 x s32>) = G_BUILD_VECTOR %7(s32), %8(s32), %9(s32), %10(s32)
457-
%2:_(p0) = COPY $x0
458-
%19:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1, shufflemask(3, 4, 7, 0, 1, 5)
459-
G_STORE %19(<6 x s32>), %2(p0) :: (store (<6 x s32>), align 32)
460-
RET_ReallyLR
461-
462-
...

0 commit comments

Comments
 (0)