[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