Skip to content

Commit 301bc14

Browse files
author
Leon Clark
committed
Address comments.
1 parent 420d457 commit 301bc14

File tree

3 files changed

+110
-419
lines changed

3 files changed

+110
-419
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8690,6 +8690,33 @@ static SDValue lowerBuildVectorToBitOp(BuildVectorSDNode *Op, const SDLoc &DL,
86908690
return LowerShift(Res, Subtarget, DAG);
86918691
}
86928692

8693+
/// Attempt to lower a BUILD_VECTOR of scalar values to a shuffle of splats
8694+
/// representing a blend.
8695+
static SDValue lowerBuildVectorAsBlend(BuildVectorSDNode *BVOp, SDLoc const &DL,
8696+
X86Subtarget const &Subtarget,
8697+
SelectionDAG &DAG) {
8698+
if (!Subtarget.hasAVX())
8699+
return {};
8700+
8701+
auto VT = BVOp->getSimpleValueType(0u);
8702+
8703+
if (VT == MVT::v4f64 && BVOp->getNumOperands() == 4u) {
8704+
SDValue Op0 = BVOp->getOperand(0u);
8705+
SDValue Op1 = BVOp->getOperand(1u);
8706+
SDValue Op2 = BVOp->getOperand(2u);
8707+
SDValue Op3 = BVOp->getOperand(3u);
8708+
8709+
// Match X,Y,Y,X inputs.
8710+
if (Op0 == Op3 && Op1 == Op2 && Op0 != Op1) {
8711+
auto NewOp0 = DAG.getSplatBuildVector(VT, DL, Op0);
8712+
auto NewOp1 = DAG.getSplatBuildVector(VT, DL, Op1);
8713+
return DAG.getVectorShuffle(VT, DL, NewOp0, NewOp1, {0, 5, 6, 3});
8714+
}
8715+
}
8716+
8717+
return {};
8718+
}
8719+
86938720
/// Create a vector constant without a load. SSE/AVX provide the bare minimum
86948721
/// functionality to do this, so it's all zeros, all ones, or some derivation
86958722
/// that is cheap to calculate.
@@ -9040,39 +9067,6 @@ X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
90409067
MVT OpEltVT = Op.getOperand(0).getSimpleValueType();
90419068
unsigned NumElems = Op.getNumOperands();
90429069

9043-
// Match BUILD_VECTOR of scalars that we can lower to X86ISD::BLENDI via
9044-
// shuffles.
9045-
//
9046-
// v4f64 = BUILD_VECTOR X,Y,Y,X
9047-
// >>>
9048-
// t1: v4f64 = BUILD_VECTOR X,u,u,u
9049-
// t3: v4f64 = vector_shuffle<0,u,u,0> t1, u
9050-
// t2: v4f64 = BUILD_VECTOR Y,u,u,u
9051-
// t4: v4f64 = vector_shuffle<u,0,0,u> t2, u
9052-
// v4f64 = vector_shuffle<0,5,6,3> t3, t4
9053-
//
9054-
if (Subtarget.hasAVX() && VT == MVT::v4f64 && Op->getNumOperands() == 4u) {
9055-
auto Op0 = Op->getOperand(0u);
9056-
auto Op1 = Op->getOperand(1u);
9057-
auto Op2 = Op->getOperand(2u);
9058-
auto Op3 = Op->getOperand(3u);
9059-
9060-
// Match X,Y,Y,X inputs.
9061-
if (Op0 == Op3 && Op1 == Op2 && Op0 != Op1) {
9062-
auto PsnVal = DAG.getUNDEF(MVT::f64);
9063-
9064-
auto NewOp0 = DAG.getBuildVector(VT, dl, {Op0, PsnVal, PsnVal, PsnVal});
9065-
NewOp0 = DAG.getVectorShuffle(VT, dl, NewOp0, DAG.getUNDEF(VT),
9066-
{0, -1, -1, 0});
9067-
9068-
auto NewOp1 = DAG.getBuildVector(VT, dl, {Op1, PsnVal, PsnVal, PsnVal});
9069-
NewOp1 = DAG.getVectorShuffle(VT, dl, NewOp1, DAG.getUNDEF(VT),
9070-
{-1, 0, 0, -1});
9071-
9072-
return DAG.getVectorShuffle(VT, dl, NewOp0, NewOp1, {0, 5, 6, 3});
9073-
}
9074-
}
9075-
90769070
// Generate vectors for predicate vectors.
90779071
if (VT.getVectorElementType() == MVT::i1 && Subtarget.hasAVX512())
90789072
return LowerBUILD_VECTORvXi1(Op, dl, DAG, Subtarget);
@@ -9185,6 +9179,8 @@ X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
91859179
return Broadcast;
91869180
if (SDValue BitOp = lowerBuildVectorToBitOp(BV, dl, Subtarget, DAG))
91879181
return BitOp;
9182+
if (SDValue Blend = lowerBuildVectorAsBlend(BV, dl, Subtarget, DAG))
9183+
return Blend;
91889184

91899185
unsigned NumZero = ZeroMask.popcount();
91909186
unsigned NumNonZero = NonZeroMask.popcount();

0 commit comments

Comments
 (0)