[PATCH] D72467: Remove "mask" operand from shufflevector.

Sanjay Patel via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 23 07:07:31 PST 2020


spatel added inline comments.


================
Comment at: llvm/include/llvm/IR/Constants.h:1220
 
+  /// Assert that this is an shufflevector and return the mask. See class
+  /// ShuffleVectorInst for a description of the mask representation.
----------------
an shufflevector -> a shufflevector


================
Comment at: llvm/include/llvm/IR/Constants.h:1224
+
+  /// Assert that this is an shufflevector and return the mask.
+  ///
----------------
an shufflevector -> a shufflevector


================
Comment at: llvm/include/llvm/IR/IRBuilder.h:2544
+    SmallVector<int, 16> IntMask;
+    ShuffleVectorInst::getShuffleMask(cast<Constant>(Mask), IntMask);
+    return CreateShuffleVector(V1, V2, IntMask, Name);
----------------
Add an assert that Mask isa<Constant> ?


================
Comment at: llvm/include/llvm/IR/Instructions.h:1985-1986
 ///
+/// The shuffle mask operand specifies, for each element of the result vector,
+/// which element of the two input vectors the result element gets. The
+/// shuffle mask is represented as an array of integers. Positive integers
----------------
This reads awkwardly to me (if you agree, we can update the LangRef too). 
How about:
"For each element of the result vector, the shuffle mask selects an element from one of the input vectors to copy to the result. Non-negative elements in the mask represent an index into the concatenated pair of input vectors. UndefMaskElem (-1) specifies that the result element is undefined."


================
Comment at: llvm/include/llvm/IR/Instructions.h:2015
 
-  // allocate space for exactly three operands
+  // allocate space for exactly two operands
   void *operator new(size_t s) {
----------------
This comment doesn't add value to me, so I'd just delete it. If we want to keep it, should fix it to be a proper sentence with a capital letter and period.


================
Comment at: llvm/include/llvm/IR/PatternMatch.h:1306
+
+struct m_ZeroMask {
+  bool match(ArrayRef<int> Mask) {
----------------
IIUC, this is meant to replace the current uses of m_Zero() or m_ZeroInt() with shuffle pattern matching, but there's a logic difference because those matchers allow undefs, but this does not? Are we missing unittests to catch that case?


================
Comment at: llvm/include/llvm/IR/PatternMatch.h:1320
+
 /// Matches ShuffleVectorInst.
+template <typename V1_t, typename V2_t>
----------------
Update/add comment:
"Matches ShuffleVectorInst independently of mask value." ?


================
Comment at: llvm/lib/Bitcode/Writer/ValueEnumerator.cpp:937-939
+   if (auto *CE = dyn_cast<ConstantExpr>(C))
+     if (CE->getOpcode() == Instruction::ShuffleVector)
+       EnumerateOperandType(CE->getShuffleMaskForBitcode());
----------------
Indentation looks off-by-1.


================
Comment at: llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp:1937
+  ArrayRef<int> Mask;
+  if (const ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(&U))
+    Mask = SVI->getShuffleMask();
----------------
if (auto *SVI = ...)


================
Comment at: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:3587
+  ArrayRef<int> Mask;
+  if (const ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(&I))
+    Mask = SVI->getShuffleMask();
----------------
if (auto *SVI = ...)


================
Comment at: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1890
       for( unsigned i=0; i<src3Size; i++) {
-        unsigned j = Src3.AggregateVal[i].IntVal.getZExtValue();
+        unsigned j = std::max(0, I.getMaskValue(i));
         if(j < src1Size)
----------------
I've never looked in here before - what happens currently if the index is -1 (undef)?


================
Comment at: llvm/lib/IR/ConstantsContext.h:175
+
   // allocate space for exactly three operands
   void *operator new(size_t s) {
----------------
This comment doesn't add value to me, so I'd just delete it. If we want to keep it, should fix it to be "two operands" and a proper sentence with a capital letter and period.


================
Comment at: llvm/lib/IR/ConstantsContext.h:564
     case Instruction::ShuffleVector:
-      return new ShuffleVectorConstantExpr(Ops[0], Ops[1], Ops[2]);
+      return new ShuffleVectorConstantExpr(Ops[0], Ops[1], Indexes);
     case Instruction::InsertValue:
----------------
(not familiar with this part)
If we're using Indexes here, do we need to update the code/comments for hasIndices()?

  /// Return true if this is an insertvalue or extractvalue expression,
  /// and the getIndices() method may be used.


================
Comment at: llvm/lib/IR/Instruction.cpp:437
            RMWI->getSyncScopeID() == cast<AtomicRMWInst>(I2)->getSyncScopeID();
+  if (const ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I1))
+    return SVI->getShuffleMask() == cast<ShuffleVectorInst>(I2)->getShuffleMask();
----------------
Would have suggested "auto *" here, but really the whole thing should be turned into a switch() as a preliminary cleanup?


================
Comment at: llvm/lib/IR/Instructions.cpp:1824-1825
+                                     Instruction *InsertBefore)
+: Instruction(VectorType::get(cast<VectorType>(V1->getType())->getElementType(),
+                Mask.size(), V1->getType()->getVectorIsScalable()),
+              ShuffleVector,
----------------
I see this is copied, but indentation seems off.


================
Comment at: llvm/lib/Transforms/Scalar/GVN.cpp:304
       e.varargs.push_back(*II);
+  } else if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I)) {
+    ArrayRef<int> ShuffleMask = SVI->getShuffleMask();
----------------
Use "auto *" in each clause (or convert to switch).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D72467/new/

https://reviews.llvm.org/D72467





More information about the cfe-commits mailing list