My Project
Intrinsics.h
Go to the documentation of this file.
1 //===- Intrinsics.h - MLIR Operations for Declarative Builders ---*- C++-*-===//
2 //
3 // Part of the MLIR 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 // Provides intuitive composable intrinsics for building snippets of MLIR
10 // declaratively
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef MLIR_EDSC_INTRINSICS_H_
15 #define MLIR_EDSC_INTRINSICS_H_
16 
17 #include "mlir/EDSC/Builders.h"
18 #include "mlir/Support/LLVM.h"
19 
20 namespace mlir {
21 
22 class MemRefType;
23 class Type;
24 
25 namespace edsc {
26 
34 struct IndexHandle : public ValueHandle {
35  explicit IndexHandle()
36  : ValueHandle(ScopedContext::getBuilder().getIndexType()) {}
37  explicit IndexHandle(index_t v) : ValueHandle(v) {}
38  explicit IndexHandle(Value v) : ValueHandle(v) {
39  assert(v->getType() == ScopedContext::getBuilder().getIndexType() &&
40  "Expected index type");
41  }
44  "Expected index type");
45  }
48  "Expected index type");
51  this->t = v.getType();
52  this->v = v.getValue();
53  return *this;
54  }
55 };
56 
58  return SmallVector<IndexHandle, 8>(rank);
59 }
60 
62 template <typename T>
66  pivs.reserve(ivs.size());
67  for (auto &iv : ivs) {
68  pivs.push_back(&iv);
69  }
70  return pivs;
71 }
72 
76  vals.reserve(ivs.size());
77  for (auto &iv : ivs) {
78  vals.push_back(iv.getValue());
79  }
80  return vals;
81 }
82 
86 namespace intrinsics {
87 namespace detail {
92 public:
94  values.append(vals.begin(), vals.end());
95  }
97  values.append(vals.begin(), vals.end());
98  }
100  SmallVector<IndexHandle, 8> tmp(vals.begin(), vals.end());
101  values.append(tmp.begin(), tmp.end());
102  }
103  operator ArrayRef<Value>() { return values; }
104 
105 private:
106  ValueHandleArray() = default;
107  SmallVector<Value, 8> values;
108 };
109 
110 template <typename T> inline T unpack(T value) { return value; }
111 
113  return detail::ValueHandleArray(values);
114 }
115 
116 } // namespace detail
117 
125 template <typename Op> struct ValueBuilder : public ValueHandle {
126  // Builder-based
127  template <typename... Args>
128  ValueBuilder(Args... args)
129  : ValueHandle(ValueHandle::create<Op>(detail::unpack(args)...)) {}
131  : ValueBuilder(ValueBuilder::create<Op>(detail::unpack(vs))) {}
132  template <typename... Args>
134  : ValueHandle(ValueHandle::create<Op>(detail::unpack(vs),
135  detail::unpack(args)...)) {}
136  template <typename T, typename... Args>
137  ValueBuilder(T t, ArrayRef<ValueHandle> vs, Args... args)
139  detail::unpack(t), detail::unpack(vs), detail::unpack(args)...)) {}
140  template <typename T1, typename T2, typename... Args>
141  ValueBuilder(T1 t1, T2 t2, ArrayRef<ValueHandle> vs, Args... args)
143  detail::unpack(t1), detail::unpack(t2), detail::unpack(vs),
144  detail::unpack(args)...)) {}
145 
147  template <typename... Args>
148  ValueBuilder(OperationFolder *folder, Args... args)
149  : ValueHandle(ValueHandle::create<Op>(folder, detail::unpack(args)...)) {}
151  : ValueBuilder(ValueBuilder::create<Op>(folder, detail::unpack(vs))) {}
152  template <typename... Args>
154  : ValueHandle(ValueHandle::create<Op>(folder, detail::unpack(vs),
155  detail::unpack(args)...)) {}
156  template <typename T, typename... Args>
158  Args... args)
159  : ValueHandle(ValueHandle::create<Op>(folder, detail::unpack(t),
160  detail::unpack(vs),
161  detail::unpack(args)...)) {}
162  template <typename T1, typename T2, typename... Args>
164  Args... args)
166  folder, detail::unpack(t1), detail::unpack(t2), detail::unpack(vs),
167  detail::unpack(args)...)) {}
168 
170 };
171 
172 template <typename Op> struct OperationBuilder : public OperationHandle {
173  template <typename... Args>
174  OperationBuilder(Args... args)
175  : OperationHandle(OperationHandle::create<Op>(detail::unpack(args)...)) {}
177  : OperationHandle(OperationHandle::create<Op>(detail::unpack(vs))) {}
178  template <typename... Args>
181  detail::unpack(args)...)) {}
182  template <typename T, typename... Args>
185  detail::unpack(t), detail::unpack(vs), detail::unpack(args)...)) {}
186  template <typename T1, typename T2, typename... Args>
187  OperationBuilder(T1 t1, T2 t2, ArrayRef<ValueHandle> vs, Args... args)
189  detail::unpack(t1), detail::unpack(t2), detail::unpack(vs),
190  detail::unpack(args)...)) {}
192 };
193 
216 
222 
237  ArrayRef<ValueHandle> operands);
238 
246  ArrayRef<ValueHandle> trueOperands,
247  BlockHandle falseBranch,
248  ArrayRef<ValueHandle> falseOperands);
249 
267  ArrayRef<ValueHandle *> trueCaptures,
268  ArrayRef<ValueHandle> trueOperands,
269  BlockHandle *falseBranch,
270  ArrayRef<ValueHandle *> falseCaptures,
271  ArrayRef<ValueHandle> falseOperands);
272 } // namespace intrinsics
273 } // namespace edsc
274 } // namespace mlir
275 
276 #endif // MLIR_EDSC_INTRINSICS_H_
IndexHandle(Value v)
Definition: Intrinsics.h:38
Definition: InferTypeOpInterface.cpp:20
SmallVector< ValueHandle *, 8 > makeHandlePointers(MutableArrayRef< T > ivs)
Entry point to build multiple ValueHandle* from a mutable list ivs of T.
Definition: Intrinsics.h:64
OperationHandle cond_br(ValueHandle cond, BlockHandle *trueBranch, ArrayRef< ValueHandle *> trueCaptures, ArrayRef< ValueHandle > trueOperands, BlockHandle *falseBranch, ArrayRef< ValueHandle *> falseCaptures, ArrayRef< ValueHandle > falseOperands)
Definition: Intrinsics.cpp:61
ValueBuilder(OperationFolder *folder, Args... args)
Folder-based.
Definition: Intrinsics.h:148
Definition: Attributes.h:139
Value getValue() const
Definition: Builders.h:358
Definition: Builders.h:431
ValueBuilder(ArrayRef< ValueHandle > vs)
Definition: Intrinsics.h:130
Definition: Builders.h:290
ValueBuilder(Args... args)
Definition: Intrinsics.h:128
Definition: Intrinsics.h:125
IndexHandle & operator=(const ValueHandle &v)
Definition: Intrinsics.h:46
static ValueHandle create(Args... args)
Definition: Builders.h:478
ValueBuilder()
Definition: Intrinsics.h:169
Type getType() const
Definition: Builders.h:363
OperationBuilder()
Definition: Intrinsics.h:191
detail::ValueHandleArray unpack(ArrayRef< ValueHandle > values)
Definition: Intrinsics.h:112
Definition: Intrinsics.h:172
ValueHandleArray(ArrayRef< index_t > vals)
Definition: Intrinsics.h:99
Definition: LLVM.h:37
SmallVector< Value, 8 > extractValues(ArrayRef< IndexHandle > ivs)
Returns a vector of the underlying Value from ivs.
Definition: Intrinsics.h:74
Type getType() const
Return the type of this value.
Definition: Value.cpp:34
ValueHandleArray(ArrayRef< ValueHandle > vals)
Definition: Intrinsics.h:93
OperationHandle br(BlockHandle *bh, ArrayRef< ValueHandle *> captures, ArrayRef< ValueHandle > operands)
Definition: Intrinsics.cpp:40
Definition: LLVM.h:38
OperationBuilder(ArrayRef< ValueHandle > vs)
Definition: Intrinsics.h:176
OperationBuilder(T t, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:183
Definition: Builders.h:27
OperationBuilder(T1 t1, T2 t2, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:187
ValueHandleArray(ArrayRef< IndexHandle > vals)
Definition: Intrinsics.h:96
ValueBuilder(T t, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:137
IndexHandle()
Definition: Intrinsics.h:35
ValueBuilder(OperationFolder *folder, T1 t1, T2 t2, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:163
Definition: Builders.h:385
Definition: Value.h:38
ValueBuilder(T1 t1, T2 t2, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:141
Definition: FoldUtils.h:50
Value v
Definition: Builders.h:375
Definition: LLVM.h:35
ValueBuilder(ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:133
Definition: Intrinsics.h:34
Definition: Builders.h:43
IndexType getIndexType()
Definition: Builders.cpp:54
Type t
Definition: Builders.h:374
OperationBuilder(Args... args)
Definition: Intrinsics.h:174
SmallVector< IndexHandle, 8 > makeIndexHandles(unsigned rank)
Definition: Intrinsics.h:57
Definition: OpDefinition.h:949
ValueBuilder(OperationFolder *folder, ArrayRef< ValueHandle > vs)
Definition: Intrinsics.h:150
static OpBuilder & getBuilder()
Definition: Builders.cpp:52
IndexHandle(ValueHandle v)
Definition: Intrinsics.h:42
ValueBuilder(OperationFolder *folder, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:153
ValueBuilder(OperationFolder *folder, T t, ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:157
IndexHandle(index_t v)
Definition: Intrinsics.h:37
OperationBuilder(ArrayRef< ValueHandle > vs, Args... args)
Definition: Intrinsics.h:179