//===- StdExpandDivs.cpp - Code to prepare Std for lowering Divs to LLVM -===// // // 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 // //===----------------------------------------------------------------------===// // // This file Std transformations to expand Divs operation to help for the // lowering to LLVM. Currently implemented transformations are Ceil and Floor // for Signed Integers. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/MemRef/Transforms/Passes.h" #include "mlir/Dialect/Arith/IR/Arith.h" #include "mlir/Dialect/Arith/Transforms/Passes.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/Dialect/MemRef/Transforms/Transforms.h" #include "mlir/IR/TypeUtilities.h" #include "mlir/Transforms/DialectConversion.h" #include "llvm/ADT/STLExtras.h" namespace mlir { namespace memref { #define GEN_PASS_DEF_EXPANDOPS #include "mlir/Dialect/MemRef/Transforms/Passes.h.inc" } // namespace memref } // namespace mlir usingnamespacemlir; namespace { /// Converts `atomic_rmw` that cannot be lowered to a simple atomic op with /// AtomicRMWOpLowering pattern, such as minimum and maximum operations for /// floating-point numbers, to `memref.generic_atomic_rmw` with the expanded /// code. /// /// %x = atomic_rmw maximumf %fval, %F[%i] : (f32, memref<10xf32>) -> f32 /// /// will be lowered to /// /// %x = memref.generic_atomic_rmw %F[%i] : memref<10xf32> { /// ^bb0(%current: f32): /// %1 = arith.maximumf %current, %fval : f32 /// memref.atomic_yield %1 : f32 /// } struct AtomicRMWOpConverter : public OpRewritePattern<memref::AtomicRMWOp> { … }; /// Converts `memref.reshape` that has a target shape of a statically-known /// size to `memref.reinterpret_cast`. struct MemRefReshapeOpConverter : public OpRewritePattern<memref::ReshapeOp> { … }; struct ExpandOpsPass : public memref::impl::ExpandOpsBase<ExpandOpsPass> { … }; } // namespace void mlir::memref::populateExpandOpsPatterns(RewritePatternSet &patterns) { … } std::unique_ptr<Pass> mlir::memref::createExpandOpsPass() { … }