@@ -1959,6 +1959,9 @@ static void genOMPDispatch(Fortran::lower::AbstractConverter &converter,
19591959 const List<Clause> &clauses = item->clauses ;
19601960
19611961 switch (llvm::omp::Directive dir = item->id ) {
1962+ case llvm::omp::Directive::OMPD_barrier:
1963+ genBarrierOp (converter, symTable, semaCtx, eval, loc, queue, item);
1964+ break ;
19621965 case llvm::omp::Directive::OMPD_distribute:
19631966 genDistributeOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
19641967 item);
@@ -1968,22 +1971,25 @@ static void genOMPDispatch(Fortran::lower::AbstractConverter &converter,
19681971 break ;
19691972 case llvm::omp::Directive::OMPD_loop:
19701973 case llvm::omp::Directive::OMPD_masked:
1971- case llvm::omp::Directive::OMPD_tile:
1972- case llvm::omp::Directive::OMPD_unroll:
19731974 TODO (loc, " Unhandled loop directive (" +
19741975 llvm::omp::getOpenMPDirectiveName (dir) + " )" );
19751976 break ;
19761977 case llvm::omp::Directive::OMPD_master:
19771978 genMasterOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item);
19781979 break ;
19791980 case llvm::omp::Directive::OMPD_ordered:
1981+ // Block-associated "ordered" construct.
19801982 genOrderedRegionOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
19811983 item);
19821984 break ;
19831985 case llvm::omp::Directive::OMPD_parallel:
19841986 genParallelOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item,
19851987 /* outerCombined=*/ false );
19861988 break ;
1989+ case llvm::omp::Directive::OMPD_section:
1990+ genSectionOp (converter, symTable, semaCtx, eval, loc, /* clauses=*/ {}, queue,
1991+ item);
1992+ break ;
19871993 case llvm::omp::Directive::OMPD_sections:
19881994 genSectionsOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
19891995 item);
@@ -2025,16 +2031,28 @@ static void genOMPDispatch(Fortran::lower::AbstractConverter &converter,
20252031 genTaskloopOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
20262032 item);
20272033 break ;
2034+ case llvm::omp::Directive::OMPD_taskwait:
2035+ genTaskwaitOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
2036+ item);
2037+ break ;
2038+ case llvm::omp::Directive::OMPD_taskyield:
2039+ genTaskyieldOp (converter, symTable, semaCtx, eval, loc, queue, item);
2040+ break ;
20282041 case llvm::omp::Directive::OMPD_teams:
20292042 genTeamsOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item);
20302043 break ;
2044+ case llvm::omp::Directive::OMPD_tile:
2045+ case llvm::omp::Directive::OMPD_unroll:
2046+ TODO (loc, " Unhandled loop directive (" +
2047+ llvm::omp::getOpenMPDirectiveName (dir) + " )" );
20312048 // case llvm::omp::Directive::OMPD_workdistribute:
20322049 case llvm::omp::Directive::OMPD_workshare:
20332050 // FIXME: Workshare is not a commonly used OpenMP construct, an
20342051 // implementation for this feature will come later. For the codes
20352052 // that use this construct, add a single construct for now.
20362053 genSingleOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item);
20372054 break ;
2055+
20382056 // Composite constructs
20392057 case llvm::omp::Directive::OMPD_distribute_parallel_do:
20402058 genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
@@ -2174,45 +2192,14 @@ static void genOMP(Fortran::lower::AbstractConverter &converter,
21742192 ConstructQueue queue{
21752193 buildConstructQueue (converter.getFirOpBuilder ().getModule (), semaCtx,
21762194 eval, directive.source , directive.v , clauses)};
2177-
2178- switch (directive.v ) {
2179- default :
2180- break ;
2181- case llvm::omp::Directive::OMPD_barrier:
2182- genBarrierOp (converter, symTable, semaCtx, eval, currentLocation, queue,
2183- queue.begin ());
2184- break ;
2185- case llvm::omp::Directive::OMPD_taskwait:
2186- genTaskwaitOp (converter, symTable, semaCtx, eval, currentLocation, clauses,
2187- queue, queue.begin ());
2188- break ;
2189- case llvm::omp::Directive::OMPD_taskyield:
2190- genTaskyieldOp (converter, symTable, semaCtx, eval, currentLocation, queue,
2191- queue.begin ());
2192- break ;
2193- case llvm::omp::Directive::OMPD_target_data:
2194- genTargetDataOp (converter, symTable, semaCtx, eval, currentLocation,
2195- clauses, queue, queue.begin ());
2196- break ;
2197- case llvm::omp::Directive::OMPD_target_enter_data:
2198- genTargetEnterExitUpdateDataOp<mlir::omp::TargetEnterDataOp>(
2199- converter, symTable, semaCtx, currentLocation, clauses, queue,
2200- queue.begin ());
2201- break ;
2202- case llvm::omp::Directive::OMPD_target_exit_data:
2203- genTargetEnterExitUpdateDataOp<mlir::omp::TargetExitDataOp>(
2204- converter, symTable, semaCtx, currentLocation, clauses, queue,
2205- queue.begin ());
2206- break ;
2207- case llvm::omp::Directive::OMPD_target_update:
2208- genTargetEnterExitUpdateDataOp<mlir::omp::TargetUpdateOp>(
2209- converter, symTable, semaCtx, currentLocation, clauses, queue,
2210- queue.begin ());
2211- break ;
2212- case llvm::omp::Directive::OMPD_ordered:
2195+ if (directive.v == llvm::omp::Directive::OMPD_ordered) {
2196+ // Standalone "ordered" directive.
22132197 genOrderedOp (converter, symTable, semaCtx, eval, currentLocation, clauses,
22142198 queue, queue.begin ());
2215- break ;
2199+ } else {
2200+ // Dispatch handles the "block-associated" variant of "ordered".
2201+ genOMPDispatch (converter, symTable, semaCtx, eval, currentLocation, queue,
2202+ queue.begin ());
22162203 }
22172204}
22182205
@@ -2466,8 +2453,7 @@ genOMP(Fortran::lower::AbstractConverter &converter,
24662453 ConstructQueue queue{buildConstructQueue (
24672454 converter.getFirOpBuilder ().getModule (), semaCtx, eval,
24682455 sectionConstruct.source , llvm::omp::Directive::OMPD_section, {})};
2469- genSectionOp (converter, symTable, semaCtx, eval, loc,
2470- /* clauses=*/ {}, queue, queue.begin ());
2456+ genOMPDispatch (converter, symTable, semaCtx, eval, loc, queue, queue.begin ());
24712457}
24722458
24732459static void
0 commit comments