[llvm] [VPlan] Unroll VPReplicateRecipe by VF. (PR #142433)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 9 08:37:37 PDT 2025


================
@@ -1140,6 +1140,22 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
     return;
   }
 
+  // Look through Extract(Last|Penultimate)Element (BuildVector ....).
+  if (match(&R,
+            m_VPInstruction<VPInstruction::ExtractLastElement>(m_VPValue(A))) ||
+      match(&R, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
+                    m_VPValue(A)))) {
+    unsigned Offset = cast<VPInstruction>(&R)->getOpcode() ==
+                              VPInstruction::ExtractLastElement
+                          ? 1
+                          : 2;
+    auto *BV = dyn_cast<VPInstruction>(A);
+    if (BV && BV->getOpcode() == VPInstruction::BuildVector) {
+      Def->replaceAllUsesWith(BV->getOperand(BV->getNumOperands() - Offset));
+      return;
+    }
+  }
----------------
ayalz wrote:

Simpler to match each pattern separately?
```suggestion
  // Look through ExtractLastElement (BuildVector ....).
  if (match(&R, m_VPInstruction<VPInstruction::ExtractLastElement>(
            m_VPInstruction<VPInstruction::BuildVector>(BuildV))) {
    Def->replaceAllUsesWith(BV->getOperand(BuildV->getNumOperands() - 1));
    return;
  }

  // Look through ExtractPenultimateElement (BuildVector ....).
  if (match(&R, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
            m_VPInstruction<VPInstruction::BuildVector>(BuildV))) {
    Def->replaceAllUsesWith(BV->getOperand(BuildV->getNumOperands() - 2));
    return;
  }

```

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


More information about the llvm-commits mailing list