From: Valentin Clement Date: Thu, 5 Nov 2020 00:30:39 +0000 (-0500) Subject: [flang][openacc] Lower init and shutdown directive X-Git-Tag: llvmorg-13-init~7036 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4ec7f7e45a6c12c6cc2fea36cf15e90ebb1bb6ea;p=platform%2Fupstream%2Fllvm.git [flang][openacc] Lower init and shutdown directive This patch upstream the lowering of Init and Shutdown directives that was initially done in https://github.com/flang-compiler/f18-llvm-project/pull/529 Reviewed By: schweitz Differential Revision: https://reviews.llvm.org/D90488 --- diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 6ec2e9f..3db6656 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -725,6 +725,62 @@ genACCExitDataOp(Fortran::lower::AbstractConverter &converter, exitDataOp.finalizeAttr(firOpBuilder.getUnitAttr()); } +template +static void +genACCInitShutdownOp(Fortran::lower::AbstractConverter &converter, + const Fortran::parser::AccClauseList &accClauseList) { + mlir::Value ifCond, deviceNum; + SmallVector deviceTypeOperands; + + auto &firOpBuilder = converter.getFirOpBuilder(); + auto currentLocation = converter.getCurrentLocation(); + + // Lower clauses values mapped to operands. + // Keep track of each group of operands separatly as clauses can appear + // more than once. + for (const auto &clause : accClauseList.v) { + if (const auto *ifClause = + std::get_if(&clause.u)) { + mlir::Value cond = fir::getBase( + converter.genExprValue(*Fortran::semantics::GetExpr(ifClause->v))); + ifCond = firOpBuilder.createConvert(currentLocation, + firOpBuilder.getI1Type(), cond); + } else if (const auto *deviceNumClause = + std::get_if( + &clause.u)) { + deviceNum = fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(deviceNumClause->v))); + } else if (const auto *deviceTypeClause = + std::get_if( + &clause.u)) { + + const auto &deviceTypeValue = deviceTypeClause->v; + if (deviceTypeValue) { + for (const auto &scalarIntExpr : *deviceTypeValue) { + mlir::Value expr = fir::getBase(converter.genExprValue( + *Fortran::semantics::GetExpr(scalarIntExpr))); + deviceTypeOperands.push_back(expr); + } + } else { + // * was passed as value and will be represented as a -1 constant + // integer. + mlir::Value star = firOpBuilder.createIntegerConstant( + currentLocation, firOpBuilder.getIntegerType(32), /* STAR */ -1); + deviceTypeOperands.push_back(star); + } + } + } + + // Prepare the operand segement size attribute and the operands value range. + SmallVector operands; + SmallVector operandSegments; + addOperands(operands, operandSegments, deviceTypeOperands); + addOperand(operands, operandSegments, deviceNum); + addOperand(operands, operandSegments, ifCond); + + createSimpleOp(firOpBuilder, currentLocation, operands, operandSegments); +} + static void genACCUpdateOp(Fortran::lower::AbstractConverter &converter, const Fortran::parser::AccClauseList &accClauseList) { @@ -845,9 +901,9 @@ genACC(Fortran::lower::AbstractConverter &converter, } else if (standaloneDirective.v == llvm::acc::Directive::ACCD_exit_data) { genACCExitDataOp(converter, accClauseList); } else if (standaloneDirective.v == llvm::acc::Directive::ACCD_init) { - TODO("OpenACC init directive not lowered yet!"); + genACCInitShutdownOp(converter, accClauseList); } else if (standaloneDirective.v == llvm::acc::Directive::ACCD_shutdown) { - TODO("OpenACC shutdown directive not lowered yet!"); + genACCInitShutdownOp(converter, accClauseList); } else if (standaloneDirective.v == llvm::acc::Directive::ACCD_set) { TODO("OpenACC set directive not lowered yet!"); } else if (standaloneDirective.v == llvm::acc::Directive::ACCD_update) {