[flang][openmp] Add Lowering to omp mlir for workdistribute construct
This commit is contained in:
parent
4442fced82
commit
4d5983233f
@ -534,6 +534,13 @@ static void processHostEvalClauses(lower::AbstractConverter &converter,
|
||||
cp.processCollapse(loc, eval, hostInfo->ops, hostInfo->iv);
|
||||
break;
|
||||
|
||||
case OMPD_teams_workdistribute:
|
||||
cp.processThreadLimit(stmtCtx, hostInfo->ops);
|
||||
[[fallthrough]];
|
||||
case OMPD_target_teams_workdistribute:
|
||||
cp.processNumTeams(stmtCtx, hostInfo->ops);
|
||||
break;
|
||||
|
||||
// Standalone 'target' case.
|
||||
case OMPD_target: {
|
||||
processSingleNestedIf(
|
||||
@ -2820,6 +2827,17 @@ genTeamsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
|
||||
queue, item, clauseOps);
|
||||
}
|
||||
|
||||
static mlir::omp::WorkdistributeOp genWorkdistributeOp(
|
||||
lower::AbstractConverter &converter, lower::SymMap &symTable,
|
||||
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
|
||||
mlir::Location loc, const ConstructQueue &queue,
|
||||
ConstructQueue::const_iterator item) {
|
||||
return genOpWithBody<mlir::omp::WorkdistributeOp>(
|
||||
OpWithBodyGenInfo(converter, symTable, semaCtx, loc, eval,
|
||||
llvm::omp::Directive::OMPD_workdistribute),
|
||||
queue, item);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Code generation functions for the standalone version of constructs that can
|
||||
// also be a leaf of a composite construct
|
||||
@ -3459,7 +3477,10 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
|
||||
case llvm::omp::Directive::OMPD_unroll:
|
||||
genUnrollOp(converter, symTable, stmtCtx, semaCtx, eval, loc, queue, item);
|
||||
break;
|
||||
// case llvm::omp::Directive::OMPD_workdistribute:
|
||||
case llvm::omp::Directive::OMPD_workdistribute:
|
||||
newOp = genWorkdistributeOp(converter, symTable, semaCtx, eval, loc, queue,
|
||||
item);
|
||||
break;
|
||||
case llvm::omp::Directive::OMPD_workshare:
|
||||
newOp = genWorkshareOp(converter, symTable, stmtCtx, semaCtx, eval, loc,
|
||||
queue, item);
|
||||
|
||||
30
flang/test/Lower/OpenMP/workdistribute.f90
Normal file
30
flang/test/Lower/OpenMP/workdistribute.f90
Normal file
@ -0,0 +1,30 @@
|
||||
! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
|
||||
|
||||
! CHECK-LABEL: func @_QPtarget_teams_workdistribute
|
||||
subroutine target_teams_workdistribute()
|
||||
integer :: aa(10), bb(10)
|
||||
! CHECK: omp.target
|
||||
! CHECK: omp.teams
|
||||
! CHECK: omp.workdistribute
|
||||
!$omp target teams workdistribute
|
||||
aa = bb
|
||||
! CHECK: omp.terminator
|
||||
! CHECK: omp.terminator
|
||||
! CHECK: omp.terminator
|
||||
!$omp end target teams workdistribute
|
||||
end subroutine target_teams_workdistribute
|
||||
|
||||
! CHECK-LABEL: func @_QPteams_workdistribute
|
||||
subroutine teams_workdistribute()
|
||||
use iso_fortran_env
|
||||
real(kind=real32) :: a
|
||||
real(kind=real32), dimension(10) :: x
|
||||
real(kind=real32), dimension(10) :: y
|
||||
! CHECK: omp.teams
|
||||
! CHECK: omp.workdistribute
|
||||
!$omp teams workdistribute
|
||||
y = a * x + y
|
||||
! CHECK: omp.terminator
|
||||
! CHECK: omp.terminator
|
||||
!$omp end teams workdistribute
|
||||
end subroutine teams_workdistribute
|
||||
Loading…
x
Reference in New Issue
Block a user