[Mlir-commits] [mlir] [mlir][affine] Avoid folding out-of-bounds constant loads (PR #224076)
purnima shrivastava
llvmlistbot at llvm.org
Wed Sep 16 09:51:05 PDT 2026
https://github.com/purnima-nlp created https://github.com/llvm/llvm-project/pull/224076
`AffineLoadOp::fold` could crash when folding a constant load with out-of-bounds indices, including loads from zero-sized constant memrefs.
Check `ElementsAttr::isValidIndex` before indexing the constant attribute and skip folding when the access is invalid.
Adds a regression test for `memref<0xi8>`.
Fixes #223949
>From cf64fa66b8929314d194479557c12298bdd65bfd Mon Sep 17 00:00:00 2001
From: Purnima Shrivastava <purnimashrivastava05 at .com>
Date: Wed, 16 Sep 2026 22:17:31 +0530
Subject: [PATCH] [mlir][affine] Avoid folding out-of-bounds constant loads
---
mlir/lib/Dialect/Affine/IR/AffineOps.cpp | 5 ++++-
mlir/test/Dialect/Affine/constant-fold.mlir | 12 ++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
index 83a9e06374457..0b14c7de07058 100644
--- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
+++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
@@ -3520,7 +3520,10 @@ OpFoldResult AffineLoadOp::fold(FoldAdaptor adaptor) {
auto indices =
llvm::map_to_vector<4>(getAffineMap().getConstantResults(),
[](int64_t v) -> uint64_t { return v; });
- return cstAttr.getValues<Attribute>()[indices];
+ ElementsAttr elementsAttr = cstAttr;
+ if (!elementsAttr.isValidIndex(indices))
+ return {};
+ return elementsAttr.getValues<Attribute>()[indices];
}
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Dialect/Affine/constant-fold.mlir b/mlir/test/Dialect/Affine/constant-fold.mlir
index 8bddacc024751..ace83e49974c7 100644
--- a/mlir/test/Dialect/Affine/constant-fold.mlir
+++ b/mlir/test/Dialect/Affine/constant-fold.mlir
@@ -90,3 +90,15 @@ func.func @affine_apply_poison_division_zero_2() -> index {
%0 = affine.apply affine_map<(d0)[s0] -> (d0 mod (s0 - s0))>(%c16)[%c16]
return %0 : index
}
+
+// -----
+
+memref.global "private" constant @empty : memref<0xi8> = dense<>
+
+// CHECK-LABEL: func.func @load_from_empty_global
+func.func @load_from_empty_global() -> i8 {
+ %0 = memref.get_global @empty : memref<0xi8>
+ // CHECK: affine.load %{{.*}}[0] : memref<0xi8>
+ %1 = affine.load %0[0] : memref<0xi8>
+ return %1 : i8
+}
More information about the Mlir-commits
mailing list