58 lines · cpp
1//===- TestDataLayoutPropagation.cpp --------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6 7#include "mlir/Dialect/Affine/IR/AffineOps.h"8#include "mlir/Dialect/Linalg/Transforms/Transforms.h"9#include "mlir/Pass/Pass.h"10#include "mlir/Pass/PassManager.h"11#include "mlir/Transforms/GreedyPatternRewriteDriver.h"12 13using namespace mlir;14 15namespace {16struct TestDataLayoutPropagationPass17 : public PassWrapper<TestDataLayoutPropagationPass, OperationPass<>> {18 MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestDataLayoutPropagationPass)19 20 void getDependentDialects(DialectRegistry ®istry) const override {21 registry.insert<affine::AffineDialect, linalg::LinalgDialect,22 tensor::TensorDialect>();23 }24 25 StringRef getArgument() const final {26 return "test-linalg-data-layout-propagation";27 }28 StringRef getDescription() const final {29 return "Test data layout propagation";30 }31 32 void runOnOperation() override {33 MLIRContext *context = &getContext();34 RewritePatternSet patterns(context);35 linalg::populateDataLayoutPropagationPatterns(36 patterns, [](OpOperand *opOperand) { return true; },37 /*poisonPaddingOk=*/true);38 linalg::ControlPropagationFn controlExtract =39 [](OpOperand *opOperand) -> bool {40 Operation *producer = opOperand->get().getDefiningOp();41 Operation *consumer = opOperand->getOwner();42 return consumer->getBlock() == producer->getBlock();43 };44 linalg::populateExtractSliceSinkingPatterns(patterns, controlExtract);45 if (failed(applyPatternsGreedily(getOperation(), std::move(patterns))))46 return signalPassFailure();47 }48};49} // namespace50 51namespace mlir {52namespace test {53void registerTestDataLayoutPropagation() {54 PassRegistration<TestDataLayoutPropagationPass>();55}56} // namespace test57} // namespace mlir58