The MLIR classes Type/Attribute/Operation/Op/Value support cast/dyn_cast/isa/dyn_cast_or_null functionality through llvm's doCast functionality in addition to defining methods with the same name. This change continues the migration of uses of the method to the corresponding function call as has been decided as more consistent. This commit attempts to update all occurrences of the casts in .td files, although it is likely that a couple were missed. Context: - https://mlir.llvm.org/deprecation/ at "Use the free function variants for dyn_cast/cast/isa/…" - Original discussion at https://discourse.llvm.org/t/preferred-casting-style-going-forward/68443 Implementation: Unfortunatley, this was not automated, but was handled by mindlessly going to next occurrences of patterns, selecting the piece of code to be moved into the function call, and running a vim macro over the span of around 4 hours. Differential Revision: https://reviews.llvm.org/D150199
53 lines
1.7 KiB
TableGen
53 lines
1.7 KiB
TableGen
include "mlir/IR/PatternBase.td"
|
|
include "mlir/Dialect/Shape/IR/ShapeOps.td"
|
|
include "mlir/Dialect/Tensor/IR/TensorOps.td"
|
|
|
|
def AllInputShapesEq : Constraint<CPred< [{
|
|
llvm::all_equal($0)
|
|
}]>>;
|
|
|
|
def HasSingleElement : Constraint<CPred< [{
|
|
$0.size() == 1
|
|
}]>>;
|
|
|
|
def HasStaticShape : Constraint<CPred< [{
|
|
::llvm::dyn_cast<ShapedType>($0.getType()).hasStaticShape()
|
|
}]>>;
|
|
|
|
// Helper that takes the first element of a range.
|
|
def TakeFront : NativeCodeCall<"$0.front()">;
|
|
|
|
// Canonicalization patterns.
|
|
|
|
def AssumingAllOneOp : Pat<(Shape_AssumingAllOp $args),
|
|
(replaceWithValue $args),
|
|
[(HasSingleElement $args)]>;
|
|
|
|
def CstrBroadcastableEqOps : Pat<(Shape_CstrBroadcastableOp:$op $shapes),
|
|
(Shape_ConstWitnessOp ConstBoolAttrTrue),
|
|
[(AllInputShapesEq $shapes)]>;
|
|
|
|
def CstrEqEqOps : Pat<(Shape_CstrEqOp:$op $shapes),
|
|
(Shape_ConstWitnessOp ConstBoolAttrTrue),
|
|
[(AllInputShapesEq $shapes)]>;
|
|
|
|
def IndexToSizeToIndexCanonicalization : Pat<
|
|
(Shape_SizeToIndexOp (Shape_IndexToSizeOp $arg)),
|
|
(replaceWithValue $arg)>;
|
|
|
|
def SizeToIndexToSizeCanonicalization : Pat<
|
|
(Shape_IndexToSizeOp (Shape_SizeToIndexOp $arg)),
|
|
(replaceWithValue $arg)>;
|
|
|
|
// Fold tensor.cast(const_shape) to const_shape. This changes the type of
|
|
// const_shape to the destination type of the cast.
|
|
def TensorCastConstShape : Pat <
|
|
(Tensor_CastOp:$res (Shape_ConstShapeOp $arg)), (Shape_ConstShapeOp $arg),
|
|
[(HasStaticShape $res)]>;
|
|
|
|
// tensor.extract from shape_of -> tensor.dim. We can take the first index
|
|
// because shape_of always returns a 1D tensor.
|
|
def ExtractFromShapeOfExtentTensor : Pat<
|
|
(Tensor_ExtractOp (Shape_ShapeOfOp $arg), $indices),
|
|
(Tensor_DimOp $arg, (TakeFront $indices))>;
|