brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · a1e3f10 Raw
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