@@ -1336,19 +1336,18 @@ static void genWorkshareClauses(lower::AbstractConverter &converter,
1336
1336
cp.processNowait (clauseOps);
1337
1337
}
1338
1338
1339
- static void genTeamsClauses (lower::AbstractConverter &converter,
1340
- semantics::SemanticsContext &semaCtx,
1341
- lower::StatementContext &stmtCtx,
1342
- const List<Clause> &clauses , mlir::Location loc ,
1343
- mlir::omp::TeamsOperands &clauseOps ) {
1339
+ static void genTeamsClauses (
1340
+ lower::AbstractConverter &converter, semantics::SemanticsContext &semaCtx,
1341
+ lower::StatementContext &stmtCtx, const List<Clause> &clauses ,
1342
+ mlir::Location loc , mlir::omp::TeamsOperands &clauseOps ,
1343
+ llvm::SmallVectorImpl< const semantics::Symbol *> &reductionSyms ) {
1344
1344
ClauseProcessor cp (converter, semaCtx, clauses);
1345
1345
cp.processAllocate (clauseOps);
1346
1346
cp.processIf (llvm::omp::Directive::OMPD_teams, clauseOps);
1347
1347
cp.processNumTeams (stmtCtx, clauseOps);
1348
1348
cp.processThreadLimit (stmtCtx, clauseOps);
1349
+ cp.processReduction (loc, clauseOps, reductionSyms);
1349
1350
// TODO Support delayed privatization.
1350
-
1351
- cp.processTODO <clause::Reduction>(loc, llvm::omp::Directive::OMPD_teams);
1352
1351
}
1353
1352
1354
1353
static void genWsloopClauses (
@@ -2015,13 +2014,29 @@ genTeamsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
2015
2014
mlir::Location loc, const ConstructQueue &queue,
2016
2015
ConstructQueue::const_iterator item) {
2017
2016
lower::StatementContext stmtCtx;
2017
+
2018
2018
mlir::omp::TeamsOperands clauseOps;
2019
- genTeamsClauses (converter, semaCtx, stmtCtx, item->clauses , loc, clauseOps);
2019
+ llvm::SmallVector<const semantics::Symbol *> reductionSyms;
2020
+ genTeamsClauses (converter, semaCtx, stmtCtx, item->clauses , loc, clauseOps,
2021
+ reductionSyms);
2022
+
2023
+ EntryBlockArgs args;
2024
+ // TODO: Add private syms and vars.
2025
+ args.reduction .syms = reductionSyms;
2026
+ args.reduction .vars = clauseOps.reductionVars ;
2027
+
2028
+ auto genRegionEntryCB = [&](mlir::Operation *op) {
2029
+ genEntryBlock (converter.getFirOpBuilder (), args, op->getRegion (0 ));
2030
+ bindEntryBlockArgs (
2031
+ converter, llvm::cast<mlir::omp::BlockArgOpenMPOpInterface>(op), args);
2032
+ return llvm::to_vector (args.getSyms ());
2033
+ };
2020
2034
2021
2035
return genOpWithBody<mlir::omp::TeamsOp>(
2022
2036
OpWithBodyGenInfo (converter, symTable, semaCtx, loc, eval,
2023
2037
llvm::omp::Directive::OMPD_teams)
2024
- .setClauses (&item->clauses ),
2038
+ .setClauses (&item->clauses )
2039
+ .setGenRegionEntryCb (genRegionEntryCB),
2025
2040
queue, item, clauseOps);
2026
2041
}
2027
2042
0 commit comments