@@ -1959,6 +1959,9 @@ static void genOMPDispatch(Fortran::lower::AbstractConverter &converter,
1959
1959
const List<Clause> &clauses = item->clauses ;
1960
1960
1961
1961
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 ;
1962
1965
case llvm::omp::Directive::OMPD_distribute:
1963
1966
genDistributeOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
1964
1967
item);
@@ -1968,22 +1971,25 @@ static void genOMPDispatch(Fortran::lower::AbstractConverter &converter,
1968
1971
break ;
1969
1972
case llvm::omp::Directive::OMPD_loop:
1970
1973
case llvm::omp::Directive::OMPD_masked:
1971
- case llvm::omp::Directive::OMPD_tile:
1972
- case llvm::omp::Directive::OMPD_unroll:
1973
1974
TODO (loc, " Unhandled loop directive (" +
1974
1975
llvm::omp::getOpenMPDirectiveName (dir) + " )" );
1975
1976
break ;
1976
1977
case llvm::omp::Directive::OMPD_master:
1977
1978
genMasterOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item);
1978
1979
break ;
1979
1980
case llvm::omp::Directive::OMPD_ordered:
1981
+ // Block-associated "ordered" construct.
1980
1982
genOrderedRegionOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
1981
1983
item);
1982
1984
break ;
1983
1985
case llvm::omp::Directive::OMPD_parallel:
1984
1986
genParallelOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item,
1985
1987
/* outerCombined=*/ false );
1986
1988
break ;
1989
+ case llvm::omp::Directive::OMPD_section:
1990
+ genSectionOp (converter, symTable, semaCtx, eval, loc, /* clauses=*/ {}, queue,
1991
+ item);
1992
+ break ;
1987
1993
case llvm::omp::Directive::OMPD_sections:
1988
1994
genSectionsOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
1989
1995
item);
@@ -2025,16 +2031,28 @@ static void genOMPDispatch(Fortran::lower::AbstractConverter &converter,
2025
2031
genTaskloopOp (converter, symTable, semaCtx, eval, loc, clauses, queue,
2026
2032
item);
2027
2033
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 ;
2028
2041
case llvm::omp::Directive::OMPD_teams:
2029
2042
genTeamsOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item);
2030
2043
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) + " )" );
2031
2048
// case llvm::omp::Directive::OMPD_workdistribute:
2032
2049
case llvm::omp::Directive::OMPD_workshare:
2033
2050
// FIXME: Workshare is not a commonly used OpenMP construct, an
2034
2051
// implementation for this feature will come later. For the codes
2035
2052
// that use this construct, add a single construct for now.
2036
2053
genSingleOp (converter, symTable, semaCtx, eval, loc, clauses, queue, item);
2037
2054
break ;
2055
+
2038
2056
// Composite constructs
2039
2057
case llvm::omp::Directive::OMPD_distribute_parallel_do:
2040
2058
genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
@@ -2174,45 +2192,14 @@ static void genOMP(Fortran::lower::AbstractConverter &converter,
2174
2192
ConstructQueue queue{
2175
2193
buildConstructQueue (converter.getFirOpBuilder ().getModule (), semaCtx,
2176
2194
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.
2213
2197
genOrderedOp (converter, symTable, semaCtx, eval, currentLocation, clauses,
2214
2198
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 ());
2216
2203
}
2217
2204
}
2218
2205
@@ -2466,8 +2453,7 @@ genOMP(Fortran::lower::AbstractConverter &converter,
2466
2453
ConstructQueue queue{buildConstructQueue (
2467
2454
converter.getFirOpBuilder ().getModule (), semaCtx, eval,
2468
2455
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 ());
2471
2457
}
2472
2458
2473
2459
static void
0 commit comments