new file mode 100644
@@ -0,0 +1,34 @@
+diff --git a/mlir/include/mlir/Dialect/Tensor/Transforms/Passes.h b/mlir/include/mlir/Dialect/Tensor/Transforms/Passes.h
+index 48f9066934a2..d2dd95416241 100644
+--- a/mlir/include/mlir/Dialect/Tensor/Transforms/Passes.h
+@@ -24,6 +24,9 @@ std::unique_ptr<Pass> createFoldTensorSubsetOpsPass();
+ /// Creates an instance of the `tensor` dialect bufferization pass.
+ std::unique_ptr<Pass> createTensorBufferizePass();
+
++/// Creates an instance of the concat decomposition pass.
++std::unique_ptr<Pass> createDecomposeTensorConcatPass();
++
+ //===----------------------------------------------------------------------===//
+ // Registration
+ //===----------------------------------------------------------------------===//
+diff --git a/mlir/include/mlir/Dialect/Tensor/Transforms/Passes.td b/mlir/include/mlir/Dialect/Tensor/Transforms/Passes.td
+index 4cc3844f2912..d30e5fcb604d 100644
+--- a/mlir/include/mlir/Dialect/Tensor/Transforms/Passes.td
+@@ -32,4 +32,15 @@ def TensorBufferize : Pass<"tensor-bufferize", "func::FuncOp"> {
+ let constructor = "mlir::tensor::createTensorBufferizePass()";
+ }
+
++def DecomposeTensorConcat : Pass<"decompose-tensor-concat"> {
++ let summary = "Decompose tensor.concat into a chain of tensor.insert_slice "
++ "ops";
++ let description = [{
++ The pass decomposes tensor.concat ops into a chain of tensor.insert_slice
++ operations inserting into a materialized destination.
++ }];
++ let constructor = "mlir::tensor::createDecomposeTensorConcatPass()";
++ let dependentDialects = ["tensor::TensorDialect"];
++}
++
+ #endif // MLIR_DIALECT_TENSOR_TRANSFORMS_PASSES