[Mlir-commits] [mlir] [MLIR][Vector] Add unroll pattern for vector.shape_cast (PR #167738)
Charitha Saumya
llvmlistbot at llvm.org
Mon Nov 17 11:30:07 PST 2025
================
@@ -1003,6 +1003,195 @@ struct UnrollFromElements : OpRewritePattern<vector::FromElementsOp> {
vector::UnrollVectorOptions options;
};
+static bool isContiguousExtract(ArrayRef<int64_t> targetShape,
+ ArrayRef<int64_t> resultShape) {
+ if (targetShape.size() > resultShape.size())
+ return false;
+
+ int64_t targetElements = ShapedType::getNumElements(targetShape);
+ int64_t resultElements = ShapedType::getNumElements(resultShape);
+
+ // Result must be evenly divisible by target.
+ if (resultElements % targetElements != 0)
+ return false;
+
+ // For contiguous extraction, we need to be able to
+ // extract targetElements contiguously from the result shape.
+ // This means we can "consume" dimensions from the innermost outward
+ // until we have exactly targetElements.
+
+ int64_t remainingElements = targetElements;
+ int targetDimIdx = targetShape.size() - 1;
+
+ // Work backwards through result dimensions.
+ for (int resultDimIdx = resultShape.size() - 1;
+ resultDimIdx >= 0 && remainingElements > 1 && targetDimIdx >= 0;
+ --resultDimIdx) {
+
+ int64_t resultDimSize = resultShape[resultDimIdx];
+ int64_t targetDimSize = targetShape[targetDimIdx];
+
+ if (targetDimSize > resultDimSize)
+ return false;
+
+ if (targetDimSize == resultDimSize) {
+ if (remainingElements % targetDimSize != 0)
+ return false;
+ remainingElements /= targetDimSize;
+ --targetDimIdx;
+ } else {
+ if (remainingElements != targetDimSize)
----------------
charithaintc wrote:
what is the reason for this check?
How about:
targetShape : 4x2x4
resultShape: 4x4x4
They are still contiguous, right ?
Why not simply check if each target dim from the end is,
1) equal to result dim
2) Or a factor of result dim.
https://github.com/llvm/llvm-project/pull/167738
More information about the Mlir-commits
mailing list