[Mlir-commits] [mlir] [mlir][vector] Recompute load/store alignment when the index moves (PR #221385)
Federico Bruzzone
llvmlistbot at llvm.org
Sun Oct 18 08:30:19 PDT 2026
================
@@ -307,6 +308,39 @@ SmallVector<OpFoldResult> vector::getMixedSizesXfer(bool hasTensorSemantics,
return mixedSourceDims;
}
+llvm::MaybeAlign vector::getAlignmentAfterOffset(llvm::MaybeAlign alignment,
+ MemRefType memRefType,
+ ArrayRef<int64_t> offsets) {
+ if (!alignment)
+ return {};
+ assert(offsets.size() <= static_cast<size_t>(memRefType.getRank()) &&
+ "more offsets than memref dimensions");
+ if (llvm::all_of(offsets, [](int64_t offset) { return offset == 0; }))
+ return alignment;
+
+ Type elementType = memRefType.getElementType();
+ if (!elementType.isIntOrFloat() ||
+ elementType.getIntOrFloatBitWidth() % 8 != 0)
+ return {};
+ SmallVector<int64_t> strides;
+ int64_t memRefOffset;
+ if (failed(memRefType.getStridesAndOffset(strides, memRefOffset)))
+ return {};
+
+ int64_t elementOffset = 0;
+ size_t start = strides.size() - offsets.size();
+ for (auto [i, offset] : llvm::enumerate(offsets)) {
+ if (offset == 0)
+ continue;
+ if (ShapedType::isDynamic(strides[start + i]))
+ return {};
+ elementOffset += offset * strides[start + i];
+ }
+ uint64_t byteOffset =
+ std::abs(elementOffset) * (elementType.getIntOrFloatBitWidth() / 8);
----------------
FedericoBruzzone wrote:
Can we use `llvm::AbsoluteValue` instead of `std::abs`?
https://github.com/llvm/llvm-project/pull/221385
More information about the Mlir-commits
mailing list