79 lines · cpp
1//===----------------------------------------------------------------------===//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//===----------------------------------------------------------------------===//8 9#include "mlir/Conversion/ConvertToEmitC/ToEmitCInterface.h"10#include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"11#include "mlir/Dialect/Bufferization/IR/AllocationOpInterface.h"12#include "mlir/Dialect/MemRef/IR/MemRef.h"13#include "mlir/Dialect/UB/IR/UBOps.h"14#include "mlir/IR/BuiltinTypes.h"15#include "mlir/Interfaces/MemorySlotInterfaces.h"16#include "mlir/Interfaces/RuntimeVerifiableOpInterface.h"17#include "mlir/Interfaces/SideEffectInterfaces.h"18#include "mlir/Interfaces/ValueBoundsOpInterface.h"19#include "mlir/Transforms/InliningUtils.h"20#include <optional>21 22using namespace mlir;23using namespace mlir::memref;24 25#include "mlir/Dialect/MemRef/IR/MemRefOpsDialect.cpp.inc"26 27//===----------------------------------------------------------------------===//28// MemRefDialect Dialect Interfaces29//===----------------------------------------------------------------------===//30 31namespace {32struct MemRefInlinerInterface : public DialectInlinerInterface {33 using DialectInlinerInterface::DialectInlinerInterface;34 bool isLegalToInline(Region *dest, Region *src, bool wouldBeCloned,35 IRMapping &valueMapping) const final {36 return true;37 }38 bool isLegalToInline(Operation *, Region *, bool wouldBeCloned,39 IRMapping &) const final {40 return true;41 }42};43} // namespace44 45void mlir::memref::MemRefDialect::initialize() {46 addOperations<47#define GET_OP_LIST48#include "mlir/Dialect/MemRef/IR/MemRefOps.cpp.inc"49 >();50 addInterfaces<MemRefInlinerInterface>();51 declarePromisedInterface<ConvertToEmitCPatternInterface, MemRefDialect>();52 declarePromisedInterface<ConvertToLLVMPatternInterface, MemRefDialect>();53 declarePromisedInterfaces<bufferization::AllocationOpInterface, AllocOp,54 AllocaOp, ReallocOp>();55 declarePromisedInterfaces<RuntimeVerifiableOpInterface, AssumeAlignmentOp,56 AtomicRMWOp, CastOp, CopyOp, DimOp, ExpandShapeOp,57 GenericAtomicRMWOp, LoadOp, StoreOp, SubViewOp>();58 declarePromisedInterfaces<ValueBoundsOpInterface, AllocOp, AllocaOp, CastOp,59 DimOp, GetGlobalOp, RankOp, SubViewOp>();60 declarePromisedInterface<DestructurableTypeInterface, MemRefType>();61}62 63/// Finds the unique dealloc operation (if one exists) for `allocValue`.64std::optional<Operation *> mlir::memref::findDealloc(Value allocValue) {65 Operation *dealloc = nullptr;66 for (Operation *user : allocValue.getUsers()) {67 if (!hasEffect<MemoryEffects::Free>(user, allocValue))68 continue;69 // If we found a realloc instead of dealloc, return std::nullopt.70 if (isa<memref::ReallocOp>(user))71 return std::nullopt;72 // If we found > 1 dealloc, return std::nullopt.73 if (dealloc)74 return std::nullopt;75 dealloc = user;76 }77 return dealloc;78}79