[llvm] c890582 - [VPlan] Account for live-in entries in MinBW used by replicate recipes.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 3 03:15:57 PST 2023


Author: Florian Hahn
Date: 2023-12-03T11:15:29Z
New Revision: c89058291248aecd7d43373b719aff74706026e7

URL: https://github.com/llvm/llvm-project/commit/c89058291248aecd7d43373b719aff74706026e7
DIFF: https://github.com/llvm/llvm-project/commit/c89058291248aecd7d43373b719aff74706026e7.diff

LOG: [VPlan] Account for live-in entries in MinBW used by replicate recipes.

In some cases MinBWs may contain entries for live-ins that are not used
by VPWidenRecipe or VPWidenSelectRecipes. In those cases, the live-ins
won't get processed, so make sure we include them in the count when used
as operands in VPWidenCast and VPWidenSelectRecipe.

Fixes https://github.com/llvm/llvm-project/issues/74231

Added: 
    

Modified: 
    llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
    llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 8eb33a3e53364..f94961bfe26d1 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -905,8 +905,32 @@ void VPlanTransforms::truncateToMinimalBitwidths(
       // type. Skip those here, after incrementing NumProcessedRecipes. Also
       // skip casts which do not need to be handled explicitly here, as
       // redundant casts will be removed during recipe simplification.
-      if (isa<VPReplicateRecipe, VPWidenCastRecipe>(&R))
+      if (isa<VPReplicateRecipe, VPWidenCastRecipe>(&R)) {
+#ifndef NDEBUG
+        // If any of the operands is a live-in and not used by VPWidenRecipe or
+        // VPWidenSelectRecipe, but in MinBWs, make sure it is counted as
+        // processed as well. When MinBWs is currently constructed, there is no
+        // information about whether recipes are widened or replicated and in
+        // case they are reciplicated the operands are not truncated. Counting
+        // them them here ensures we do not miss any recipes in MinBWs.
+        // TODO: Remove once the analysis is done on VPlan.
+        for (VPValue *Op : R.operands()) {
+          if (!Op->isLiveIn())
+            continue;
+          auto *UV = dyn_cast_or_null<Instruction>(Op->getUnderlyingValue());
+          if (UV && MinBWs.contains(UV) && !ProcessedTruncs.contains(Op) &&
+              all_of(Op->users(), [](VPUser *U) {
+                return !isa<VPWidenRecipe, VPWidenSelectRecipe>(U);
+              })) {
+            // Add an entry to ProcessedTruncs to avoid counting the same
+            // operand multiple times.
+            ProcessedTruncs[Op] = nullptr;
+            NumProcessedRecipes += 1;
+          }
+        }
+#endif
         continue;
+      }
 
       Type *OldResTy = TypeInfo.inferScalarType(ResultVPV);
       unsigned OldResSizeInBits = OldResTy->getScalarSizeInBits();

diff  --git a/llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll b/llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll
index 20d87d3ecc27e..b8208e1abda94 100644
--- a/llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll
@@ -383,3 +383,37 @@ loop:
 exit:
   ret void
 }
+
+; Test case for #74231.
+define void @replicate_operands_in_with_operands_in_minbws(ptr %dst, ptr noalias %src.1, ptr noalias %src.2, i32 %x) {
+entry:
+  %sub = sub i32 %x, 10
+  br label %loop.header
+
+loop.header:
+  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
+  %gep.src.1 = getelementptr inbounds i32, ptr %src.1, i64 %iv
+  %l = load i32, ptr %gep.src.1
+  %c.1 = icmp eq i32 %l, 10
+  br i1 %c.1, label %loop.latch, label %if.then
+
+if.then:
+  %gep.src.2 = getelementptr inbounds i16, ptr %src.2, i64 %iv
+  %l.2 = load i16, ptr %gep.src.2
+  %c.2 = icmp ule i16 %l.2, 99
+  %conv = zext i16 %l.2 to i32
+  %sel = select i1 %c.2, i32 %sub, i32 %conv
+  %add = add i32 %conv, %sel
+  %trunc = trunc i32 %add to i16
+  %gep.dst = getelementptr inbounds i32, ptr %dst, i64 %iv
+  store i16 %trunc, ptr %gep.dst, align 2
+  br label %loop.latch
+
+loop.latch:
+  %iv.next = add i64 %iv, 1
+  %tobool.not = icmp eq i64 %iv.next, 1000
+  br i1 %tobool.not, label %exit, label %loop.header
+
+exit:
+  ret void
+}


        


More information about the llvm-commits mailing list