Skip to content

Commit 31e43e2

Browse files
authored
[MLIR] [OpenMP] Modify definition of ALLOCATOR clause to support allocator type defined in user program. (#157399)
Earlier only predefined allocator types mentioned in OpenMP spec were allowed. This patch addresses support for user defined allocator type in allocator clause increasing the scope of allocator clause.
1 parent b405e32 commit 31e43e2

File tree

5 files changed

+26
-47
lines changed

5 files changed

+26
-47
lines changed

mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ class OpenMP_AllocatorClauseSkip<
120120
extraClassDeclaration> {
121121

122122
let arguments = (ins
123-
OptionalAttr<AllocatorHandleAttr>:$allocator
123+
Optional<I64>:$allocator
124124
);
125125

126126
let optAssemblyFormat = [{
127-
`allocator` `(` custom<ClauseAttr>($allocator) `)`
127+
`allocator` `(` $allocator `)`
128128
}];
129129

130130
let description = [{

mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -263,34 +263,4 @@ def VariableCaptureKindAttr : OpenMP_EnumAttr<VariableCaptureKind,
263263
let assemblyFormat = "`(` $value `)`";
264264
}
265265

266-
267-
//===----------------------------------------------------------------------===//
268-
// allocator_handle enum.
269-
//===----------------------------------------------------------------------===//
270-
271-
def OpenMP_AllocatorHandleNullAllocator : I32EnumAttrCase<"omp_null_allocator", 0>;
272-
def OpenMP_AllocatorHandleDefaultMemAlloc : I32EnumAttrCase<"omp_default_mem_alloc", 1>;
273-
def OpenMP_AllocatorHandleLargeCapMemAlloc : I32EnumAttrCase<"omp_large_cap_mem_alloc", 2>;
274-
def OpenMP_AllocatorHandleConstMemAlloc : I32EnumAttrCase<"omp_const_mem_alloc", 3>;
275-
def OpenMP_AllocatorHandleHighBwMemAlloc : I32EnumAttrCase<"omp_high_bw_mem_alloc", 4>;
276-
def OpenMP_AllocatorHandleLowLatMemAlloc : I32EnumAttrCase<"omp_low_lat_mem_alloc", 5>;
277-
def OpenMP_AllocatorHandleCgroupMemAlloc : I32EnumAttrCase<"omp_cgroup_mem_alloc", 6>;
278-
def OpenMP_AllocatorHandlePteamMemAlloc : I32EnumAttrCase<"omp_pteam_mem_alloc", 7>;
279-
def OpenMP_AllocatorHandlethreadMemAlloc : I32EnumAttrCase<"omp_thread_mem_alloc", 8>;
280-
281-
def AllocatorHandle : OpenMP_I32EnumAttr<
282-
"AllocatorHandle",
283-
"OpenMP allocator_handle", [
284-
OpenMP_AllocatorHandleNullAllocator,
285-
OpenMP_AllocatorHandleDefaultMemAlloc,
286-
OpenMP_AllocatorHandleLargeCapMemAlloc,
287-
OpenMP_AllocatorHandleConstMemAlloc,
288-
OpenMP_AllocatorHandleHighBwMemAlloc,
289-
OpenMP_AllocatorHandleLowLatMemAlloc,
290-
OpenMP_AllocatorHandleCgroupMemAlloc,
291-
OpenMP_AllocatorHandlePteamMemAlloc,
292-
OpenMP_AllocatorHandlethreadMemAlloc
293-
]>;
294-
295-
def AllocatorHandleAttr : OpenMP_EnumAttr<AllocatorHandle, "allocator_handle">;
296266
#endif // OPENMP_ENUMS

mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2100,7 +2100,7 @@ def MaskedOp : OpenMP_Op<"masked", clauses = [
21002100
//===----------------------------------------------------------------------===//
21012101
// [Spec 5.2] 6.5 allocate Directive
21022102
//===----------------------------------------------------------------------===//
2103-
def AllocateDirOp : OpenMP_Op<"allocate_dir", clauses = [
2103+
def AllocateDirOp : OpenMP_Op<"allocate_dir", [AttrSizedOperandSegments], clauses = [
21042104
OpenMP_AlignClause, OpenMP_AllocatorClause
21052105
]> {
21062106
let summary = "allocate directive";

mlir/test/Dialect/OpenMP/invalid.mlir

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3033,14 +3033,6 @@ func.func @invalid_allocate_align_2(%arg0 : memref<i32>) -> () {
30333033
return
30343034
}
30353035

3036-
// -----
3037-
func.func @invalid_allocate_allocator(%arg0 : memref<i32>) -> () {
3038-
// expected-error @below {{invalid clause value}}
3039-
omp.allocate_dir (%arg0 : memref<i32>) allocator(omp_small_cap_mem_alloc)
3040-
3041-
return
3042-
}
3043-
30443036
// -----
30453037
func.func @invalid_workdistribute_empty_region() -> () {
30463038
omp.teams {

mlir/test/Dialect/OpenMP/ops.mlir

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3260,6 +3260,10 @@ func.func @omp_workshare_loop_wrapper_attrs(%idx : index) {
32603260
return
32613261
}
32623262

3263+
func.func @omp_init_allocator(%custom_allocator : i64) -> i64 {
3264+
return %custom_allocator : i64
3265+
}
3266+
32633267
// CHECK-LABEL: func.func @omp_allocate_dir(
32643268
// CHECK-SAME: %[[ARG0:.*]]: memref<i32>,
32653269
// CHECK-SAME: %[[ARG1:.*]]: memref<i32>) {
@@ -3278,16 +3282,29 @@ func.func @omp_allocate_dir(%arg0 : memref<i32>, %arg1 : memref<i32>) -> () {
32783282
omp.allocate_dir (%arg0 : memref<i32>) align(2)
32793283

32803284
// Test with one data var and allocator clause
3281-
// CHECK: omp.allocate_dir(%[[ARG0]] : memref<i32>) allocator(omp_pteam_mem_alloc)
3282-
omp.allocate_dir (%arg0 : memref<i32>) allocator(omp_pteam_mem_alloc)
3285+
// CHECK: %[[VAL_1:.*]] = arith.constant 1 : i64
3286+
%omp_default_mem_alloc = arith.constant 1 : i64
3287+
// CHECK: omp.allocate_dir(%[[ARG0]] : memref<i32>) allocator(%[[VAL_1:.*]])
3288+
omp.allocate_dir (%arg0 : memref<i32>) allocator(%omp_default_mem_alloc)
32833289

32843290
// Test with one data var, align clause and allocator clause
3285-
// CHECK: omp.allocate_dir(%[[ARG0]] : memref<i32>) align(2) allocator(omp_thread_mem_alloc)
3286-
omp.allocate_dir (%arg0 : memref<i32>) align(2) allocator(omp_thread_mem_alloc)
3291+
// CHECK: %[[VAL_2:.*]] = arith.constant 7 : i64
3292+
%omp_pteam_mem_alloc = arith.constant 7 : i64
3293+
// CHECK: omp.allocate_dir(%[[ARG0]] : memref<i32>) align(4) allocator(%[[VAL_2:.*]])
3294+
omp.allocate_dir (%arg0 : memref<i32>) align(4) allocator(%omp_pteam_mem_alloc)
32873295

32883296
// Test with two data vars, align clause and allocator clause
3289-
// CHECK: omp.allocate_dir(%[[ARG0]], %[[ARG1]] : memref<i32>, memref<i32>) align(2) allocator(omp_cgroup_mem_alloc)
3290-
omp.allocate_dir (%arg0, %arg1 : memref<i32>, memref<i32>) align(2) allocator(omp_cgroup_mem_alloc)
3297+
// CHECK: %[[VAL_3:.*]] = arith.constant 6 : i64
3298+
%omp_cgroup_mem_alloc = arith.constant 6 : i64
3299+
// CHECK: omp.allocate_dir(%[[ARG0]], %[[ARG1]] : memref<i32>, memref<i32>) align(8) allocator(%[[VAL_3:.*]])
3300+
omp.allocate_dir (%arg0, %arg1 : memref<i32>, memref<i32>) align(8) allocator(%omp_cgroup_mem_alloc)
3301+
3302+
// Test with one data var and user defined allocator clause
3303+
// CHECK: %[[VAL_4:.*]] = arith.constant 9 : i64
3304+
%custom_allocator = arith.constant 9 : i64
3305+
%custom_mem_alloc = func.call @omp_init_allocator(%custom_allocator) : (i64) -> (i64)
3306+
// CHECK: omp.allocate_dir(%[[ARG0]] : memref<i32>) allocator(%[[VAL_5:.*]])
3307+
omp.allocate_dir (%arg0 : memref<i32>) allocator(%custom_mem_alloc)
32913308

32923309
return
32933310
}

0 commit comments

Comments
 (0)