[IRBuilder][VectorCombine] make and use a convenience function for unary shuffle...
authorSanjay Patel <spatel@rotateright.com>
Mon, 21 Sep 2020 17:27:40 +0000 (13:27 -0400)
committerSanjay Patel <spatel@rotateright.com>
Mon, 21 Sep 2020 17:47:01 +0000 (13:47 -0400)
This reduces code duplication for common construct.
Follow-ups can use this in SLP, LoopVectorizer, and other passes.

llvm/include/llvm/IR/IRBuilder.h
llvm/lib/Transforms/Vectorize/VectorCombine.cpp

index 5fa3620..58bde3e 100644 (file)
@@ -2431,6 +2431,13 @@ public:
     return Insert(new ShuffleVectorInst(V1, V2, Mask), Name);
   }
 
+  /// Create a unary shuffle. The second vector operand of the IR instruction
+  /// is undefined.
+  Value *CreateShuffleVector(Value *V, ArrayRef<int> Mask,
+                             const Twine &Name = "") {
+    return CreateShuffleVector(V, UndefValue::get(V->getType()), Mask, Name);
+  }
+
   Value *CreateExtractValue(Value *Agg,
                             ArrayRef<unsigned> Idxs,
                             const Twine &Name = "") {
index 1bac16b..816d44f 100644 (file)
@@ -154,7 +154,7 @@ bool VectorCombine::vectorizeLoadInsert(Instruction &I) {
     SmallVector<int, 16> Mask(OutputNumElts, UndefMaskElem);
     for (unsigned i = 0; i < OutputNumElts && i < MinVecNumElts; ++i)
       Mask[i] = i;
-    VecLd = Builder.CreateShuffleVector(VecLd, UndefValue::get(MinVecTy), Mask);
+    VecLd = Builder.CreateShuffleVector(VecLd, Mask);
   }
   replaceValue(I, *VecLd);
   ++NumVecLoad;
@@ -304,8 +304,7 @@ static Value *createShiftShuffle(Value *Vec, unsigned OldIndex,
   auto *VecTy = cast<FixedVectorType>(Vec->getType());
   SmallVector<int, 32> ShufMask(VecTy->getNumElements(), UndefMaskElem);
   ShufMask[NewIndex] = OldIndex;
-  Value *Undef = UndefValue::get(VecTy);
-  return Builder.CreateShuffleVector(Vec, Undef, ShufMask, "shift");
+  return Builder.CreateShuffleVector(Vec, ShufMask, "shift");
 }
 
 /// Given an extract element instruction with constant index operand, shuffle
@@ -475,8 +474,7 @@ bool VectorCombine::foldBitcastShuf(Instruction &I) {
   // bitcast (shuf V, MaskC) --> shuf (bitcast V), MaskC'
   ++NumShufOfBitcast;
   Value *CastV = Builder.CreateBitCast(V, DestTy);
-  Value *Shuf =
-      Builder.CreateShuffleVector(CastV, UndefValue::get(DestTy), NewMask);
+  Value *Shuf = Builder.CreateShuffleVector(CastV, NewMask);
   replaceValue(I, *Shuf);
   return true;
 }