Skip to content

Commit 58431c5

Browse files
committed
widen shuffle mask as late as possible
1 parent 0f72c65 commit 58431c5

File tree

1 file changed

+35
-33
lines changed

1 file changed

+35
-33
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,37 @@ SDValue LoongArchTargetLowering::lowerBITREVERSE(SDValue Op,
544544
}
545545
}
546546

547+
// Widen element type to get a new mask value (if possible).
548+
// For example:
549+
// shufflevector <4 x i32> %a, <4 x i32> %b,
550+
// <4 x i32> <i32 6, i32 7, i32 2, i32 3>
551+
// is equivalent to:
552+
// shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
553+
// can be lowered to:
554+
// VPACKOD_D vr0, vr0, vr1
555+
static SDValue widenShuffleMask(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
556+
SDValue V1, SDValue V2, SelectionDAG &DAG) {
557+
unsigned EltBits = VT.getScalarSizeInBits();
558+
559+
if (EltBits > 32 || EltBits == 1)
560+
return SDValue();
561+
562+
SmallVector<int, 8> NewMask;
563+
if (widenShuffleMaskElts(Mask, NewMask)) {
564+
MVT NewEltVT = VT.isFloatingPoint() ? MVT::getFloatingPointVT(EltBits * 2)
565+
: MVT::getIntegerVT(EltBits * 2);
566+
MVT NewVT = MVT::getVectorVT(NewEltVT, VT.getVectorNumElements() / 2);
567+
if (DAG.getTargetLoweringInfo().isTypeLegal(NewVT)) {
568+
SDValue NewV1 = DAG.getBitcast(NewVT, V1);
569+
SDValue NewV2 = DAG.getBitcast(NewVT, V2);
570+
return DAG.getBitcast(
571+
VT, DAG.getVectorShuffle(NewVT, DL, NewV1, NewV2, NewMask));
572+
}
573+
}
574+
575+
return SDValue();
576+
}
577+
547578
/// Attempts to match a shuffle mask against the VBSLL, VBSRL, VSLLI and VSRLI
548579
/// instruction.
549580
// The funciton matches elements from one of the input vector shuffled to the
@@ -1366,6 +1397,8 @@ static SDValue lower128BitShuffle(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
13661397
return Result;
13671398
if ((Result = lowerVECTOR_SHUFFLEAsByteRotate(DL, Mask, VT, V1, V2, DAG)))
13681399
return Result;
1400+
if (SDValue NewShuffle = widenShuffleMask(DL, Mask, VT, V1, V2, DAG))
1401+
return NewShuffle;
13691402
if ((Result = lowerVECTOR_SHUFFLE_VSHUF(DL, Mask, VT, V1, V2, DAG)))
13701403
return Result;
13711404
return SDValue();
@@ -1804,41 +1837,13 @@ static SDValue lower256BitShuffle(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
18041837
return Result;
18051838
if ((Result = lowerVECTOR_SHUFFLEAsByteRotate(DL, NewMask, VT, V1, V2, DAG)))
18061839
return Result;
1840+
if (SDValue NewShuffle = widenShuffleMask(DL, NewMask, VT, V1, V2, DAG))
1841+
return NewShuffle;
18071842
if ((Result = lowerVECTOR_SHUFFLE_XVSHUF(DL, NewMask, VT, V1, V2, DAG)))
18081843
return Result;
18091844

18101845
return SDValue();
18111846
}
1812-
// Widen element type to get a new mask value (if possible).
1813-
// For example:
1814-
// shufflevector <4 x i32> %a, <4 x i32> %b,
1815-
// <4 x i32> <i32 6, i32 7, i32 2, i32 3>
1816-
// is equivalent to:
1817-
// shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
1818-
// can be lowered to:
1819-
// VPACKOD_D vr0, vr0, vr1
1820-
static SDValue widenShuffleMask(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
1821-
SDValue V1, SDValue V2, SelectionDAG &DAG) {
1822-
unsigned EltBits = VT.getScalarSizeInBits();
1823-
1824-
if (EltBits > 32 || EltBits == 1)
1825-
return SDValue();
1826-
1827-
SmallVector<int, 8> NewMask;
1828-
if (widenShuffleMaskElts(Mask, NewMask)) {
1829-
MVT NewEltVT = VT.isFloatingPoint() ? MVT::getFloatingPointVT(EltBits * 2)
1830-
: MVT::getIntegerVT(EltBits * 2);
1831-
MVT NewVT = MVT::getVectorVT(NewEltVT, VT.getVectorNumElements() / 2);
1832-
if (DAG.getTargetLoweringInfo().isTypeLegal(NewVT)) {
1833-
SDValue NewV1 = DAG.getBitcast(NewVT, V1);
1834-
SDValue NewV2 = DAG.getBitcast(NewVT, V2);
1835-
return DAG.getBitcast(
1836-
VT, DAG.getVectorShuffle(NewVT, DL, NewV1, NewV2, NewMask));
1837-
}
1838-
}
1839-
1840-
return SDValue();
1841-
}
18421847

18431848
SDValue LoongArchTargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
18441849
SelectionDAG &DAG) const {
@@ -1873,9 +1878,6 @@ SDValue LoongArchTargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
18731878
return DAG.getVectorShuffle(VT, DL, V1, V2, NewMask);
18741879
}
18751880

1876-
if (SDValue NewShuffle = widenShuffleMask(DL, OrigMask, VT, V1, V2, DAG))
1877-
return NewShuffle;
1878-
18791881
// Check for illegal shuffle mask element index values.
18801882
int MaskUpperLimit = OrigMask.size() * (V2IsUndef ? 1 : 2);
18811883
(void)MaskUpperLimit;

0 commit comments

Comments
 (0)