[llvm] [VectorCombine] Combine scalar fneg with insert/extract to vector fneg when length is different (PR #115209)

Min-Yih Hsu via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 15 14:38:23 PST 2024


================
@@ -698,14 +698,31 @@ bool VectorCombine::foldInsExtFNeg(Instruction &I) {
       TTI.getArithmeticInstrCost(Instruction::FNeg, VecTy) +
       TTI.getShuffleCost(TargetTransformInfo::SK_Select, VecTy, Mask);
 
+  bool NeedLenChg = SrcVecTy->getNumElements() != NumElts;
+  // If the lengths of the two vectors are not equal,
+  // we need to add a length-change vector. Add this cost.
+  if (NeedLenChg)
+    NewCost +=
+        TTI.getShuffleCost(TargetTransformInfo::SK_Select, SrcVecTy, Mask);
+
   if (NewCost > OldCost)
     return false;
 
-  // insertelt DestVec, (fneg (extractelt SrcVec, Index)), Index -->
-  // shuffle DestVec, (fneg SrcVec), Mask
+  Value *NewShuf;
+  // insertelt DestVec, (fneg (extractelt SrcVec, Index)), Index
   Value *VecFNeg = Builder.CreateFNegFMF(SrcVec, FNeg);
-  Value *Shuf = Builder.CreateShuffleVector(DestVec, VecFNeg, Mask);
-  replaceValue(I, *Shuf);
+  if (NeedLenChg) {
+    // shuffle DestVec, (shuffle (fneg SrcVec), poison, SrcMask), Mask
+    SmallVector<int> SrcMask(NumElts, PoisonMaskElem);
+    SrcMask[Index] = Index;
+    Value *LenChgShuf = Builder.CreateShuffleVector(
+        SrcVec, PoisonValue::get(SrcVecTy), SrcMask);
+    NewShuf = Builder.CreateShuffleVector(DestVec, LenChgShuf, Mask);
+  } else
----------------
mshockwave wrote:

please match the curly braces. https://llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single-statement-bodies-of-if-else-loop-statements

https://github.com/llvm/llvm-project/pull/115209


More information about the llvm-commits mailing list