[llvm] [X86][AVX] Match v4f64 blend from shuffle of scalar values. (PR #135753)
Leon Clark via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 22:46:00 PDT 2025
================
@@ -9040,6 +9040,39 @@ X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
MVT OpEltVT = Op.getOperand(0).getSimpleValueType();
unsigned NumElems = Op.getNumOperands();
+ // Match BUILD_VECTOR of scalars that we can lower to X86ISD::BLENDI via
+ // shuffles.
+ //
+ // v4f64 = BUILD_VECTOR X,Y,Y,X
+ // >>>
+ // t1: v4f64 = BUILD_VECTOR X,u,u,u
+ // t3: v4f64 = vector_shuffle<0,u,u,0> t1, u
+ // t2: v4f64 = BUILD_VECTOR Y,u,u,u
+ // t4: v4f64 = vector_shuffle<u,0,0,u> t2, u
+ // v4f64 = vector_shuffle<0,5,6,3> t3, t4
+ //
+ if (Subtarget.hasAVX() && VT == MVT::v4f64 && Op->getNumOperands() == 4u) {
+ auto Op0 = Op->getOperand(0u);
+ auto Op1 = Op->getOperand(1u);
+ auto Op2 = Op->getOperand(2u);
+ auto Op3 = Op->getOperand(3u);
+
+ // Match X,Y,Y,X inputs.
+ if (Op0 == Op3 && Op1 == Op2 && Op0 != Op1) {
+ auto PsnVal = DAG.getUNDEF(MVT::f64);
+
+ auto NewOp0 = DAG.getBuildVector(VT, dl, {Op0, PsnVal, PsnVal, PsnVal});
+ NewOp0 = DAG.getVectorShuffle(VT, dl, NewOp0, DAG.getUNDEF(VT),
+ {0, -1, -1, 0});
----------------
PeddleSpam wrote:
Thanks 😊
https://github.com/llvm/llvm-project/pull/135753
More information about the llvm-commits
mailing list