[Mlir-commits] [mlir] [mlir][SPIRV] Handle vector stores when unifying aliased resources (PR #232185)
Igor Wodiany
llvmlistbot at llvm.org
Fri Oct 30 03:10:08 PDT 2026
================
@@ -550,15 +551,75 @@ struct ConvertStore : public ConvertAliasResource<spirv::StoreOp> {
cast<spirv::PointerType>(storeOp.getPtr().getType()).getPointeeType();
auto dstElemType =
cast<spirv::PointerType>(adaptor.getPtr().getType()).getPointeeType();
- if (!srcElemType.isIntOrFloat() || !dstElemType.isIntOrFloat())
- return rewriter.notifyMatchFailure(storeOp, "not scalar type");
- if (!areSameBitwidthScalarType(srcElemType, dstElemType))
- return rewriter.notifyMatchFailure(storeOp, "different bitwidth");
-
Location loc = storeOp.getLoc();
Value value = adaptor.getValue();
- if (srcElemType != dstElemType)
+ auto srcVector = dyn_cast<VectorType>(srcElemType);
+ auto dstVector = dyn_cast<VectorType>(dstElemType);
+ if (srcVector && dstVector && srcVector != dstVector) {
+ if (srcVector.getElementTypeBitWidth() !=
+ dstVector.getElementTypeBitWidth() ||
+ srcVector.getNumElements() % dstVector.getNumElements() != 0)
+ return rewriter.notifyMatchFailure(storeOp,
+ "incompatible vector types");
+ auto acOp = adaptor.getPtr().getDefiningOp<spirv::AccessChainOp>();
+ if (!acOp)
+ return rewriter.notifyMatchFailure(storeOp,
+ "ptr not spirv.AccessChain");
+ if (srcVector.getElementType() != dstVector.getElementType())
+ value = spirv::BitcastOp::create(
+ rewriter, loc,
+ VectorType::get(srcVector.getShape(), dstVector.getElementType()),
+ value);
+ unsigned count = dstVector.getNumElements();
+ unsigned ratio = srcVector.getNumElements() / count;
+ unsigned bytes = count * dstVector.getElementTypeBitWidth() / 8;
+
+ // Split the value into vectors matching the canonical resource and store
+ // them at consecutive vector indices. Adjust each store's alignment for
+ // its byte offset from the original pointer.
+ auto getPart = [&](unsigned i) -> Value {
+ if (ratio == 1)
+ return value;
+ SmallVector<int32_t> components;
+ for (unsigned j = 0; j < count; ++j)
+ components.push_back(i * count + j);
+ return spirv::VectorShuffleOp::create(
+ rewriter, loc, dstVector, value, value,
+ rewriter.getI32ArrayAttr(components));
+ };
+ auto firstStore = spirv::StoreOp::create(
+ rewriter, loc, adaptor.getPtr(), getPart(0),
+ storeOp.getMemoryAccessAttr(), storeOp.getAlignmentAttr());
+ firstStore->setDiscardableAttrs(storeOp->getDiscardableAttrDictionary());
+ for (unsigned i = 1; i < ratio; ++i) {
+ Value part = getPart(i);
+ auto indices = llvm::to_vector(acOp.getIndices());
+ Type indexType = indices.back().getType();
+ auto offset = spirv::ConstantOp::create(
+ rewriter, loc, indexType, rewriter.getIntegerAttr(indexType, i));
+ indices.back() = spirv::IAddOp::create(rewriter, loc, indexType,
+ indices.back(), offset);
+ Value ptr = spirv::AccessChainOp::create(rewriter, loc,
+ acOp.getBasePtr(), indices);
+ auto alignment = storeOp.getAlignmentAttr();
----------------
IgWod wrote:
nit: type
https://github.com/llvm/llvm-project/pull/232185
More information about the Mlir-commits
mailing list