================
@@ -218,14 +218,29 @@ template <typename SubPattern_t> struct Splat_match {
       auto *Splat = C->getSplatValue();
       return Splat ? SubPattern.match(Splat) : false;
     }
-    // TODO: Extend to other cases (e.g. shufflevectors).
-    return false;
+
+    auto *Shuffle = dyn_cast<ShuffleVectorInst>(V);
+    if (!Shuffle || !Shuffle->isZeroEltSplat())
+      return false;
+
+    // Look for an insertelement.
+    auto *Insert = dyn_cast<InsertElementInst>(Shuffle->getOperand(0));
+    if (!Insert)
+      return false;
+
+    Value *SplatElt = Insert->getOperand(1);
+    ConstantInt *Idx = dyn_cast<ConstantInt>(Insert->getOperand(2));
+    if (!Idx || Idx->getZExtValue() != 0)
+      return false;
+
+    return SubPattern.match(SplatElt);
+    // TODO: Handle other splat patterns.
----------------
huntergr-arm wrote:

It's possible that we could splat an arbitrary element from an existing vector, 
e.g. from a vector load.

I don't think that's worth worrying about right now, and it's possible that the 
canonical form for that would be an extractelement -> insertelement at 0 -> 
zeroeltsplat anyway.

https://github.com/llvm/llvm-project/pull/226190
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to