Coverage Report

Created: 2020-06-26 05:44

/home/arjun/llvm-project/mlir/lib/IR/AffineExprDetail.h
Line
Count
Source (jump to first uncovered line)
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-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This holds implementation details of AffineExpr. Ideally it would not be
10
// exposed and would be kept local to AffineExpr.cpp however, MLIRContext.cpp
11
// 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
21
namespace mlir {
22
23
class MLIRContext;
24
25
namespace detail {
26
27
/// Base storage class appearing in an affine expression.
28
struct AffineExprStorage : public StorageUniquer::BaseStorage {
29
  MLIRContext *context;
30
};
31
32
/// A binary operation appearing in an affine expression.
33
struct AffineBinaryOpExprStorage : public AffineExprStorage {
34
  using KeyTy = std::pair<AffineExpr, AffineExpr>;
35
36
0
  bool operator==(const KeyTy &key) const {
37
0
    return key.first == lhs && key.second == rhs;
38
0
  }
39
40
  static AffineBinaryOpExprStorage *
41
0
  construct(StorageUniquer::StorageAllocator &allocator, const KeyTy &key) {
42
0
    auto *result = allocator.allocate<AffineBinaryOpExprStorage>();
43
0
    result->lhs = key.first;
44
0
    result->rhs = key.second;
45
0
    result->context = result->lhs.getContext();
46
0
    return result;
47
0
  }
48
49
  AffineExpr lhs;
50
  AffineExpr rhs;
51
};
52
53
/// A dimensional or symbolic identifier appearing in an affine expression.
54
struct AffineDimExprStorage : public AffineExprStorage {
55
  using KeyTy = unsigned;
56
57
0
  bool operator==(const KeyTy &key) const { return position == key; }
58
59
  static AffineDimExprStorage *
60
0
  construct(StorageUniquer::StorageAllocator &allocator, const KeyTy &key) {
61
0
    auto *result = allocator.allocate<AffineDimExprStorage>();
62
0
    result->position = key;
63
0
    return result;
64
0
  }
65
66
  /// Position of this identifier in the argument list.
67
  unsigned position;
68
};
69
70
/// An integer constant appearing in affine expression.
71
struct AffineConstantExprStorage : public AffineExprStorage {
72
  using KeyTy = int64_t;
73
74
0
  bool operator==(const KeyTy &key) const { return constant == key; }
75
76
  static AffineConstantExprStorage *
77
0
  construct(StorageUniquer::StorageAllocator &allocator, const KeyTy &key) {
78
0
    auto *result = allocator.allocate<AffineConstantExprStorage>();
79
0
    result->constant = key;
80
0
    return result;
81
0
  }
82
83
  // The constant.
84
  int64_t constant;
85
};
86
87
} // end namespace detail
88
} // end namespace mlir
89
#endif // MLIR_IR_AFFINEEXPRDETAIL_H_