Retire obsolete transforms and tests (#12436)

diff --git a/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensions.cpp b/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensions.cpp
index b28cb17..00e8fa2 100644
--- a/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensions.cpp
+++ b/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensions.cpp
@@ -1198,75 +1198,6 @@
 }
 
 //===---------------------------------------------------------------------===//
-// ConfigExtractPart
-//===---------------------------------------------------------------------===//
-void transform_dialect::ConfigExtractPart::build(OpBuilder &builder,
-                                                 OperationState &result,
-                                                 Value target,
-                                                 StringRef attrName,
-                                                 Optional<int64_t> maybeLevel) {
-  MLIRContext *ctx = builder.getContext();
-  result.addOperands(target);
-  result.addAttribute(ConfigExtractPart::getAttrNameAttrName(result.name),
-                      builder.getStringAttr(attrName));
-  if (maybeLevel) {
-    result.addAttribute(ConfigExtractPart::getLevelAttrName(result.name),
-                        builder.getI64IntegerAttr(*maybeLevel));
-  }
-  result.addTypes({pdl::OperationType::get(ctx)});
-}
-
-void transform_dialect::ConfigExtractPart::getEffects(
-    SmallVectorImpl<MemoryEffects::EffectInstance> &effects) {
-  transform::onlyReadsHandle(getTarget(), effects);
-  transform::producesHandle(getResultConfigPart(), effects);
-  transform::modifiesPayload(effects);
-}
-
-DiagnosedSilenceableFailure transform_dialect::ConfigExtractPart::apply(
-    transform::TransformResults &transformResults,
-    transform::TransformState &state) {
-  ArrayRef<Operation *> targetOps = state.getPayloadOps(getTarget());
-  if (targetOps.empty()) {
-    transformResults.set(getResultConfigPart().cast<OpResult>(), {});
-    return DiagnosedSilenceableFailure::success();
-  }
-
-  assert(targetOps.size() == 1 && "expected single target op in payload");
-  Operation *target = targetOps.front();
-  auto config = iree_compiler::getLoweringConfig(target);
-  if (!config) {
-    transformResults.set(getResultConfigPart().cast<OpResult>(), {});
-    return emitSilenceableFailure(target) << " has no IREE config";
-  }
-
-  // TODO: op verifier etc.
-  if (getAttrName() != "tile_sizes")
-    return emitDefiniteFailure("unsupported attr");
-
-  if (!getLevel()) {
-    transformResults.set(getResultConfigPart().cast<OpResult>(), {});
-    return emitSilenceableFailure(target) << " level is required for tiling";
-  }
-  auto vals = config.getTileSizeVals(*getLevel());
-  if (vals.empty()) {
-    transformResults.set(getResultConfigPart().cast<OpResult>(), {});
-    return emitSilenceableFailure(target) << " no tiling at level";
-  }
-  SmallVector<Value> values;
-  SmallVector<Operation *> results;
-  OpBuilder b(target);
-  for (int64_t ts : vals) {
-    results.push_back(b.create<arith::ConstantIndexOp>(target->getLoc(), ts));
-    values.push_back(results.back()->getResult(0));
-  }
-  b.create<LinalgExt::DoNotDCEOperandsOp>(target->getLoc(), values);
-
-  transformResults.set(getResultConfigPart().cast<OpResult>(), results);
-  return DiagnosedSilenceableFailure::success();
-}
-
-//===---------------------------------------------------------------------===//
 // EraseHALDescriptorTypeFromMemRef
 //===---------------------------------------------------------------------===//
 
diff --git a/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensionsOps.td b/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensionsOps.td
index 60da8db..4317058 100644
--- a/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensionsOps.td
+++ b/compiler/src/iree/compiler/Codegen/Common/TransformExtensions/CommonExtensionsOps.td
@@ -485,31 +485,4 @@
   }];
 }
 
-def ConfigExtractPart :
-    Op<Transform_Dialect, "iree.config.extract_part",
-      [DeclareOpInterfaceMethods<MemoryEffectsOpInterface>,
-       TransformOpInterface]> {
-  let description = [{
-  }];
-  let arguments = (ins PDL_Operation:$target,
-                       StrAttr:$attr_name,
-                       OptionalAttr<I64Attr>:$level);
-  // TODO: allow return attributes ?
-  let results = (outs PDL_Operation:$resultConfigPart);
-  let assemblyFormat = "attr-dict $target";
-  let cppNamespace = "mlir::iree_compiler::IREE::transform_dialect";
-  // TODO: impl me.
-  // let hasVerifier = 1;
-
-  let builders = [
-    OpBuilder<(ins "Value":$target, "StringRef":$attrName,
-               CArg<"Optional<int64_t>", "std::nullopt">:$level)>
-  ];
-  let extraClassDeclaration = [{
-    ::mlir::DiagnosedSilenceableFailure apply(
-        ::mlir::transform::TransformResults &transformResults,
-        ::mlir::transform::TransformState &state);
-  }];
-}
-
 #endif // IREE_COMPILER_CODEGEN_COMMON_TRANSFORMEXTENSIONS_COMMONEXTENSIONS
diff --git a/llvm-external-projects/iree-dialects/BUILD b/llvm-external-projects/iree-dialects/BUILD
index c9f0361..3a6dd4d 100644
--- a/llvm-external-projects/iree-dialects/BUILD
+++ b/llvm-external-projects/iree-dialects/BUILD
@@ -515,6 +515,7 @@
         ":IREELinalgTransformIncGen",
         ":IREELinalgTransformStructuredIncGen",
         "@llvm-project//llvm:Support",
+
         # Dialects
         "@llvm-project//mlir:AffineDialect",
         "@llvm-project//mlir:AffineUtils",
@@ -532,27 +533,34 @@
         "@llvm-project//mlir:TensorDialect",
         "@llvm-project//mlir:TilingInterface",
         "@llvm-project//mlir:TransformDialect",
+
         # IR
         "@llvm-project//mlir:IR",
         "@llvm-project//mlir:Parser",
         "@llvm-project//mlir:Pass",
         "@llvm-project//mlir:Rewrite",
+
         # Interfaces
         "@llvm-project//mlir:ControlFlowInterfaces",
 
         # Transforms
+        "@llvm-project//mlir:AffineToStandard",
         "@llvm-project//mlir:AsyncTransforms",
         "@llvm-project//mlir:LinalgTransforms",
-        "@llvm-project//mlir:AffineToStandard",
+        "@llvm-project//mlir:MemRefTransforms",
+        "@llvm-project//mlir:ReconcileUnrealizedCasts",
         "@llvm-project//mlir:SCFTransforms",
         "@llvm-project//mlir:Transforms",
-        "@llvm-project//mlir:ReconcileUnrealizedCasts",
+        "@llvm-project//mlir:VectorToSCF",
+
         # Utils
         "@llvm-project//mlir:ArithUtils",
         "@llvm-project//mlir:DialectUtils",
+
         # Conversions
         "@llvm-project//mlir:AsyncToLLVM",
         "@llvm-project//mlir:FuncToLLVM",
+        "@llvm-project//mlir:IndexToLLVM",
         "@llvm-project//mlir:LinalgToLLVM",
         "@llvm-project//mlir:LinalgToStandard",
         "@llvm-project//mlir:MathToLLVM",
@@ -674,6 +682,7 @@
         "@llvm-project//mlir:AffineDialect",
         "@llvm-project//mlir:ArithDialect",
         "@llvm-project//mlir:AsyncDialect",
+        "@llvm-project//mlir:BufferizationTransformOps",
         "@llvm-project//mlir:ControlFlowDialect",
         "@llvm-project//mlir:FuncDialect",
         "@llvm-project//mlir:IR",
diff --git a/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.td b/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.td
index a0197c5..3d16f0e 100644
--- a/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.td
+++ b/llvm-external-projects/iree-dialects/include/iree-dialects/Dialect/LinalgTransform/StructuredTransformOpsExt.td
@@ -59,17 +59,6 @@
   let hasVerifier = 1;
 }
 
-//===----------------------------------------------------------------------===//
-
-def BufferizeOp : Op<Transform_Dialect, "bufferize",
-    [FunctionalStyleTransformOpTrait,
-     MemoryEffectsOpInterface,
-     DeclareOpInterfaceMethods<TransformOpInterface>]> {
-  let description = [{Indicates that the entire module should be bufferized.}];
-  let assemblyFormat = "attr-dict";
-  let cppNamespace = "mlir::transform_ext";
-}
-
 def LowerToLLVMOp : Op<Transform_Dialect, "lower_to_llvm",
     [FunctionalStyleTransformOpTrait,
      MemoryEffectsOpInterface,
diff --git a/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/CMakeLists.txt b/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/CMakeLists.txt
index 4a5428f..6ec8056 100644
--- a/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/CMakeLists.txt
+++ b/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/CMakeLists.txt
@@ -22,14 +22,17 @@
   MLIRTransformDialect
 
   # Transforms
+  MLIRAffineToStandard
   MLIRAsyncTransforms
   MLIRLinalgTransforms
-  MLIRAffineToStandard
-  MLIRTransforms
+  MLIRMemRefTransforms
   MLIRReconcileUnrealizedCasts
+  MLIRTransforms
+  MLIRVectorToSCF
   
   # Conversions
   MLIRAsyncToLLVM
+  MLIRIndexToLLVM
   MLIRMemRefToLLVM
   MLIRMathToLLVM
   MLIRVectorToLLVM
diff --git a/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp b/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp
index 9a6d66b..53a17f4 100644
--- a/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp
+++ b/llvm-external-projects/iree-dialects/lib/Dialect/LinalgTransform/IR/StructuredTransformOpsExt.cpp
@@ -14,6 +14,7 @@
 #include "mlir/Conversion/AffineToStandard/AffineToStandard.h"
 #include "mlir/Conversion/AsyncToLLVM/AsyncToLLVM.h"
 #include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVMPass.h"
+#include "mlir/Conversion/IndexToLLVM/IndexToLLVM.h"
 #include "mlir/Conversion/LinalgToLLVM/LinalgToLLVM.h"
 #include "mlir/Conversion/LinalgToStandard/LinalgToStandard.h"
 #include "mlir/Conversion/MathToLLVM/MathToLLVM.h"
@@ -21,44 +22,28 @@
 #include "mlir/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.h"
 #include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
 #include "mlir/Conversion/VectorToLLVM/ConvertVectorToLLVM.h"
+#include "mlir/Conversion/VectorToSCF/VectorToSCF.h"
 #include "mlir/Dialect/Affine/IR/AffineOps.h"
 #include "mlir/Dialect/Affine/LoopUtils.h"
 #include "mlir/Dialect/Async/Passes.h"
-#include "mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h"
 #include "mlir/Dialect/Bufferization/IR/Bufferization.h"
-#include "mlir/Dialect/Bufferization/Transforms/Bufferize.h"
-#include "mlir/Dialect/Bufferization/Transforms/OneShotAnalysis.h"
-#include "mlir/Dialect/Bufferization/Transforms/OneShotModuleBufferize.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
 #include "mlir/Dialect/Linalg/Passes.h"
 #include "mlir/Dialect/Linalg/Transforms/Hoisting.h"
 #include "mlir/Dialect/Linalg/Transforms/Transforms.h"
-#include "mlir/Dialect/PDL/IR/PDLTypes.h"
+#include "mlir/Dialect/MemRef/Transforms/Passes.h"
 #include "mlir/Dialect/SCF/Transforms/Transforms.h"
 #include "mlir/Dialect/SCF/Utils/Utils.h"
 #include "mlir/Dialect/Transform/IR/TransformDialect.h"
 #include "mlir/Dialect/Transform/IR/TransformInterfaces.h"
-#include "mlir/Dialect/Utils/StaticValueUtils.h"
-#include "mlir/IR/Builders.h"
-#include "mlir/IR/Diagnostics.h"
-#include "mlir/IR/OpImplementation.h"
-#include "mlir/IR/SymbolTable.h"
-#include "mlir/Interfaces/SideEffectInterfaces.h"
-#include "mlir/Interfaces/TilingInterface.h"
-#include "mlir/Parser/Parser.h"
 #include "mlir/Pass/PassManager.h"
 #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
-#include "mlir/Transforms/InliningUtils.h"
 #include "mlir/Transforms/LoopInvariantCodeMotionUtils.h"
 #include "mlir/Transforms/Passes.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/ScopeExit.h"
-#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/TypeSwitch.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Support/FormatVariadic.h"
 
 #define DEBUG_TYPE "transform-ops-ext"
 #define DBGS() (llvm::dbgs() << "[" DEBUG_TYPE << "]: ")
@@ -949,49 +934,31 @@
 using namespace mlir::linalg;
 
 //===---------------------------------------------------------------------===//
-// BufferizeOp
-//===---------------------------------------------------------------------===//
-
-static void applyBufferizationEnablingTransformations(ModuleOp moduleOp) {
-  RewritePatternSet patterns(moduleOp.getContext());
-  patterns.add<GeneralizePadOpPattern>(moduleOp.getContext());
-  (void)applyPatternsAndFoldGreedily(moduleOp, std::move(patterns));
-}
-
-DiagnosedSilenceableFailure
-transform_ext::BufferizeOp::apply(mlir::transform::TransformResults &result,
-                                  mlir::transform::TransformState &state) {
-  bufferization::OneShotBufferizationOptions options;
-  options.bufferizeFunctionBoundaries = true;
-  options.memCpyFn = [](OpBuilder &builder, Location loc, Value from,
-                        Value to) {
-    return success(linalg::makeMemRefCopyOp(builder, loc, from, to));
-  };
-
-  auto moduleOp = cast<ModuleOp>(state.getTopLevel());
-  applyBufferizationEnablingTransformations(moduleOp);
-  if (failed(runOneShotModuleBufferize(moduleOp, options)))
-    return DiagnosedSilenceableFailure::definiteFailure();
-
-  // Perform buffer-level hoistings.
-  state.getTopLevel()->walk(
-      [&](func::FuncOp funcOp) { hoistRedundantVectorTransfers(funcOp); });
-  return DiagnosedSilenceableFailure::success();
-}
-
-//===---------------------------------------------------------------------===//
 // LowerToLLVMOp
 //===---------------------------------------------------------------------===//
 
 DiagnosedSilenceableFailure
 transform_ext::LowerToLLVMOp::apply(mlir::transform::TransformResults &result,
                                     mlir::transform::TransformState &state) {
+
+  //===------------------------------------------------------------------===//
+  // BEGIN: Copied from upstream, this needs to be retired once we have a
+  // proper upstream transform op.
+  //===------------------------------------------------------------------===//
+
   // TODO: it is feasible to scope lowering at arbitrary level and introduce
   // unrealized casts, but there needs to be the final module-wise cleanup in
   // the end. Keep module-level for now.
   PassManager pm(getContext());
 
+  auto enableOpaquePointers = [](auto options) {
+    options.useOpaquePointers = true;
+    return options;
+  };
+
+  // Blanket-convert any remaining high-level vector ops to loops if any remain.
   pm.addNestedPass<func::FuncOp>(createConvertVectorToSCFPass());
+  // Blanket-convert any remaining linalg ops to loops if any remain.
   pm.addNestedPass<func::FuncOp>(createConvertLinalgToLoopsPass());
   if (getEnableAsync()) {
     pm.addPass(createAsyncToAsyncRuntimePass());
@@ -999,8 +966,14 @@
     pm.addPass(createAsyncRuntimeRefCountingOptPass());
   }
   pm.addPass(createCanonicalizerPass());
+  // Blanket-convert any remaining affine ops if any remain.
   pm.addPass(createLowerAffinePass());
+  // Convert SCF to CF (always needed).
   pm.addPass(createConvertSCFToCFPass());
+  // Sprinkle some cleanups.
+  pm.addPass(createCanonicalizerPass());
+  pm.addPass(createCSEPass());
+  // Blanket-convert any remaining linalg ops to LLVM if any remain.
   pm.addPass(createConvertLinalgToLLVMPass());
   {
     auto options = ConvertVectorToLLVMPassOptions();
@@ -1010,17 +983,36 @@
     options.armSVE = getEnableArmSve();
     options.amx = getEnableAmx();
     options.x86Vector = getEnableX86vector();
+    options.useOpaquePointers = true;
     pm.addPass(createConvertVectorToLLVMPass(options));
   }
+  // Convert Math to LLVM (always needed).
   pm.addNestedPass<func::FuncOp>(createConvertMathToLLVMPass());
-  pm.addPass(createFinalizeMemRefToLLVMConversionPass());
+  // Expand complicated MemRef operations before lowering them.
+  pm.addPass(memref::createExpandStridedMetadataPass());
+  // The expansion may create affine expressions. Get rid of them.
+  pm.addPass(createLowerAffinePass());
+  // Convert MemRef to LLVM (always needed).
+  pm.addPass(createFinalizeMemRefToLLVMConversionPass(
+      enableOpaquePointers(FinalizeMemRefToLLVMConversionPassOptions{})));
   if (getEnableAsync())
     pm.addPass(createConvertAsyncToLLVMPass());
-  pm.addPass(createConvertFuncToLLVMPass());
+  // Convert Func to LLVM (always needed).
+  pm.addPass(createConvertFuncToLLVMPass(
+      enableOpaquePointers(ConvertFuncToLLVMPassOptions{})));
+  // Convert Index to LLVM (always needed).
+  pm.addPass(createConvertIndexToLLVMPass());
+  // Convert remaining unrealized_casts (always needed).
   pm.addPass(createReconcileUnrealizedCastsPass());
+
   if (failed(pm.run(state.getTopLevel())))
     return DiagnosedSilenceableFailure::definiteFailure();
 
+  //===------------------------------------------------------------------===//
+  // END: Copied from upstream, this needs to be retired once we have a
+  // proper upstream transform op.
+  //===------------------------------------------------------------------===//
+
   // Make all arguments noalias for now.
   // FIXME: this is a terrible hack!
   state.getTopLevel()->walk([](LLVM::LLVMFuncOp funcOp) {
diff --git a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/bufferize.mlir b/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/bufferize.mlir
deleted file mode 100644
index 5f4e74e..0000000
--- a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/bufferize.mlir
+++ /dev/null
@@ -1,24 +0,0 @@
-// RUN: iree-dialects-opt --transform-dialect-interpreter %s | FileCheck %s
-
-// CHECK-LABEL: func.func @matmul_tensors(
-// CHECK-SAME:    %[[TA:[0-9a-z]+]]: memref<128x128xf32
-// CHECK-SAME:    %[[TB:[0-9a-z]+]]: memref<128x128xf32
-// CHECK-SAME:    %[[TC:[0-9a-z]+]]: memref<128x128xf32
-// CHECK-NOT:   -> tensor
-func.func @matmul_tensors(
-  %arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32>, %arg2: tensor<128x128xf32> { linalg.inplaceable = true})
-    -> tensor<128x128xf32> {
-  // CHECK: linalg.matmul ins(%[[TA]], %[[TB]] : memref{{.*}}, memref{{.*}} outs(%[[TC]] : memref{{.*}})
-  %0 = linalg.matmul  ins(%arg0, %arg1: tensor<128x128xf32>, tensor<128x128xf32>)
-                     outs(%arg2: tensor<128x128xf32>)
-    -> tensor<128x128xf32>
-
-  // CHECK: return %[[TC]]
-  return %0 : tensor<128x128xf32>
-// CHECK: }
-}
-
-transform.structured.canonicalized_sequence failures(propagate) {
-^bb1(%arg1: !pdl.operation):
-  bufferize
-}
diff --git a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/expert.mlir b/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/expert.mlir
deleted file mode 100644
index 3dc056c..0000000
--- a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/expert.mlir
+++ /dev/null
@@ -1,168 +0,0 @@
-// _UN: iree-dialects-opt --linalg-transform-expert-expansion --split-input-file %s | FileCheck %s --check-prefix=EXPAND
-// _UN: iree-dialects-opt --linalg-transform-expert-expansion --linalg-interp-transforms --split-input-file %s | FileCheck %s
-// RUN: true
-
-// CHECK-LABEL: func.func @matmul_tensors
-// CHECK-NOT: linalg
-// CHECK: llvm
-func.func @matmul_tensors(
-  %arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32>, %arg2: tensor<128x128xf32> { linalg.inplaceable = true})
-    -> tensor<128x128xf32> {
-  %0 = linalg.matmul  ins(%arg0, %arg1: tensor<128x128xf32>, tensor<128x128xf32>)
-                     outs(%arg2: tensor<128x128xf32>)
-    -> tensor<128x128xf32>
-
-  return %0 : tensor<128x128xf32>
-}
-
-pdl.pattern @pdl_target : benefit(1) {
-  %args = operands
-  %results = types
-  %0 = operation "linalg.matmul"(%args : !pdl.range<value>) -> (%results : !pdl.range<type>)
-  %1 = pdl.attribute = @matmul_tensors
-  apply_native_constraint "nestedInFunc"(%0, %1 : !pdl.operation, !pdl.attribute)
-  // TODO: we don't want this, but it is the required terminator for pdl.pattern
-  rewrite %0 with "iree_linalg_transform.apply"
-}
-
-iree_linalg_transform.sequence {
-  // This should match the strategy below.
-  // EXPAND-NOT: expert apply
-  // EXPAND: %[[OP:.*]] = match @pdl_target
-  // EXPAND: %[[HANDLE:.*]], %{{.*}}:3 = tile %[[OP]] {sizes = [4, 4, 4]}
-  // EXPAND: %[[HANDLE2:.*]] = vectorize %[[HANDLE]] vectorize_padding
-  // EXPAND: bufferize
-  // EXPAND: lower_vectors {multireduction_lowering = "innerreduce"}
-  // EXPAND: lower_to_llvm
-  %0 = match @pdl_target
-  expert apply "single_tiling" to %0
-  {
-    tile_sizes = [4, 4, 4],
-    vectorize_padding = true,
-    multireduction_lowering = "innerreduce"
-  }
-}
-
-// CHECK-NOT: @strategies
-// EXPAND-NOT: @strategies
-module @strategies {
-  pdl.pattern @single_tiling_matcher : benefit(1) {
-    %tile_sizes = attribute
-    %vectorize_padding = attribute
-    %multireduction_lowering = attribute
-    %name = attribute : "single_tiling"
-    %type = type : !pdl.operation
-    %target = operand : %type
-    %transformed = type
-    %root = operation "iree_linalg_transform.expert"(%target : !pdl.value) {
-      "expertName" = %name,
-      "tile_sizes" = %tile_sizes,
-      "vectorize_padding" = %vectorize_padding,
-      "multireduction_lowering" = %multireduction_lowering
-    } -> (%transformed : !pdl.type)
-
-    rewrite %root {
-      %tile = operation "iree_linalg_transform.tile"(%target : !pdl.value) {
-        "sizes" = %tile_sizes
-      } -> (%transformed, %transformed, %transformed, %transformed : !pdl.type, !pdl.type, !pdl.type, !pdl.type)
-      %handle = result 0 of %tile
-
-      %vectorize = operation "iree_linalg_transform.vectorize"(%handle : !pdl.value) {
-        "vectorize_padding" = %vectorize_padding
-      } -> (%transformed : !pdl.type)
-      %handle2 = result 0 of %vectorize
-
-      %bufferize = operation "iree_linalg_transform.bufferize"
-      %lower_vectors = operation "iree_linalg_transform.lower_vectors" {
-        "multireduction_lowering" = %multireduction_lowering
-      }
-      %lower_to_llvm = operation "iree_linalg_transform.lower_to_llvm"
-
-      replace %root with (%handle2 : !pdl.value)
-    }
-  }
-}
-
-// -----
-
-// CHECK-LABEL: func.func @matmul_tensors2
-// CHECK-NOT: linalg
-// CHECK: llvm
-func.func @matmul_tensors2(
-  %arg0: tensor<128x128xf32>, %arg1: tensor<128x128xf32>, %arg2: tensor<128x128xf32> { linalg.inplaceable = true})
-    -> tensor<128x128xf32> {
-  %0 = linalg.matmul  ins(%arg0, %arg1: tensor<128x128xf32>, tensor<128x128xf32>)
-                     outs(%arg2: tensor<128x128xf32>)
-    -> tensor<128x128xf32>
-
-  return %0 : tensor<128x128xf32>
-}
-
-pdl.pattern @pdl_target2 : benefit(1) {
-  %args = pdl.operands
-  %results = pdl.types
-  %0 = pdl.operation "linalg.matmul"(%args : !pdl.range<value>) -> (%results : !pdl.range<type>)
-  %1 = pdl.attribute = @matmul_tensors2
-  apply_native_constraint "nestedInFunc"(%0, %1 : !pdl.operation, !pdl.attribute)
-  // TODO: we don't want this, but it is the required terminator for pdl.pattern
-  pdl.rewrite %0 with "iree_linalg_transform.apply"
-}
-
-iree_linalg_transform.sequence {
-  // This should match the strategy below.
-  // EXPAND-NOT: expert apply
-  // EXPAND: %[[OP:.*]] = match @pdl_target2
-  // EXPAND: %[[HANDLE:.*]], %{{.*}}:3 = tile %[[OP]] {sizes = [32, 8, 8]}
-  // EXPAND: %[[HANDLE2:.*]], %{{.*}}:3 = tile %[[HANDLE]] {sizes = [4, 4, 4]}
-  // EXPAND: %[[HANDLE3:.*]] = vectorize %[[HANDLE2]]
-  // EXPAND-NOT: vectorize_padding
-  // EXPAND: bufferize
-  // EXPAND: lower_vectors {multireduction_lowering = "innerparallel"}
-  // EXPAND: lower_to_llvm
-  %0 = match @pdl_target2
-  %1, %loops:3 = tile %0 {sizes = [32, 8, 8]}
-  expert apply "single_tiling" to %1
-  {
-    tile_sizes = [4, 4, 4],
-    vectorize_padding = false,
-    multireduction_lowering = "innerparallel"
-  }
-}
-
-module @strategies {
-  pdl.pattern @single_tiling_operand : benefit(1) {
-    %tile_sizes = attribute
-    %vectorize_padding = attribute
-    %multireduction_lowering = attribute
-    %name = attribute : "single_tiling"
-    %type = type : !pdl.operation
-    %target = operand : %type
-    %transformed = type
-    %root = operation "iree_linalg_transform.expert"(%target : !pdl.value) {
-      "expertName" = %name,
-      "tile_sizes" = %tile_sizes,
-      "vectorize_padding" = %vectorize_padding,
-      "multireduction_lowering" = %multireduction_lowering
-    } -> (%transformed : !pdl.type)
-
-    rewrite %root {
-      %tile = operation "iree_linalg_transform.tile"(%target : !pdl.value)  {
-        "sizes" = %tile_sizes
-      } -> (%transformed, %transformed, %transformed, %transformed : !pdl.type, !pdl.type, !pdl.type, !pdl.type)
-      %handle = result 0 of %tile
-
-      %vectorize = operation "iree_linalg_transform.vectorize"(%handle : !pdl.value) {
-        "vectorize_padding" = %vectorize_padding
-      } -> (%transformed : !pdl.type)
-      %handle2 = result 0 of %vectorize
-
-      %bufferize = operation "iree_linalg_transform.bufferize"
-      %lower_vectors = operation "iree_linalg_transform.lower_vectors" {
-        "multireduction_lowering" = %multireduction_lowering
-      }
-      %lower_to_llvm = operation "iree_linalg_transform.lower_to_llvm"
-
-      replace %root with (%handle2 : !pdl.value)
-    }
-  }
-}
diff --git a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/roundtrip.mlir b/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/roundtrip.mlir
index e4f0d12..01a22ea 100644
--- a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/roundtrip.mlir
+++ b/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/roundtrip.mlir
@@ -19,8 +19,6 @@
   %5 = pdl_match @match2 in %arg0 : (!pdl.operation) -> !pdl.operation
   // CHECK: transform.structured.vectorize %[[OPS2]]
   transform.structured.vectorize %5
-  // CHECK: bufferize
-  bufferize
   // CHECK: %[[FUNC:.*]] = transform.structured.match ops{["func.func"]} in %arg0
   // CHECK: lower_vectors %[[FUNC]] {{.*}} multireduction_lowering = innerreduction
   %6 = transform.structured.match ops{["func.func"]} in %arg0 : (!pdl.operation) -> !pdl.operation
diff --git a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/single-tiling-full-script.mlir b/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/single-tiling-full-script.mlir
index 62b962f..09dc29d 100644
--- a/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/single-tiling-full-script.mlir
+++ b/llvm-external-projects/iree-dialects/test/Dialect/linalg_transform/single-tiling-full-script.mlir
@@ -13,6 +13,7 @@
   return %0 : tensor<128x128xf32>
 }
 
+
 transform.structured.canonicalized_sequence failures(propagate) {
 ^bb1(%module_op: !pdl.operation):
   %0 = transform.structured.match ops{["linalg.matmul"]} in %module_op : (!pdl.operation) -> !pdl.operation
@@ -20,8 +21,13 @@
       : (!pdl.operation) -> (!pdl.operation, !pdl.operation, !pdl.operation, !pdl.operation)
   %2 = get_closest_isolated_parent %1 : (!pdl.operation) -> !pdl.operation
   transform.structured.vectorize %2 { vectorize_padding }
-  bufferize
-  %3 = transform.structured.match ops{["func.func"]} in %module_op : (!pdl.operation) -> !pdl.operation
+  transform.bufferization.one_shot_bufferize layout{IdentityLayoutMap} %module_op
+    {bufferize_function_boundaries = true}
+  %3 = transform.structured.match ops{["func.func"]} in %module_op 
+    : (!pdl.operation) -> !pdl.operation
   transform.vector.lower_vectors %3 multireduction_lowering = "innerreduction"
+
+  // lower_to_llvm is the only remaining op not upstreamed, at the same time we
+  // upstreamed --test-lower-to-llvm.
   lower_to_llvm
 }
diff --git a/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/CMakeLists.txt b/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/CMakeLists.txt
index 65c0bf5..bc3f639 100644
--- a/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/CMakeLists.txt
+++ b/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/CMakeLists.txt
@@ -13,9 +13,11 @@
   MLIRAffineDialect
   MLIRArithDialect
   MLIRAsyncDialect
+  MLIRBufferizationTransformOps
   MLIRControlFlowDialect
   MLIRDialect
   MLIRFuncDialect
+  MLIRIndexToLLVM
   MLIRLinalgDialect
   MLIRLinalgTransformOps
   MLIRMemRefDialect
diff --git a/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/iree-dialects-opt.cpp b/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/iree-dialects-opt.cpp
index d4d8826..91cb22f 100644
--- a/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/iree-dialects-opt.cpp
+++ b/llvm-external-projects/iree-dialects/tools/iree-dialects-opt/iree-dialects-opt.cpp
@@ -33,6 +33,7 @@
 #include "mlir/IR/Dialect.h"
 #include "mlir/Tools/mlir-opt/MlirOptMain.h"
 #include "mlir/Transforms/Passes.h"
+#include <mlir/Dialect/Bufferization/TransformOps/BufferizationTransformOps.h>
 
 using namespace mlir;
 namespace IREE = mlir::iree_compiler::IREE;
@@ -91,6 +92,7 @@
 
   registry.addExtensions<IREE::LinalgExt::LinalgExtTransformOpsExtension,
                          transform_ext::StructuredTransformOpsExtension>();
+  mlir::bufferization::registerTransformDialectExtension(registry);
   mlir::linalg::registerTransformDialectExtension(registry);
   mlir::scf::registerTransformDialectExtension(registry);
   mlir::vector::registerTransformDialectExtension(registry);