[polly] af3a0e6 - [Polly] Allow changing array dims when importing JScop (#174582)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 6 05:07:08 PST 2026
Author: Michael Kruse
Date: 2026-01-06T13:07:03Z
New Revision: af3a0e61f4e08afb53d4efe815fcc6269c63f739
URL: https://github.com/llvm/llvm-project/commit/af3a0e61f4e08afb53d4efe815fcc6269c63f739
DIFF: https://github.com/llvm/llvm-project/commit/af3a0e61f4e08afb53d4efe815fcc6269c63f739.diff
LOG: [Polly] Allow changing array dims when importing JScop (#174582)
This is in preparation to avoid relying on GEPs to derive dependency
information; Clang will eventually emit `ptradd` instead of
`getelementptr`.
Added:
polly/test/JSONExporter/ImportAccesses/change-array-dims.ll
polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop
polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop.transformed
Modified:
polly/lib/Exchange/JSONExporter.cpp
Removed:
################################################################################
diff --git a/polly/lib/Exchange/JSONExporter.cpp b/polly/lib/Exchange/JSONExporter.cpp
index 75d297caa5b6f..fcc9f61b27c74 100644
--- a/polly/lib/Exchange/JSONExporter.cpp
+++ b/polly/lib/Exchange/JSONExporter.cpp
@@ -542,17 +542,6 @@ static bool areArraysEqual(ScopArrayInfo *SAI, const json::Object &Array) {
if (SAI->getName() != *Array.getString("name"))
return false;
- if (SAI->getNumberOfDimensions() != Array.getArray("sizes")->size())
- return false;
-
- for (unsigned i = 1; i < Array.getArray("sizes")->size(); i++) {
- SAI->getDimensionSize(i)->print(RawStringOstream);
- const json::Array &SizesArray = *Array.getArray("sizes");
- if (Buffer != SizesArray[i].getAsString().value())
- return false;
- Buffer.clear();
- }
-
// Check if key 'type'
diff ers from the current one or is not valid.
SAI->getElementType()->print(RawStringOstream);
if (Buffer != Array.getString("type").value()) {
@@ -616,10 +605,45 @@ static bool importArrays(Scop &S, const json::Object &JScop) {
errs() << "Not enough array entries in JScop file.\n";
return false;
}
- if (!areArraysEqual(SAI, *Arrays[ArrayIdx].getAsObject())) {
+ const json::Object &Array = *Arrays[ArrayIdx].getAsObject();
+ if (!areArraysEqual(SAI, Array)) {
errs() << "No match for array '" << SAI->getName() << "' in JScop.\n";
return false;
}
+
+ auto *DimSizeType = Type::getInt64Ty(S.getSE()->getContext());
+ const json::Array &SizesArray = *Array.getArray("sizes");
+
+ SmallVector<const SCEV *> SCEVSizes;
+ for (unsigned i = 0; i < SizesArray.size(); i++) {
+ std::string StrSize = SizesArray[i].getAsString()->str();
+ if (StrSize == "*") {
+ if (i != 0) {
+ errs() << "undefined size only allowed for outermost dimension\n";
+ return false;
+ }
+ SCEVSizes.push_back(nullptr);
+ continue;
+ }
+
+ int Size = std::stoi(StrSize);
+
+ // Check if the size if positive.
+ if (Size <= 0) {
+ errs() << "The size at index " << i << " is =< 0.\n";
+ return false;
+ }
+
+ const SCEV *ScevSize = S.getSE()->getConstant(DimSizeType, Size);
+ SCEVSizes.push_back(ScevSize);
+ }
+
+ // TODO: If changing the dimensionality of an array, all its accesses must
+ // be updated to that dimensionality. Currently there is no check
+ // whether all accesses are really updated.
+ if (!SAI->updateSizes(SCEVSizes, /*CheckConsistency=*/false))
+ return false;
+
ArrayIdx++;
}
diff --git a/polly/test/JSONExporter/ImportAccesses/change-array-dims.ll b/polly/test/JSONExporter/ImportAccesses/change-array-dims.ll
new file mode 100644
index 0000000000000..840ac8e5fdba9
--- /dev/null
+++ b/polly/test/JSONExporter/ImportAccesses/change-array-dims.ll
@@ -0,0 +1,59 @@
+; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -polly-print-import-jscop -disable-output < %s | FileCheck %s
+
+define void @change-array-dims(ptr noalias nonnull %A, ptr noalias nonnull %B) {
+entry:
+ br label %outer.preheader
+
+outer.preheader:
+ br label %outer.for
+
+outer.for:
+ %j = phi i32 [0, %outer.preheader], [%j.inc, %outer.inc]
+ %j.cmp = icmp slt i32 %j, 2
+ br i1 %j.cmp, label %inner.preheader, label %outer.exit
+
+
+ inner.preheader:
+ br label %inner.for
+
+ inner.for:
+ %i = phi i32 [0, %inner.preheader], [%i.inc, %inner.inc]
+ br label %body
+
+
+
+ body:
+ %mul = mul nsw i32 %j, 4
+ %add = add nsw i32 %mul, %i
+ %A_idx = getelementptr inbounds double, ptr %A, i32 %add
+ store double 42.0, ptr %A_idx
+ br label %inner.inc
+
+
+
+ inner.inc:
+ %i.inc = add nuw nsw i32 %i, 1
+ %i.cmp = icmp slt i32 %i.inc, 4
+ br i1 %i.cmp, label %inner.for, label %inner.exit
+
+ inner.exit:
+ br label %outer.inc
+
+
+
+outer.inc:
+ %j.inc = add nuw nsw i32 %j, 1
+ br label %outer.for
+
+outer.exit:
+ br label %return
+
+return:
+ ret void
+}
+
+
+; CHECK: Stmt_body
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_body[i0, i1] -> MemRef_A[4i0 + i1] };
+; CHECK-NEXT: new: { Stmt_body[i0, i1] -> MemRef_A[i0, i1] };
diff --git a/polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop b/polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop
new file mode 100644
index 0000000000000..2efb2f3df7dba
--- /dev/null
+++ b/polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop
@@ -0,0 +1,26 @@
+{
+ "arrays": [
+ {
+ "name": "MemRef_A",
+ "sizes": [
+ "*"
+ ],
+ "type": "double"
+ }
+ ],
+ "context": "{ : }",
+ "name": "%outer.for---%return",
+ "statements": [
+ {
+ "accesses": [
+ {
+ "kind": "write",
+ "relation": "{ Stmt_body[i0, i1] -> MemRef_A[4i0 + i1] }"
+ }
+ ],
+ "domain": "{ Stmt_body[i0, i1] : 0 <= i0 <= 1 and 0 <= i1 <= 3 }",
+ "name": "Stmt_body",
+ "schedule": "{ Stmt_body[i0, i1] -> [i0, i1] }"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop.transformed b/polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop.transformed
new file mode 100644
index 0000000000000..e3b34646677d9
--- /dev/null
+++ b/polly/test/JSONExporter/ImportAccesses/change-array-dims___%outer.for---%return.jscop.transformed
@@ -0,0 +1,27 @@
+{
+ "arrays": [
+ {
+ "name": "MemRef_A",
+ "sizes": [
+ "*",
+ "4"
+ ],
+ "type": "double"
+ }
+ ],
+ "context": "{ : }",
+ "name": "%outer.for---%return",
+ "statements": [
+ {
+ "accesses": [
+ {
+ "kind": "write",
+ "relation": "{ Stmt_body[i0, i1] -> MemRef_A[i0][i1] }"
+ }
+ ],
+ "domain": "{ Stmt_body[i0, i1] : 0 <= i0 <= 1 and 0 <= i1 <= 3 }",
+ "name": "Stmt_body",
+ "schedule": "{ Stmt_body[i0, i1] -> [i0, i1] }"
+ }
+ ]
+}
\ No newline at end of file
More information about the llvm-commits
mailing list