[llvm] [VPlan] Make canonical IV part of the region (PR #156262)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 16 08:27:00 PDT 2026


================
@@ -4521,24 +4490,34 @@ class LLVM_ABI_FOR_TEST VPRegionBlock : public VPBlockBase {
   /// its entry, and its exiting block to its successor.
   void dissolveToCFGLoop();
 
-  /// Returns the canonical induction recipe of the region.
-  VPCanonicalIVPHIRecipe *getCanonicalIV() {
-    VPBasicBlock *EntryVPBB = getEntryBasicBlock();
-    if (EntryVPBB->empty()) {
-      // VPlan native path. TODO: Unify both code paths.
-      EntryVPBB = cast<VPBasicBlock>(EntryVPBB->getSingleSuccessor());
-    }
-    return cast<VPCanonicalIVPHIRecipe>(&*EntryVPBB->begin());
+  /// Get the canonical IV increment instruction. If the exiting terminator
+  /// is a BranchOnCount or BranchOnCond with an IV increment, return this
+  /// increment. Otherwise, create a new increment before the terminator and
+  /// return it.
+  VPInstruction *getOrCreateCanonicalIVIncrement();
+
+  /// Return the canonical induction variable of the region, null for
+  /// replicating regions.
+  VPRegionValue *getCanonicalIV() {
+    return CanIVInfo ? CanIVInfo->getVPValue() : nullptr;
   }
-  const VPCanonicalIVPHIRecipe *getCanonicalIV() const {
-    return const_cast<VPRegionBlock *>(this)->getCanonicalIV();
+  const VPRegionValue *getCanonicalIV() const {
+    return CanIVInfo ? CanIVInfo->getVPValue() : nullptr;
   }
 
   /// Return the type of the canonical IV for loop regions.
-  Type *getCanonicalIVType() { return getCanonicalIV()->getScalarType(); }
-  const Type *getCanonicalIVType() const {
-    return getCanonicalIV()->getScalarType();
+  Type *getCanonicalIVType() const {
+    return CanIVInfo->getVPValue()->getType();
+  }
+
+  /// Return the debug location of the canonical IV for loop regions.
+  DebugLoc getCanonicalIVDebugLoc() const {
+    return CanIVInfo->getVPValue()->getDebugLoc();
   }
----------------
fhahn wrote:

there are quite a few uses of `getCanonicalIVType`, they could all be replaced, but in some cases we don't need the canonical IV, so this would increase the diff slightly

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


More information about the llvm-commits mailing list