[llvm] [polly] [delinearize] Extract array dimensions from alloca and global declarations (PR #156342)

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 9 10:16:12 PDT 2025


================
@@ -759,51 +1073,63 @@ void printDelinearization(raw_ostream &O, Function *F, LoopInfo *LI,
     // Do not analyze memory accesses outside loops.
     if (!L)
       continue;
-
     const SCEV *AccessFn = SE->getSCEVAtScope(getPointerOperand(&Inst), L);
 
-    const SCEVUnknown *BasePointer =
-        dyn_cast<SCEVUnknown>(SE->getPointerBase(AccessFn));
-    // Do not delinearize if we cannot find the base pointer.
-    if (!BasePointer)
-      break;
-    AccessFn = SE->getMinusSCEV(AccessFn, BasePointer);
-
     O << "\n";
     O << "Inst:" << Inst << "\n";
     O << "AccessFunction: " << *AccessFn << "\n";
 
     SmallVector<const SCEV *, 3> Subscripts, Sizes;
-
     auto IsDelinearizationFailed = [&]() {
-      return Subscripts.size() == 0 || Sizes.size() == 0 ||
-             Subscripts.size() != Sizes.size();
+      return Subscripts.size() == 0 || Sizes.size() == 0;
     };
 
-    delinearize(*SE, AccessFn, Subscripts, Sizes, SE->getElementSize(&Inst));
+    const SCEV *ElementSize = SE->getElementSize(&Inst);
+    delinearize(*SE, AccessFn, Subscripts, Sizes, ElementSize);
     if (UseFixedSizeArrayHeuristic && IsDelinearizationFailed()) {
       Subscripts.clear();
       Sizes.clear();
+
+      const SCEVUnknown *BasePointer =
+          dyn_cast<SCEVUnknown>(SE->getPointerBase(AccessFn));
+      // Fail to delinearize if we cannot find the base pointer.
+      if (!BasePointer)
+        continue;
+      AccessFn = SE->getMinusSCEV(AccessFn, BasePointer);
+
       delinearizeFixedSizeArray(*SE, AccessFn, Subscripts, Sizes,
                                 SE->getElementSize(&Inst));
     }
 
-      if (IsDelinearizationFailed()) {
-        O << "failed to delinearize\n";
-        continue;
-      }
+    if (IsDelinearizationFailed()) {
+      O << "failed to delinearize\n";
+      continue;
+    }
 
-      O << "Base offset: " << *BasePointer << "\n";
-      O << "ArrayDecl[UnknownSize]";
-      int Size = Subscripts.size();
-      for (int i = 0; i < Size - 1; i++)
+    O << "ArrayDecl";
+    // Print [Unknown] when the outermost dimension of the array is not known.
+    // Sizes[NumSizes - 1] is the array element size.
+    int NumSubscripts = Subscripts.size();
+    int NumSizes = Sizes.size();
+    if (NumSizes == NumSubscripts)
+      O << "[UnknownSize]";
+
+    // Handle different size relationships between Subscripts and Sizes.
+    if (NumSizes > 0) {
+      // Print array dimensions (all but the last, which is element size).
+      for (int i = 0; i < NumSizes - 1; i++)
----------------
alexey-bataev wrote:

```
for (const SCEV *Size : ArrayRef(Sizes).drop_back())
  O << "[" << *Size << "]";
```

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


More information about the llvm-commits mailing list