//===- EmptyOpPatterns.cpp - Patterns related to tensor.empty folding ----===// // // 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 // //===----------------------------------------------------------------------===// // #include "mlir/Dialect/Tensor/IR/Tensor.h" #include "mlir/Dialect/Tensor/Transforms/Transforms.h" #include "mlir/IR/PatternMatch.h" #include "llvm/Support/Debug.h" usingnamespacemlir; usingnamespacemlir::tensor; namespace { template <typename ReshapeOp> struct FoldEmptyTensorWithReshapeOp : public OpRewritePattern<ReshapeOp> { … }; /// tensor.empty does not define any tensor contents, so a slice of a /// tensor.empty can be folded to a smaller tensor.empty. struct FoldEmptyTensorWithExtractSliceOp : public OpRewritePattern<ExtractSliceOp> { … }; /// tensor.empty does not define any tensor contents, so an unpadded pack /// can be folded away. struct FoldEmptyTensorWithPackOp : public OpRewritePattern<PackOp> { … }; /// tensor.empty does not define any tensor contents, so an unpack /// can be folded away. struct FoldEmptyTensorWithUnPackOp : public OpRewritePattern<UnPackOp> { … }; // Fold concat operation where all the operands are empty. struct FoldConcatsOfEmpty : public OpRewritePattern<ConcatOp> { … }; } // namespace void mlir::tensor::populateFoldTensorEmptyPatterns(RewritePatternSet &patterns, bool foldSingleUseOnly) { … }