This patch fixes a bug discovered in the
`affine::makeComposedFoldedAffineApply` function when `composeAffineMin
== true`. The bug happened because the simplification assumed the
symbols appearing in the `affine.apply` op corresponded to symbols in
the `affine.min` op, and that's not always the case. For example:
```mlir
#map = affine_map<()[s0, s1] -> (s1)>
#map1 = affine_map<()[s0, s1] -> (s0 ceildiv s1)>
module {
func.func @min_max_full_simplify() -> index {
%0 = test.value_with_bounds {max = 64 : index, min = 32 : index}
%1 = test.value_with_bounds {max = 64 : index, min = 32 : index}
%2 = affine.min #map()[%0, %1]
%3 = affine.apply #map1()[%2, %0]
return %3 : index
}
}
```
This patch also introduces the test `make_composed_folded_affine_apply`
transform operation to test this simplification. It also adds tests
ensuring we get correct behavior.
---------
Co-authored-by: Nicolas Vasilache <nico.vasilache@amd.com>
91 lines
3.1 KiB
TableGen
91 lines
3.1 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 on operation before another operation.
|
|
}];
|
|
|
|
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
|