Files
llvm-project/mlir/test/lib/Transforms/TestTransformsOps.td
Quinn Dawkins bb17dfa7d1 [mlir][bufferization] Enable moving dependent values in eliminate-empty-tensors (#169718)
Currently empty tensor elimination by constructing a SubsetExtractionOp
to match a SubsetInsertionOp at the end of a DPS chain will fail if any
operands required by the insertion op don't dominate the insertion point
for the extraction op.

This change improves the transformation by attempting to move all pure
producers of required operands to the insertion point of the extraction
op. In the process this improves a number of tests for empty tensor
elimination.
2025-12-05 14:40:08 -05:00

93 lines
3.2 KiB
TableGen

//===- TestTransformOps.td ---------------------------------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef TEST_TRANSFORM_OPS
#define TEST_TRANSFORM_OPS
include "mlir/Dialect/Transform/IR/TransformDialect.td"
include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.td"
include "mlir/Dialect/Transform/IR/TransformTypes.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
include "mlir/IR/OpBase.td"
/// Transform dialect operations for testing transformations in MLIR
def TestMoveOperandDeps :
Op<Transform_Dialect, "test.move_operand_deps",
[FunctionalStyleTransformOpTrait, MemoryEffectsOpInterface,
DeclareOpInterfaceMethods<TransformOpInterface>,
ReportTrackingListenerFailuresOpTrait]> {
let description = [{
Moves all dependencies of on operation before another operation.
}];
let arguments =
(ins TransformHandleTypeInterface:$op,
TransformHandleTypeInterface:$insertion_point);
let results = (outs);
let assemblyFormat = [{
$op `before` $insertion_point attr-dict
`:` type($op) `,` type($insertion_point)
}];
}
def TestMoveValueDefns :
Op<Transform_Dialect, "test.move_value_defns",
[FunctionalStyleTransformOpTrait, MemoryEffectsOpInterface,
DeclareOpInterfaceMethods<TransformOpInterface>,
ReportTrackingListenerFailuresOpTrait]> {
let description = [{
Moves all dependencies of a list of values before another operation.
Only pure operations are moved. If there is a side effecting op in the
dependency chain no operations are moved.
}];
let arguments =
(ins Variadic<TransformValueHandleTypeInterface>:$values,
TransformHandleTypeInterface:$insertion_point);
let results = (outs);
let assemblyFormat = [{
$values `before` $insertion_point attr-dict
`:` `(` type($values) `)` `` `,` type($insertion_point)
}];
}
//===----------------------------------------------------------------------===//
// Test affine functionality.
//===----------------------------------------------------------------------===//
def TestMakeComposedFoldedAffineApply :
Op<Transform_Dialect, "test.make_composed_folded_affine_apply",
[FunctionalStyleTransformOpTrait,
MemoryEffectsOpInterface,
TransformOpInterface,
TransformEachOpTrait,
ReportTrackingListenerFailuresOpTrait]> {
let description = [{
Rewrite an affine_apply by using the makeComposedFoldedAffineApply API.
}];
let arguments = (ins TransformHandleTypeInterface:$op);
let results = (outs TransformHandleTypeInterface:$composed);
let assemblyFormat = [{
$op attr-dict `:` functional-type(operands, results)
}];
let extraClassDeclaration = [{
::mlir::DiagnosedSilenceableFailure applyToOne(
::mlir::transform::TransformRewriter &rewriter,
::mlir::affine::AffineApplyOp affineApplyOp,
::mlir::transform::ApplyToEachResultList &results,
::mlir::transform::TransformState &state);
}];
}
#endif // TEST_TRANSFORM_OPS