mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 06:06:34 +08:00
[Flang] Add translation support for MutexInOutSet and InOutSet (#120715)
Implementatoin details: Both Mutexinoutset and Inoutset is recognized as flag=0x4 and 0x8 respectively, the flags is set to `kmp_depend_info` and passed as argument to `__kmpc_omp_task_with_deps` runtime call
This commit is contained in:
committed by
GitHub
parent
9f75b6664f
commit
cbe583b0bd
@@ -153,10 +153,13 @@ genDependKindAttr(lower::AbstractConverter &converter,
|
||||
pbKind = mlir::omp::ClauseTaskDepend::taskdependinout;
|
||||
break;
|
||||
case omp::clause::DependenceType::Mutexinoutset:
|
||||
pbKind = mlir::omp::ClauseTaskDepend::taskdependmutexinoutset;
|
||||
break;
|
||||
case omp::clause::DependenceType::Inoutset:
|
||||
pbKind = mlir::omp::ClauseTaskDepend::taskdependinoutset;
|
||||
break;
|
||||
case omp::clause::DependenceType::Depobj:
|
||||
TODO(currentLocation,
|
||||
"INOUTSET, MUTEXINOUTSET and DEPOBJ dependence-types");
|
||||
TODO(currentLocation, "DEPOBJ dependence-type");
|
||||
break;
|
||||
case omp::clause::DependenceType::Sink:
|
||||
case omp::clause::DependenceType::Source:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
!CHECK: not yet implemented: INOUTSET, MUTEXINOUTSET and DEPOBJ dependence-types
|
||||
!CHECK: not yet implemented: DEPOBJ dependence-type
|
||||
|
||||
subroutine f00(x)
|
||||
integer :: x
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
!CHECK: not yet implemented: INOUTSET, MUTEXINOUTSET and DEPOBJ dependence-types
|
||||
subroutine f00(x)
|
||||
integer :: x
|
||||
!$omp task depend(inoutset: x)
|
||||
x = x + 1
|
||||
!$omp end task
|
||||
end
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
!CHECK: not yet implemented: INOUTSET, MUTEXINOUTSET and DEPOBJ dependence-types
|
||||
subroutine f00(x)
|
||||
integer :: x
|
||||
!$omp task depend(mutexinoutset: x)
|
||||
x = x + 1
|
||||
!$omp end task
|
||||
end
|
||||
|
||||
@@ -144,6 +144,18 @@ subroutine task_depend_multi_task()
|
||||
x = x + 12
|
||||
!CHECK: omp.terminator
|
||||
!$omp end task
|
||||
!CHECK: omp.task depend(taskdependmutexinoutset -> %{{.+}} : !fir.ref<i32>)
|
||||
!$omp task depend(mutexinoutset : x)
|
||||
!CHECK: arith.subi
|
||||
x = x - 12
|
||||
!CHECK: omp.terminator
|
||||
!$omp end task
|
||||
!CHECK: omp.task depend(taskdependinoutset -> %{{.+}} : !fir.ref<i32>)
|
||||
!$omp task depend(inoutset : x)
|
||||
!CHECK: arith.subi
|
||||
x = x - 12
|
||||
!CHECK: omp.terminator
|
||||
!$omp end task
|
||||
end subroutine task_depend_multi_task
|
||||
|
||||
!===============================================================================
|
||||
|
||||
@@ -108,14 +108,15 @@ def ClauseRequiresAttr : OpenMP_EnumAttr<ClauseRequires, "clause_requires">;
|
||||
def ClauseTaskDependIn : I32EnumAttrCase<"taskdependin", 0>;
|
||||
def ClauseTaskDependOut : I32EnumAttrCase<"taskdependout", 1>;
|
||||
def ClauseTaskDependInOut : I32EnumAttrCase<"taskdependinout", 2>;
|
||||
def ClauseTaskDependMutexInOutSet
|
||||
: I32EnumAttrCase<"taskdependmutexinoutset", 3>;
|
||||
def ClauseTaskDependInOutSet : I32EnumAttrCase<"taskdependinoutset", 4>;
|
||||
|
||||
def ClauseTaskDepend : OpenMP_I32EnumAttr<
|
||||
"ClauseTaskDepend",
|
||||
"depend clause in a target or task construct", [
|
||||
ClauseTaskDependIn,
|
||||
ClauseTaskDependOut,
|
||||
ClauseTaskDependInOut
|
||||
]>;
|
||||
def ClauseTaskDepend
|
||||
: OpenMP_I32EnumAttr<
|
||||
"ClauseTaskDepend", "depend clause in a target or task construct",
|
||||
[ClauseTaskDependIn, ClauseTaskDependOut, ClauseTaskDependInOut,
|
||||
ClauseTaskDependMutexInOutSet, ClauseTaskDependInOutSet]>;
|
||||
|
||||
def ClauseTaskDependAttr : OpenMP_EnumAttr<ClauseTaskDepend,
|
||||
"clause_task_depend"> {
|
||||
|
||||
@@ -1701,6 +1701,12 @@ buildDependData(std::optional<ArrayAttr> dependKinds, OperandRange dependVars,
|
||||
case mlir::omp::ClauseTaskDepend::taskdependinout:
|
||||
type = llvm::omp::RTLDependenceKindTy::DepInOut;
|
||||
break;
|
||||
case mlir::omp::ClauseTaskDepend::taskdependmutexinoutset:
|
||||
type = llvm::omp::RTLDependenceKindTy::DepMutexInOutSet;
|
||||
break;
|
||||
case mlir::omp::ClauseTaskDepend::taskdependinoutset:
|
||||
type = llvm::omp::RTLDependenceKindTy::DepInOutSet;
|
||||
break;
|
||||
};
|
||||
llvm::Value *depVal = moduleTranslation.lookupValue(std::get<0>(dep));
|
||||
llvm::OpenMPIRBuilder::DependData dd(type, depVal->getType(), depVal);
|
||||
|
||||
@@ -2590,6 +2590,34 @@ llvm.func @omp_task_attrs() -> () attributes {
|
||||
// CHECK: store i64 8, ptr %[[dep_arr_addr_0_size]], align 4
|
||||
// CHECK: %[[dep_arr_addr_0_kind:.+]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[dep_arr_addr_0]], i32 0, i32 2
|
||||
// CHECK: store i8 1, ptr %[[dep_arr_addr_0_kind]], align 1
|
||||
// -----
|
||||
// dependence_type: Out
|
||||
// CHECK: %[[DEP_ARR_ADDR1:.+]] = alloca [1 x %struct.kmp_dep_info], align 8
|
||||
// CHECK: %[[DEP_ARR_ADDR_1:.+]] = getelementptr inbounds [1 x %struct.kmp_dep_info], ptr %[[DEP_ARR_ADDR1]], i64 0, i64 0
|
||||
// [...]
|
||||
// CHECK: %[[DEP_TYPE_1:.+]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[DEP_ARR_ADDR_1]], i32 0, i32 2
|
||||
// CHECK: store i8 3, ptr %[[DEP_TYPE_1]], align 1
|
||||
// -----
|
||||
// dependence_type: Inout
|
||||
// CHECK: %[[DEP_ARR_ADDR2:.+]] = alloca [1 x %struct.kmp_dep_info], align 8
|
||||
// CHECK: %[[DEP_ARR_ADDR_2:.+]] = getelementptr inbounds [1 x %struct.kmp_dep_info], ptr %[[DEP_ARR_ADDR2]], i64 0, i64 0
|
||||
// [...]
|
||||
// CHECK: %[[DEP_TYPE_2:.+]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[DEP_ARR_ADDR_2]], i32 0, i32 2
|
||||
// CHECK: store i8 3, ptr %[[DEP_TYPE_2]], align 1
|
||||
// -----
|
||||
// dependence_type: Mutexinoutset
|
||||
// CHECK: %[[DEP_ARR_ADDR3:.+]] = alloca [1 x %struct.kmp_dep_info], align 8
|
||||
// CHECK: %[[DEP_ARR_ADDR_3:.+]] = getelementptr inbounds [1 x %struct.kmp_dep_info], ptr %[[DEP_ARR_ADDR3]], i64 0, i64 0
|
||||
// [...]
|
||||
// CHECK: %[[DEP_TYPE_3:.+]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[DEP_ARR_ADDR_3]], i32 0, i32 2
|
||||
// CHECK: store i8 4, ptr %[[DEP_TYPE_3]], align 1
|
||||
// -----
|
||||
// dependence_type: Inoutset
|
||||
// CHECK: %[[DEP_ARR_ADDR4:.+]] = alloca [1 x %struct.kmp_dep_info], align 8
|
||||
// CHECK: %[[DEP_ARR_ADDR_4:.+]] = getelementptr inbounds [1 x %struct.kmp_dep_info], ptr %[[DEP_ARR_ADDR4]], i64 0, i64 0
|
||||
// [...]
|
||||
// CHECK: %[[DEP_TYPE_4:.+]] = getelementptr inbounds nuw %struct.kmp_dep_info, ptr %[[DEP_ARR_ADDR_4]], i32 0, i32 2
|
||||
// CHECK: store i8 8, ptr %[[DEP_TYPE_4]], align 1
|
||||
llvm.func @omp_task_with_deps(%zaddr: !llvm.ptr) {
|
||||
// CHECK: %[[omp_global_thread_num:.+]] = call i32 @__kmpc_global_thread_num({{.+}})
|
||||
// CHECK: %[[task_data:.+]] = call ptr @__kmpc_omp_task_alloc
|
||||
@@ -2604,6 +2632,18 @@ llvm.func @omp_task_with_deps(%zaddr: !llvm.ptr) {
|
||||
llvm.store %double, %valaddr : i32, !llvm.ptr
|
||||
omp.terminator
|
||||
}
|
||||
omp.task depend(taskdependout -> %zaddr : !llvm.ptr) {
|
||||
omp.terminator
|
||||
}
|
||||
omp.task depend(taskdependinout -> %zaddr : !llvm.ptr) {
|
||||
omp.terminator
|
||||
}
|
||||
omp.task depend(taskdependmutexinoutset -> %zaddr : !llvm.ptr) {
|
||||
omp.terminator
|
||||
}
|
||||
omp.task depend(taskdependinoutset -> %zaddr : !llvm.ptr) {
|
||||
omp.terminator
|
||||
}
|
||||
llvm.return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user