Skip to content

Commit be860ac

Browse files
committed
Add fir omp target alloc and free ops
1 parent bf2d5f4 commit be860ac

File tree

1 file changed

+53
-0
lines changed
  • flang/include/flang/Optimizer/Dialect

1 file changed

+53
-0
lines changed

flang/include/flang/Optimizer/Dialect/FIROps.td

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
187217
def 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+
241294
def fir_FreeMemOp : fir_Op<"freemem", [MemoryEffects<[MemFree]>]> {
242295
let summary = "free a heap object";
243296

0 commit comments

Comments
 (0)