[llvm] [VPlan] Use VPIRMetadata for VPInterleaveRecipe. (PR #153084)

Mel Chen via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 14 08:40:01 PDT 2025


================
@@ -2561,12 +2561,24 @@ void VPlanTransforms::createInterleaveGroups(
   VPDominatorTree VPDT;
   VPDT.recalculate(Plan);
   for (const auto *IG : InterleaveGroups) {
+    // Get or create the start address for the interleave group.
+    auto *Start =
+        cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(IG->getMember(0)));
+
+    VPIRMetadata InterleaveMD(*Start);
     SmallVector<VPValue *, 4> StoredValues;
-    for (unsigned i = 0; i < IG->getFactor(); ++i)
-      if (auto *SI = dyn_cast_or_null<StoreInst>(IG->getMember(i))) {
-        auto *StoreR = cast<VPWidenStoreRecipe>(RecipeBuilder.getRecipe(SI));
+    for (unsigned i = 0; i < IG->getFactor(); ++i) {
----------------
Mel-Chen wrote:

Could this work?
```
    // Get or create the start address for the interleave group.
    auto *Start =
        cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(IG->getMember(0)));

    VPIRMetadata InterleaveMD(*Start);  
    SmallVector<VPValue *, 4> StoredValues;
    if (auto *StoreR = dyn_cast<VPWidenStoreRecipe>(Start))
       StoredValues.push_back(StoreR->getStoredValue());
       
    for (unsigned i = 1; i < IG->getFactor(); ++i) {
      Instruction *MemI = IG->getMember(i);
      if (!MemI)
        continue;
      VPWidenMemoryRecipe *MemR = 
          cast<VPWidenMemoryRecipe>(RecipeBuilder.getRecipe(MemI));
      if (!StoredValues.empty()) 
        StoredValues.push_back(cast<VPWidenStoreRecipe>(MemR)->getStoredValue());
      InterleaveMD.intersect(*MemR);
    }
```


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


More information about the llvm-commits mailing list