@@ -1336,19 +1336,18 @@ static void genWorkshareClauses(lower::AbstractConverter &converter,
13361336 cp.processNowait (clauseOps);
13371337}
13381338
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 ) {
13441344 ClauseProcessor cp (converter, semaCtx, clauses);
13451345 cp.processAllocate (clauseOps);
13461346 cp.processIf (llvm::omp::Directive::OMPD_teams, clauseOps);
13471347 cp.processNumTeams (stmtCtx, clauseOps);
13481348 cp.processThreadLimit (stmtCtx, clauseOps);
1349+ cp.processReduction (loc, clauseOps, reductionSyms);
13491350 // TODO Support delayed privatization.
1350-
1351- cp.processTODO <clause::Reduction>(loc, llvm::omp::Directive::OMPD_teams);
13521351}
13531352
13541353static void genWsloopClauses (
@@ -2015,13 +2014,29 @@ genTeamsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
20152014 mlir::Location loc, const ConstructQueue &queue,
20162015 ConstructQueue::const_iterator item) {
20172016 lower::StatementContext stmtCtx;
2017+
20182018 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+ };
20202034
20212035 return genOpWithBody<mlir::omp::TeamsOp>(
20222036 OpWithBodyGenInfo (converter, symTable, semaCtx, loc, eval,
20232037 llvm::omp::Directive::OMPD_teams)
2024- .setClauses (&item->clauses ),
2038+ .setClauses (&item->clauses )
2039+ .setGenRegionEntryCb (genRegionEntryCB),
20252040 queue, item, clauseOps);
20262041}
20272042
0 commit comments