brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · e7cbee6 Raw
71 lines · cpp
1//===- ArithDialect.cpp - MLIR Arith dialect implementation -----===//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/Arith/IR/Arith.h"12#include "mlir/Dialect/Bufferization/IR/BufferDeallocationOpInterface.h"13#include "mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h"14#include "mlir/Dialect/UB/IR/UBOps.h"15#include "mlir/IR/Builders.h"16#include "mlir/IR/DialectImplementation.h"17#include "mlir/Interfaces/ValueBoundsOpInterface.h"18#include "mlir/Transforms/InliningUtils.h"19#include "llvm/ADT/TypeSwitch.h"20 21using namespace mlir;22using namespace mlir::arith;23 24#include "mlir/Dialect/Arith/IR/ArithOpsDialect.cpp.inc"25#include "mlir/Dialect/Arith/IR/ArithOpsInterfaces.cpp.inc"26#define GET_ATTRDEF_CLASSES27#include "mlir/Dialect/Arith/IR/ArithOpsAttributes.cpp.inc"28 29namespace {30/// This class defines the interface for handling inlining for arithmetic31/// dialect operations.32struct ArithInlinerInterface : public DialectInlinerInterface {33  using DialectInlinerInterface::DialectInlinerInterface;34 35  /// All arithmetic dialect ops can be inlined.36  bool isLegalToInline(Operation *, Region *, bool, IRMapping &) const final {37    return true;38  }39};40} // namespace41 42void arith::ArithDialect::initialize() {43  addOperations<44#define GET_OP_LIST45#include "mlir/Dialect/Arith/IR/ArithOps.cpp.inc"46      >();47  addAttributes<48#define GET_ATTRDEF_LIST49#include "mlir/Dialect/Arith/IR/ArithOpsAttributes.cpp.inc"50      >();51  addInterfaces<ArithInlinerInterface>();52  declarePromisedInterface<ConvertToEmitCPatternInterface, ArithDialect>();53  declarePromisedInterface<ConvertToLLVMPatternInterface, ArithDialect>();54  declarePromisedInterface<bufferization::BufferDeallocationOpInterface,55                           SelectOp>();56  declarePromisedInterfaces<bufferization::BufferizableOpInterface, ConstantOp,57                            IndexCastOp, SelectOp>();58  declarePromisedInterfaces<ValueBoundsOpInterface, AddIOp, ConstantOp, SubIOp,59                            MulIOp>();60}61 62/// Materialize an integer or floating point constant.63Operation *arith::ArithDialect::materializeConstant(OpBuilder &builder,64                                                    Attribute value, Type type,65                                                    Location loc) {66  if (auto poison = dyn_cast<ub::PoisonAttr>(value))67    return ub::PoisonOp::create(builder, loc, type, poison);68 69  return ConstantOp::materialize(builder, value, type, loc);70}71