diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td @@ -783,6 +783,238 @@ let assemblyFormat = "attr-dict"; } +//===---------------------------------------------------------------------===// +// 2.12.2 target data Construct +//===---------------------------------------------------------------------===// + +def Target_Data: OpenMP_Op<"target_data", [AttrSizedOperandSegments]>{ + let summary = "target data construct"; + let description = [{ + Map variables to a device data environment for the extent of the region. + + The omp target data directive maps variables to a device data + environment, and defines the lexical scope of the data environment + that is created. The omp target data directive can reduce data copies + to and from the offloading device when multiple target regions are using + the same data. + + The optional $if_expr parameter specifies a boolean result of a + conditional check. If this value is 1 or is not provided then the target + region runs on a device, if it is 0 then the target region is executed + on the host device. + + The optional $device parameter specifies the device number for the target + region. + + The optional $use_device_ptr specifies the device pointers to the + corresponding list items in the device data environment + + The optional $use_device_addr specifies the adress of the objects in the + device data enviornment + + The $map_operands specifies operands with no map type + + The $map_to_operands specifies operands with map type "to" + + The $map_from_operands specifies operands with map type "from" + + The $map_to_from_operands specifies operands with map type "tofrom" + + The $map_alloc_operands specifies operands with map type "alloc" + + The $map_release_operands specifies operands with map type "release" + + The $map_delete_operands specifies operands with map type "delete" + + The $map_type_modifier vector specifies the modifier for each map type + operand + + /// map_type_modifier can be always, close, and mapper + }]; + + let arguments = (ins Optional:$if_expr, + Optional:$device, + Variadic:$use_device_ptr, + Variadic:$use_device_addr, + Variadic:$map_operands, + Variadic:$map_to_operands, + Variadic:$map_from_operands, + Variadic:$map_to_from_operands, + Variadic:$map_alloc_operands, + Variadic:$map_release_operands, + Variadic:$map_delete_operands, + Variadic:$map_type_modifier_operands); + + let regions = (region AnyRegion:$region); + + let assemblyFormat = [{ + (`if` `(` $if_expr^ `)` )? + (`device` `(` $device^ `:` type($device) `)` )? + (`use_device_ptr` `(` $use_device_ptr^ `:` type($use_device_ptr) `)` )? + (`use_device_addr` `(` $use_device_addr^ `:` type($use_device_addr) `)` )? + (`map` `(` $map_operands^ `:` type($map_operands) `)` )? + (`map_to` `(` $map_to_operands^ `:` type($map_to_operands) `)` )? + (`map_from` `(` $map_from_operands^ `:` type($map_from_operands) `)` )? + (`map_to_from` `(` $map_to_from_operands^ `:` type($map_to_from_operands) `)` )? + (`map_alloc` `(` $map_alloc_operands^ `:` type($map_alloc_operands) `)` )? + (`map_release` `(` $map_release_operands^ `:` type($map_release_operands) `)` )? + (`map_delete` `(` $map_delete_operands^ `:` type($map_delete_operands) `)` )? + (`map_type_modifier` `(` $map_type_modifier_operands^ `:` type($map_type_modifier_operands) `)` )? + $region attr-dict + }]; + +} + +//===---------------------------------------------------------------------===// +// 2.12.3 target enter data Construct +//===---------------------------------------------------------------------===// + +def Target_EnterDataOp: OpenMP_Op<"target_enter_data", + [AttrSizedOperandSegments]>{ + let summary = "target enter data construct"; + let description = [{ + The target enter data directive specifies that variables are mapped to + a device data environment. The target enter data directive is a + stand-alone directive. + + The optional $if_expr parameter specifies a boolean result of a + conditional check. If this value is 1 or is not provided then the target + region runs on a device, if it is 0 then the target region is executed on + the host device. + + The optional $device parameter specifies the device number for the + target region. + + The optional $nowait elliminates the implicit barrier so the parent task + can make progress even if the target task is not yet completed. + + The $map_operands specifies operands with no map type + + The $map_to_operands specifies operands with map type "to" + + The $map_from_operands specifies operands with map type "from" + + The $map_to_from_operands specifies operands with map type "tofrom" + + The $map_alloc_operands specifies operands with map type "alloc" + + The $map_release_operands specifies operands with map type "release" + + The $map_delete_operands specifies operands with map type "delete" + + The $map_type_modifier vector specifies the modifier for each map type + operand + + /// map_type_modifier can be always, close, and mapper + + TODO: depend + }]; + + let arguments = (ins Optional:$if_expr, + Optional:$device, + Optional:$nowait_operand, + UnitAttr:$nowait, + Variadic:$map_operands, + Variadic:$map_to_operands, + Variadic:$map_from_operands, + Variadic:$map_to_from_operands, + Variadic:$map_alloc_operands, + Variadic:$map_release_operands, + Variadic:$map_delete_operands, + Variadic:$map_type_modifier_operands); + + let assemblyFormat = [{ + (`if` `(` $if_expr^ `)` )? + (`device` `(` $device^ `:` type($device) `)` )? + (`nowait` `(` $nowait_operand^ `:` type($nowait_operand) `)` )? + (`map` `(` $map_operands^ `:` type($map_operands) `)` )? + (`map_to` `(` $map_to_operands^ `:` type($map_to_operands) `)` )? + (`map_from` `(` $map_from_operands^ `:` type($map_from_operands) `)` )? + (`map_to_from` `(` $map_to_from_operands^ `:` type($map_to_from_operands) `)` )? + (`map_alloc` `(` $map_alloc_operands^ `:` type($map_alloc_operands) `)` )? + (`map_release` `(` $map_release_operands^ `:` type($map_release_operands) `)` )? + (`map_delete` `(` $map_delete_operands^ `:` type($map_delete_operands) `)` )? + (`map_type_modifier` `(` $map_type_modifier_operands^ `:` type($map_type_modifier_operands) `)` )? + attr-dict + }]; + +} + +//===---------------------------------------------------------------------===// +// 2.12.4 target exit data Construct +//===---------------------------------------------------------------------===// + +def Target_ExitDataOp: OpenMP_Op<"target_exit_data", + [AttrSizedOperandSegments]>{ + let summary = "target exit data construct"; + let description = [{ + The target exit data directive specifies that variables are mapped to a + device data environment. The target exit data directive is + a stand-alone directive. + + The optional $if_expr parameter specifies a boolean result of a + conditional check. If this value is 1 or is not provided then the target + region runs on a device, if it is 0 then the target region is executed + on the host device. + + The optional $device parameter specifies the device number for the + target region. + + The optional $nowait elliminates the implicit barrier so the parent + task can make progress even if the target task is not yet completed. + + The $map_operands specifies operands with no map type + + The $map_to_operands specifies operands with map type "to" + + The $map_from_operands specifies operands with map type "from" + + The $map_to_from_operands specifies operands with map type "tofrom" + + The $map_alloc_operands specifies operands with map type "alloc" + + The $map_release_operands specifies operands with map type "release" + + The $map_delete_operands specifies operands with map type "delete" + + The $map_type_modifier vector specifies the modifier for each map type + operand + + /// map_type_modifier can be always, close, and mapper + + TODO: depend + }]; + + let arguments = (ins Optional:$if_expr, + Optional:$device, + Optional:$nowait_operand, + UnitAttr:$nowait, + Variadic:$map_operands, + Variadic:$map_to_operands, + Variadic:$map_from_operands, + Variadic:$map_to_from_operands, + Variadic:$map_alloc_operands, + Variadic:$map_release_operands, + Variadic:$map_delete_operands, + Variadic:$map_type_modifier_operands); + + let assemblyFormat = [{ + (`if` `(` $if_expr^ `)` )? + (`device` `(` $device^ `:` type($device) `)` )? + (`nowait` `(` $nowait_operand^ `:` type($nowait_operand) `)` )? + (`map` `(` $map_operands^ `:` type($map_operands) `)` )? + (`map_to` `(` $map_to_operands^ `:` type($map_to_operands) `)` )? + (`map_from` `(` $map_from_operands^ `:` type($map_from_operands) `)` )? + (`map_to_from` `(` $map_to_from_operands^ `:` type($map_to_from_operands) `)` )? + (`map_alloc` `(` $map_alloc_operands^ `:` type($map_alloc_operands) `)` )? + (`map_release` `(` $map_release_operands^ `:` type($map_release_operands) `)` )? + (`map_delete` `(` $map_delete_operands^ `:` type($map_delete_operands) `)` )? + (`map_type_modifier` `(` $map_type_modifier_operands^ `:` type($map_type_modifier_operands) `)` )? + attr-dict + }]; + +} + //===----------------------------------------------------------------------===// // 2.13.7 flush Construct //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/OpenMP/ops.mlir b/mlir/test/Dialect/OpenMP/ops.mlir --- a/mlir/test/Dialect/OpenMP/ops.mlir +++ b/mlir/test/Dialect/OpenMP/ops.mlir @@ -382,6 +382,28 @@ return } +// CHECK-LABEL: omp_target_data +func.func @omp_target_data (%if_cond : i1, %device : si32, %data1: memref, %data2: memref) -> () { + + // CHECK: omp.target_data + "omp.target_data"(%if_cond, %device, %data1, %data2) ({ + + }) {operand_segment_sizes = dense<[1,1,1,1,0,0,0,0,0,0,0,0]>: vector<12xi32> } : ( i1, si32, memref, memref ) -> () + + // CHECK: omp.target_enter_data + "omp.target_enter_data"(%if_cond, %device) {operand_segment_sizes = dense<[1,1,0,0,0,0,0,0,0,0,0]>: vector<11xi32>, nowait } : ( i1, si32 ) -> () + + // CHECK: omp.target_exit_data + "omp.target_exit_data"(%if_cond, %device) {operand_segment_sizes = dense<[1,1,0,0,0,0,0,0,0,0,0]>: vector<11xi32>, nowait } : ( i1, si32 ) -> () + + // CHECK: omp.barrier + omp.barrier + + return +} + + + // CHECK-LABEL: omp_target_pretty func.func @omp_target_pretty(%if_cond : i1, %device : si32, %num_threads : i32) -> () { // CHECK: omp.target if({{.*}}) device({{.*}})