@@ -184,6 +184,36 @@ def fir_AllocaOp : fir_Op<"alloca", [AttrSizedOperandSegments,
184
184
}];
185
185
}
186
186
187
+ def fir_OmpTargetAllocMemOp : fir_Op<"omp_target_allocmem",
188
+ [MemoryEffects<[MemAlloc<DefaultResource>]>, AttrSizedOperandSegments]> {
189
+ let summary = "allocate storage on an openmp device for an object of a given type";
190
+
191
+ let description = [{
192
+ TODO
193
+ }];
194
+
195
+ let arguments = (ins
196
+ Arg<AnyIntegerType>:$device,
197
+ TypeAttr:$in_type,
198
+ OptionalAttr<StrAttr>:$uniq_name,
199
+ OptionalAttr<StrAttr>:$bindc_name,
200
+ Variadic<AnyIntegerType>:$typeparams,
201
+ Variadic<AnyIntegerType>:$shape
202
+ );
203
+ let results = (outs fir_HeapType);
204
+
205
+ let extraClassDeclaration = [{
206
+ mlir::Type getAllocatedType();
207
+ bool hasLenParams() { return !getTypeparams().empty(); }
208
+ bool hasShapeOperands() { return !getShape().empty(); }
209
+ unsigned numLenParams() { return getTypeparams().size(); }
210
+ operand_range getLenParams() { return getTypeparams(); }
211
+ unsigned numShapeOperands() { return getShape().size(); }
212
+ operand_range getShapeOperands() { return getShape(); }
213
+ static mlir::Type getRefTy(mlir::Type ty);
214
+ }];
215
+ }
216
+
187
217
def fir_AllocMemOp : fir_Op<"allocmem",
188
218
[MemoryEffects<[MemAlloc<DefaultResource>]>, AttrSizedOperandSegments]> {
189
219
let summary = "allocate storage on the heap for an object of a given type";
@@ -238,6 +268,29 @@ def fir_AllocMemOp : fir_Op<"allocmem",
238
268
}];
239
269
}
240
270
271
+ def fir_OmpTargetFreeMemOp : fir_Op<"omp_target_freemem", [MemoryEffects<[MemFree]>]> {
272
+ let summary = "free a heap object";
273
+
274
+ let description = [{
275
+ Deallocates a heap memory reference that was allocated by an `allocmem`.
276
+ The memory object that is deallocated is placed in an undefined state
277
+ after `fir.freemem`. Optimizations may treat the loading of an object
278
+ in the undefined state as undefined behavior. This includes aliasing
279
+ references, such as the result of an `fir.embox`.
280
+
281
+ ```
282
+ %21 = fir.allocmem !fir.type<ZT(p:i32){field:i32}>
283
+ ...
284
+ fir.freemem %21 : !fir.heap<!fir.type<ZT>>
285
+ ```
286
+ }];
287
+
288
+ let arguments = (ins
289
+ Arg<AnyIntegerType, "", [MemFree]>:$device,
290
+ Arg<fir_HeapType, "", [MemFree]>:$heapref
291
+ );
292
+ }
293
+
241
294
def fir_FreeMemOp : fir_Op<"freemem", [MemoryEffects<[MemFree]>]> {
242
295
let summary = "free a heap object";
243
296
0 commit comments