@@ -184,6 +184,36 @@ def fir_AllocaOp : fir_Op<"alloca", [AttrSizedOperandSegments,
184184  }];
185185}
186186
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+ 
187217def fir_AllocMemOp : fir_Op<"allocmem",
188218    [MemoryEffects<[MemAlloc<DefaultResource>]>, AttrSizedOperandSegments]> {
189219  let summary = "allocate storage on the heap for an object of a given type";
@@ -238,6 +268,29 @@ def fir_AllocMemOp : fir_Op<"allocmem",
238268  }];
239269}
240270
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+ 
241294def fir_FreeMemOp : fir_Op<"freemem", [MemoryEffects<[MemFree]>]> {
242295  let summary = "free a heap object";
243296
0 commit comments