[llvm] 556c94e - [DAG] visitINSERT_VECTOR_ELT - use mergeEltWithShuffle to merge inserted vector element chain into base shuffle node
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 22 09:20:05 PST 2023
Author: Simon Pilgrim
Date: 2023-01-22T17:19:48Z
New Revision: 556c94e73ed001f6d1381e28ca44c2b8b5c8e92f
URL: https://github.com/llvm/llvm-project/commit/556c94e73ed001f6d1381e28ca44c2b8b5c8e92f
DIFF: https://github.com/llvm/llvm-project/commit/556c94e73ed001f6d1381e28ca44c2b8b5c8e92f.diff
LOG: [DAG] visitINSERT_VECTOR_ELT - use mergeEltWithShuffle to merge inserted vector element chain into base shuffle node
This allows us to merge insert_elt(insert_elt(shuffle(x,y),extract_elt(x,c1),c2),extract_elt(y,c3),c4) style insertion chains into a new shuffle node.
I had hoped to remove mergeInsertEltWithShuffle entirely, but that case doesn't have the one use limits so we would regress in a few other cases.
Fixes the vector-shuffle-combining.ll regressions in D127115
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 72674a3b0453d..120515fd0a2c3 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -20263,6 +20263,32 @@ SDValue DAGCombiner::visitINSERT_VECTOR_ELT(SDNode *N) {
continue;
}
+ // VECTOR_SHUFFLE - if all the operands match the shuffle's sources,
+ // update the shuffle mask (and second operand if we started with unary
+ // shuffle) and create a new legal shuffle.
+ if (CurVec.getOpcode() == ISD::VECTOR_SHUFFLE && CurVec.hasOneUse()) {
+ auto *SVN = cast<ShuffleVectorSDNode>(CurVec);
+ SDValue LHS = SVN->getOperand(0);
+ SDValue RHS = SVN->getOperand(1);
+ SmallVector<int, 16> Mask(SVN->getMask());
+ bool Merged = true;
+ for (auto I : enumerate(Ops)) {
+ SDValue &Op = I.value();
+ if (Op) {
+ SmallVector<int, 16> NewMask;
+ if (!mergeEltWithShuffle(LHS, RHS, Mask, NewMask, Op, I.index())) {
+ Merged = false;
+ break;
+ }
+ Mask = std::move(NewMask);
+ }
+ }
+ if (Merged)
+ if (SDValue NewShuffle =
+ TLI.buildLegalVectorShuffle(VT, DL, LHS, RHS, Mask, DAG))
+ return NewShuffle;
+ }
+
// Failed to find a match in the chain - bail.
break;
}
More information about the llvm-commits
mailing list