brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · dfc1054 Raw
98 lines · c
1//===- AffineExprDetail.h - MLIR Affine Expr storage details ----*- C++ -*-===//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// This holds implementation details of AffineExpr. Ideally it would not be10// exposed and would be kept local to AffineExpr.cpp however, MLIRContext.cpp11// needs to know the sizes for placement-new style Allocation.12//13//===----------------------------------------------------------------------===//14#ifndef MLIR_IR_AFFINEEXPRDETAIL_H_15#define MLIR_IR_AFFINEEXPRDETAIL_H_16 17#include "mlir/IR/AffineExpr.h"18#include "mlir/IR/MLIRContext.h"19#include "mlir/Support/StorageUniquer.h"20 21namespace mlir {22 23class MLIRContext;24 25namespace detail {26 27/// Base storage class appearing in an affine expression.28struct AffineExprStorage : public StorageUniquer::BaseStorage {29  MLIRContext *context;30  AffineExprKind kind;31};32 33/// A binary operation appearing in an affine expression.34struct AffineBinaryOpExprStorage : public AffineExprStorage {35  using KeyTy = std::tuple<unsigned, AffineExpr, AffineExpr>;36 37  bool operator==(const KeyTy &key) const {38    return static_cast<AffineExprKind>(std::get<0>(key)) == kind &&39           std::get<1>(key) == lhs && std::get<2>(key) == rhs;40  }41 42  static AffineBinaryOpExprStorage *43  construct(StorageUniquer::StorageAllocator &allocator, const KeyTy &key) {44    auto *result = allocator.allocate<AffineBinaryOpExprStorage>();45    result->kind = static_cast<AffineExprKind>(std::get<0>(key));46    result->lhs = std::get<1>(key);47    result->rhs = std::get<2>(key);48    result->context = result->lhs.getContext();49    return result;50  }51 52  AffineExpr lhs;53  AffineExpr rhs;54};55 56/// A dimensional or symbolic identifier appearing in an affine expression.57struct AffineDimExprStorage : public AffineExprStorage {58  using KeyTy = std::pair<unsigned, unsigned>;59 60  bool operator==(const KeyTy &key) const {61    return kind == static_cast<AffineExprKind>(key.first) &&62           position == key.second;63  }64 65  static AffineDimExprStorage *66  construct(StorageUniquer::StorageAllocator &allocator, const KeyTy &key) {67    auto *result = allocator.allocate<AffineDimExprStorage>();68    result->kind = static_cast<AffineExprKind>(key.first);69    result->position = key.second;70    return result;71  }72 73  /// Position of this identifier in the argument list.74  unsigned position;75};76 77/// An integer constant appearing in affine expression.78struct AffineConstantExprStorage : public AffineExprStorage {79  using KeyTy = int64_t;80 81  bool operator==(const KeyTy &key) const { return constant == key; }82 83  static AffineConstantExprStorage *84  construct(StorageUniquer::StorageAllocator &allocator, const KeyTy &key) {85    auto *result = allocator.allocate<AffineConstantExprStorage>();86    result->kind = AffineExprKind::Constant;87    result->constant = key;88    return result;89  }90 91  // The constant.92  int64_t constant;93};94 95} // namespace detail96} // namespace mlir97#endif // MLIR_IR_AFFINEEXPRDETAIL_H_98