Skip to content

Conversation

@sommerlukas
Copy link
Contributor

Addresses a long-standing TODO to not drop the encoding when folding a tensor.empty with a reshape operation (tensor.expand_shape, tensor.collapse_shape).

Addresses a long-live TODO to not drop the encoding when folding a `tensor.empty` with a reshape operation (`tensor.expand_shape`, `tensor.collapse_shape`).

Signed-off-by: Lukas Sommer <[email protected]>
@llvmbot
Copy link
Member

llvmbot commented Jan 16, 2026

@llvm/pr-subscribers-mlir-tensor

@llvm/pr-subscribers-mlir

Author: Lukas Sommer (sommerlukas)

Changes

Addresses a long-standing TODO to not drop the encoding when folding a tensor.empty with a reshape operation (tensor.expand_shape, tensor.collapse_shape).


Full diff: https://github.com/llvm/llvm-project/pull/176427.diff

2 Files Affected:

  • (modified) mlir/lib/Dialect/Tensor/Transforms/EmptyOpPatterns.cpp (+5-2)
  • (modified) mlir/test/Dialect/Tensor/fold-empty-op.mlir (+21)
diff --git a/mlir/lib/Dialect/Tensor/Transforms/EmptyOpPatterns.cpp b/mlir/lib/Dialect/Tensor/Transforms/EmptyOpPatterns.cpp
index 670865de6031f..b88c2886095a4 100644
--- a/mlir/lib/Dialect/Tensor/Transforms/EmptyOpPatterns.cpp
+++ b/mlir/lib/Dialect/Tensor/Transforms/EmptyOpPatterns.cpp
@@ -40,11 +40,14 @@ struct FoldEmptyTensorWithReshapeOp : public OpRewritePattern<ReshapeOp> {
         !llvm::hasSingleElement(resultShapes))
       return failure();
 
+    Attribute encoding;
+    if(auto tensorTy = dyn_cast<RankedTensorType>(reshapeOp.getResultType())){
+      encoding = tensorTy.getEncoding();
+    }
     // Create new tensor.empty op.
-    // TODO: Do not drop tensor type encoding.
     Value emptyTensor =
         EmptyOp::create(rewriter, loc, resultShapes[0],
-                        reshapeOp.getResultType().getElementType());
+                        reshapeOp.getResultType().getElementType(), encoding);
     if (emptyTensor.getType() != reshapeOp.getResultType()) {
       rewriter.replaceOpWithNewOp<tensor::CastOp>(
           reshapeOp, reshapeOp.getResultType(), emptyTensor);
diff --git a/mlir/test/Dialect/Tensor/fold-empty-op.mlir b/mlir/test/Dialect/Tensor/fold-empty-op.mlir
index 7b11c9f43c7ec..62ee7e8c2d5ca 100644
--- a/mlir/test/Dialect/Tensor/fold-empty-op.mlir
+++ b/mlir/test/Dialect/Tensor/fold-empty-op.mlir
@@ -37,6 +37,27 @@ func.func @empty_reshape_collapse(%arg0 : index) -> tensor<6x5x?xf32> {
 // CHECK-NEXT:   %[[INIT:.+]] = tensor.empty(%[[D]])
 // CHECK-NEXT:   return %[[INIT]]
 
+#encoding = #test.tensor_encoding<"encoding">
+
+func.func @empty_expand_encoding() -> tensor<2x3x4x2xf32, #encoding> {
+  %0 = tensor.empty() : tensor<6x8xf32, #encoding>
+  %1 = tensor.expand_shape %0 [[0, 1], [2, 3]] output_shape [2, 3, 4, 2] : tensor<6x8xf32, #encoding> into tensor<2x3x4x2xf32, #encoding>
+  return %1 : tensor<2x3x4x2xf32, #encoding>
+}
+// CHECK-LABEL:   func.func @empty_expand_encoding
+// CHECK:           %[[INIT:.+]] = tensor.empty() : tensor<2x3x4x2xf32, #test.tensor_encoding<"encoding">>
+// CHECK-NEXT:      return %[[INIT]]
+
+func.func @empty_collapse_encoding() -> tensor<6x8xf32, #encoding> {
+  %0 = tensor.empty() : tensor<2x3x4x2xf32, #encoding>
+  %1 = tensor.collapse_shape %0 [[0, 1], [2, 3]]
+      : tensor<2x3x4x2xf32, #encoding> into tensor<6x8xf32, #encoding>
+  return %1 : tensor<6x8xf32, #encoding>
+}
+// CHECK-LABEL:   func.func @empty_collapse_encoding
+// CHECK:           %[[EMPTY_0:.*]] = tensor.empty() : tensor<6x8xf32, #test.tensor_encoding<"encoding">>
+// CHECK-NEXT:      return %[[EMPTY_0]]
+
 func.func @fold_empty_tensor_with_slice
   (%arg0 : index, %arg1 : index) -> tensor<5x?x20xf32>
 {

@github-actions
Copy link

github-actions bot commented Jan 16, 2026

✅ With the latest revision this PR passed the C/C++ code formatter.

Signed-off-by: Lukas Sommer <[email protected]>
Copy link
Contributor

@hanhanW hanhanW left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks.

Signed-off-by: Lukas Sommer <[email protected]>
@sommerlukas sommerlukas merged commit 5b454fb into llvm:main Jan 19, 2026
11 checks passed
@sommerlukas sommerlukas deleted the preserve-encoding-empty-folding branch January 19, 2026 09:23
BStott6 pushed a commit to BStott6/llvm-project that referenced this pull request Jan 22, 2026
Addresses a long-standing TODO to not drop the encoding when folding a
`tensor.empty` with a reshape operation (`tensor.expand_shape`,
`tensor.collapse_shape`).

---------

Signed-off-by: Lukas Sommer <[email protected]>
amd-eochoalo added a commit to iree-org/iree that referenced this pull request Jan 22, 2026
Reverts carried forward:

Local revert of llvm/llvm-project#169614 due to
#22649

* Also integrates torch-mlir
* Fixes test due to llvm/llvm-project#176427
keshavvinayak01 pushed a commit to iree-org/iree that referenced this pull request Jan 27, 2026
Reverts carried forward:

Local revert of llvm/llvm-project#169614 due to
#22649

* Also integrates torch-mlir
* Fixes test due to llvm/llvm-project#176427

Signed-off-by: Keshav Vinayak Jha <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants