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);