[llvm] [X86] combineINSERT_SUBVECTOR - fold insert_subvector(base,extract_subvector(broadcast)) -> blend shuffle(base,broadcast) (REAPPLIED) (PR #133724)
Phoebe Wang via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 31 07:28:05 PDT 2025
================
@@ -58896,6 +58896,30 @@ static SDValue combineINSERT_SUBVECTOR(SDNode *N, SelectionDAG &DAG,
Mask[i + IdxVal] = i + ExtIdxVal + VecNumElts;
return DAG.getVectorShuffle(OpVT, dl, Vec, ExtSrc, Mask);
}
+ // If we're broadcasting, see if we can use a blend instead of
+ // extract/insert pair. Ensure that the subvector is aligned with the
+ // insertion/extractions.
+ if ((ExtIdxVal % SubVecNumElts) == 0 && (IdxVal % SubVecNumElts) == 0 &&
+ (ExtSrc.getOpcode() == X86ISD::VBROADCAST ||
+ ExtSrc.getOpcode() == X86ISD::VBROADCAST_LOAD ||
+ (ExtSrc.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD &&
+ cast<MemIntrinsicSDNode>(ExtSrc)->getMemoryVT() == SubVecVT))) {
+ if (OpVT.is256BitVector() && SubVecVT.is128BitVector()) {
+ uint64_t BlendMask = IdxVal == 0 ? 0x0F : 0xF0;
+ SDValue Blend = DAG.getNode(
+ X86ISD::BLENDI, dl, MVT::v8f32, DAG.getBitcast(MVT::v8f32, Vec),
+ DAG.getBitcast(MVT::v8f32, ExtSrc),
+ DAG.getTargetConstant(BlendMask, dl, MVT::i8));
+ return DAG.getBitcast(OpVT, Blend);
+ } else if (OpVT.is512BitVector() && SubVecVT.is256BitVector()) {
----------------
phoebewang wrote:
Does it also work for `SubVecVT.is128BitVector()`?
https://github.com/llvm/llvm-project/pull/133724
More information about the llvm-commits
mailing list