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.
93 lines
3.2 KiB
TableGen
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
|