diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index c2568c629e521..fd6698d8da326 100644 --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -561,8 +561,7 @@ class ClauseProcessor { bool processDepend(llvm::SmallVectorImpl &dependTypeOperands, llvm::SmallVectorImpl &dependOperands) const; bool - processIf(Fortran::lower::StatementContext &stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier directiveName, + processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier directiveName, mlir::Value &result) const; bool processLink(llvm::SmallVectorImpl &result) const; @@ -1116,7 +1115,6 @@ genDependKindAttr(fir::FirOpBuilder &firOpBuilder, static mlir::Value getIfClauseOperand( Fortran::lower::AbstractConverter &converter, - Fortran::lower::StatementContext &stmtCtx, const Fortran::parser::OmpClause::If *ifClause, Fortran::parser::OmpIfClause::DirectiveNameModifier directiveName, mlir::Location clauseLocation) { @@ -1127,6 +1125,7 @@ static mlir::Value getIfClauseOperand( if (directive && directive.value() != directiveName) return nullptr; + Fortran::lower::StatementContext stmtCtx; fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); auto &expr = std::get(ifClause->v.t); mlir::Value ifVal = fir::getBase( @@ -1672,7 +1671,6 @@ bool ClauseProcessor::processDepend( } bool ClauseProcessor::processIf( - Fortran::lower::StatementContext &stmtCtx, Fortran::parser::OmpIfClause::DirectiveNameModifier directiveName, mlir::Value &result) const { bool found = false; @@ -1680,7 +1678,7 @@ bool ClauseProcessor::processIf( [&](const ClauseTy::If *ifClause, const Fortran::parser::CharBlock &source) { mlir::Location clauseLocation = converter.genLocation(source); - mlir::Value operand = getIfClauseOperand(converter, stmtCtx, ifClause, + mlir::Value operand = getIfClauseOperand(converter, ifClause, directiveName, clauseLocation); // Assume that, at most, a single 'if' clause will be applicable to the // given directive. @@ -2305,8 +2303,7 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector reductionDeclSymbols; ClauseProcessor cp(converter, clauseList); - cp.processIf(stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier::Parallel, + cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Parallel, ifClauseOperand); cp.processNumThreads(stmtCtx, numThreadsClauseOperand); cp.processProcBind(procBindKindAttr); @@ -2359,8 +2356,7 @@ genTaskOp(Fortran::lower::AbstractConverter &converter, dependOperands; ClauseProcessor cp(converter, clauseList); - cp.processIf(stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier::Task, + cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Task, ifClauseOperand); cp.processAllocate(allocatorOperands, allocateOperands); cp.processDefault(); @@ -2417,8 +2413,7 @@ genDataOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector useDeviceSymbols; ClauseProcessor cp(converter, clauseList); - cp.processIf(stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier::TargetData, + cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::TargetData, ifClauseOperand); cp.processDevice(stmtCtx, deviceOperand); cp.processUseDevicePtr(devicePtrOperands, useDeviceTypes, useDeviceLocs, @@ -2463,7 +2458,7 @@ genEnterExitDataOp(Fortran::lower::AbstractConverter &converter, } ClauseProcessor cp(converter, clauseList); - cp.processIf(stmtCtx, directiveName, ifClauseOperand); + cp.processIf(directiveName, ifClauseOperand); cp.processDevice(stmtCtx, deviceOperand); cp.processNowait(nowaitAttr); cp.processMap(currentLocation, directive, semanticsContext, stmtCtx, @@ -2587,8 +2582,7 @@ genTargetOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector mapSymbols; ClauseProcessor cp(converter, clauseList); - cp.processIf(stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier::Target, + cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Target, ifClauseOperand); cp.processDevice(stmtCtx, deviceOperand); cp.processThreadLimit(stmtCtx, threadLimitOperand); @@ -2742,8 +2736,7 @@ genTeamsOp(Fortran::lower::AbstractConverter &converter, llvm::SmallVector reductionDeclSymbols; ClauseProcessor cp(converter, clauseList); - cp.processIf(stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier::Teams, + cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Teams, ifClauseOperand); cp.processAllocate(allocatorOperands, allocateOperands); cp.processDefault(); @@ -3018,8 +3011,7 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, llvm::SmallVector alignedVars, nontemporalVars; mlir::Value ifClauseOperand; mlir::IntegerAttr simdlenClauseOperand, safelenClauseOperand; - cp.processIf(stmtCtx, - Fortran::parser::OmpIfClause::DirectiveNameModifier::Simd, + cp.processIf(Fortran::parser::OmpIfClause::DirectiveNameModifier::Simd, ifClauseOperand); cp.processSimdlen(simdlenClauseOperand); cp.processSafelen(safelenClauseOperand); diff --git a/flang/test/Lower/OpenMP/parallel-if.f90 b/flang/test/Lower/OpenMP/parallel-if.f90 new file mode 100644 index 0000000000000..661bc0e46598d --- /dev/null +++ b/flang/test/Lower/OpenMP/parallel-if.f90 @@ -0,0 +1,12 @@ +!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s + +!CHECK-LABEL: func @_QPtest1 +subroutine test1(a) +integer :: a(:,:) +!CHECK: hlfir.destroy +!CHECK: omp.parallel if +!$omp parallel if(any(a .eq. 1)) +!CHECK-NOT: hlfir.destroy + print *, "Hello" +!$omp end parallel +end subroutine