@@ -1533,6 +1533,24 @@ static OpTy genWrapperOp(lower::AbstractConverter &converter,
15331533// Code generation functions for clauses
15341534// ===----------------------------------------------------------------------===//
15351535
1536+ static void genCancelClauses (lower::AbstractConverter &converter,
1537+ semantics::SemanticsContext &semaCtx,
1538+ const List<Clause> &clauses, mlir::Location loc,
1539+ mlir::omp::CancelOperands &clauseOps) {
1540+ ClauseProcessor cp (converter, semaCtx, clauses);
1541+ cp.processCancelDirectiveName (clauseOps);
1542+ cp.processIf (llvm::omp::Directive::OMPD_cancel, clauseOps);
1543+ }
1544+
1545+ static void
1546+ genCancellationPointClauses (lower::AbstractConverter &converter,
1547+ semantics::SemanticsContext &semaCtx,
1548+ const List<Clause> &clauses, mlir::Location loc,
1549+ mlir::omp::CancellationPointOperands &clauseOps) {
1550+ ClauseProcessor cp (converter, semaCtx, clauses);
1551+ cp.processCancelDirectiveName (clauseOps);
1552+ }
1553+
15361554static void genCriticalDeclareClauses (
15371555 lower::AbstractConverter &converter, semantics::SemanticsContext &semaCtx,
15381556 const List<Clause> &clauses, mlir::Location loc,
@@ -1849,6 +1867,31 @@ genBarrierOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
18491867 return converter.getFirOpBuilder ().create <mlir::omp::BarrierOp>(loc);
18501868}
18511869
1870+ static mlir::omp::CancelOp genCancelOp (lower::AbstractConverter &converter,
1871+ semantics::SemanticsContext &semaCtx,
1872+ lower::pft::Evaluation &eval,
1873+ mlir::Location loc,
1874+ const ConstructQueue &queue,
1875+ ConstructQueue::const_iterator item) {
1876+ mlir::omp::CancelOperands clauseOps;
1877+ genCancelClauses (converter, semaCtx, item->clauses , loc, clauseOps);
1878+
1879+ return converter.getFirOpBuilder ().create <mlir::omp::CancelOp>(loc,
1880+ clauseOps);
1881+ }
1882+
1883+ static mlir::omp::CancellationPointOp genCancellationPointOp (
1884+ lower::AbstractConverter &converter, semantics::SemanticsContext &semaCtx,
1885+ lower::pft::Evaluation &eval, mlir::Location loc,
1886+ const ConstructQueue &queue, ConstructQueue::const_iterator item) {
1887+ mlir::omp::CancellationPointOperands clauseOps;
1888+ genCancellationPointClauses (converter, semaCtx, item->clauses , loc,
1889+ clauseOps);
1890+
1891+ return converter.getFirOpBuilder ().create <mlir::omp::CancellationPointOp>(
1892+ loc, clauseOps);
1893+ }
1894+
18521895static mlir::omp::CriticalOp
18531896genCriticalOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
18541897 semantics::SemanticsContext &semaCtx,
@@ -3354,15 +3397,32 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
33543397 semantics::SemanticsContext &semaCtx,
33553398 lower::pft::Evaluation &eval,
33563399 const parser::OpenMPCancelConstruct &cancelConstruct) {
3357- TODO (converter.getCurrentLocation (), " OpenMPCancelConstruct" );
3400+ List<Clause> clauses = makeList (cancelConstruct.v .Clauses ().v , [&](auto &&s) {
3401+ return makeClause (s, semaCtx);
3402+ });
3403+ mlir::Location loc = converter.genLocation (cancelConstruct.source );
3404+
3405+ ConstructQueue queue{buildConstructQueue (
3406+ converter.getFirOpBuilder ().getModule (), semaCtx, eval,
3407+ cancelConstruct.source , llvm::omp::Directive::OMPD_cancel, clauses)};
3408+ genCancelOp (converter, semaCtx, eval, loc, queue, queue.begin ());
33583409}
33593410
33603411static void genOMP (lower::AbstractConverter &converter, lower::SymMap &symTable,
33613412 semantics::SemanticsContext &semaCtx,
33623413 lower::pft::Evaluation &eval,
33633414 const parser::OpenMPCancellationPointConstruct
33643415 &cancellationPointConstruct) {
3365- TODO (converter.getCurrentLocation (), " OpenMPCancelConstruct" );
3416+ List<Clause> clauses =
3417+ makeList (cancellationPointConstruct.v .Clauses ().v ,
3418+ [&](auto &&s) { return makeClause (s, semaCtx); });
3419+ mlir::Location loc = converter.genLocation (cancellationPointConstruct.source );
3420+
3421+ ConstructQueue queue{
3422+ buildConstructQueue (converter.getFirOpBuilder ().getModule (), semaCtx,
3423+ eval, cancellationPointConstruct.source ,
3424+ llvm::omp::Directive::OMPD_cancel, clauses)};
3425+ genCancellationPointOp (converter, semaCtx, eval, loc, queue, queue.begin ());
33663426}
33673427
33683428static void genOMP (lower::AbstractConverter &converter, lower::SymMap &symTable,
0 commit comments