diff --git a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp --- a/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp +++ b/mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp @@ -729,6 +729,15 @@ outputOperands, rewriter.getAffineMapArrayAttr(newIndexingMaps), genericOp.iterator_types(), genericOp.docAttr(), genericOp.library_callAttr()); + + // Copy over unknown attributes. They might be load bearing for some flow. + ArrayRef odsAttrs = genericOp.getAttributeNames(); + for (NamedAttribute kv : genericOp->getAttrs()) { + if (!llvm::is_contained(odsAttrs, kv.first.c_str())) { + newOp->setAttr(kv.first, kv.second); + } + } + rewriter.inlineRegionBefore(genericOp.region(), newOp.region(), newOp.region().begin()); diff --git a/mlir/test/Dialect/Linalg/canonicalize-duplicate-inputs.mlir b/mlir/test/Dialect/Linalg/canonicalize-duplicate-inputs.mlir --- a/mlir/test/Dialect/Linalg/canonicalize-duplicate-inputs.mlir +++ b/mlir/test/Dialect/Linalg/canonicalize-duplicate-inputs.mlir @@ -8,11 +8,12 @@ // CHECK-LABEL: @basic func @basic(%arg0: tensor) -> tensor { // CHECK: linalg.generic{{.*}}[#[[$MAP]], #[[$MAP]]] + // CHECK: attrs = {someattr} // CHECK: ^bb0(%[[BBARG:.*]]: f32, %{{.*}}: f32): // CHECK: addf %[[BBARG]], %[[BBARG]] %0 = linalg.generic {indexing_maps = [#map, #map, #map], iterator_types = ["parallel"]} ins(%arg0, %arg0 : tensor, tensor) - outs(%arg0 : tensor) { + outs(%arg0 : tensor) attrs = {someattr} { ^bb0(%arg1: f32, %arg2: f32, %arg3: f32): %1 = addf %arg1, %arg2 : f32 linalg.yield %1 : f32