Fixes #149089 and #149700. Before #145837, when processing a reduction symbol not yet supported by OpenMP lowering, the reduction processor would simply skip filling in the reduction symbols and variables. With #145837, this behvaior was slightly changed because the reduction symbols are populated before invoking the reduction processor (this is more convenient to shared the code with `do concurrent`). This PR restores the previous behavior.
This commit is contained in:
parent
77b1b956da
commit
36c37b019b
@ -124,7 +124,7 @@ public:
|
||||
/// Creates a reduction declaration and associates it with an OpenMP block
|
||||
/// directive.
|
||||
template <typename OpType, typename RedOperatorListTy>
|
||||
static void processReductionArguments(
|
||||
static bool processReductionArguments(
|
||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||
const RedOperatorListTy &redOperatorList,
|
||||
llvm::SmallVectorImpl<mlir::Value> &reductionVars,
|
||||
|
@ -2125,9 +2125,10 @@ private:
|
||||
|
||||
llvm::SmallVector<mlir::Value> reduceVars;
|
||||
Fortran::lower::omp::ReductionProcessor rp;
|
||||
rp.processReductionArguments<fir::DeclareReductionOp>(
|
||||
bool result = rp.processReductionArguments<fir::DeclareReductionOp>(
|
||||
toLocation(), *this, info.reduceOperatorList, reduceVars,
|
||||
reduceVarByRef, reductionDeclSymbols, info.reduceSymList);
|
||||
assert(result && "Failed to process `do concurrent` reductions");
|
||||
|
||||
doConcurrentLoopOp.getReduceVarsMutable().assign(reduceVars);
|
||||
doConcurrentLoopOp.setReduceSymsAttr(
|
||||
|
@ -1116,11 +1116,12 @@ bool ClauseProcessor::processInReduction(
|
||||
collectReductionSyms(clause, inReductionSyms);
|
||||
|
||||
ReductionProcessor rp;
|
||||
rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||
currentLocation, converter,
|
||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||
inReductionVars, inReduceVarByRef, inReductionDeclSymbols,
|
||||
inReductionSyms);
|
||||
if (!rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||
currentLocation, converter,
|
||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||
inReductionVars, inReduceVarByRef, inReductionDeclSymbols,
|
||||
inReductionSyms))
|
||||
inReductionSyms.clear();
|
||||
|
||||
// Copy local lists into the output.
|
||||
llvm::copy(inReductionVars, std::back_inserter(result.inReductionVars));
|
||||
@ -1461,10 +1462,12 @@ bool ClauseProcessor::processReduction(
|
||||
}
|
||||
|
||||
ReductionProcessor rp;
|
||||
rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||
currentLocation, converter,
|
||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||
reductionVars, reduceVarByRef, reductionDeclSymbols, reductionSyms);
|
||||
if (!rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||
currentLocation, converter,
|
||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||
reductionVars, reduceVarByRef, reductionDeclSymbols,
|
||||
reductionSyms))
|
||||
reductionSyms.clear();
|
||||
// Copy local lists into the output.
|
||||
llvm::copy(reductionVars, std::back_inserter(result.reductionVars));
|
||||
llvm::copy(reduceVarByRef, std::back_inserter(result.reductionByref));
|
||||
@ -1486,11 +1489,12 @@ bool ClauseProcessor::processTaskReduction(
|
||||
collectReductionSyms(clause, taskReductionSyms);
|
||||
|
||||
ReductionProcessor rp;
|
||||
rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||
currentLocation, converter,
|
||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||
taskReductionVars, taskReduceVarByRef, taskReductionDeclSymbols,
|
||||
taskReductionSyms);
|
||||
if (!rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||
currentLocation, converter,
|
||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||
taskReductionVars, taskReduceVarByRef, taskReductionDeclSymbols,
|
||||
taskReductionSyms))
|
||||
taskReductionSyms.clear();
|
||||
// Copy local lists into the output.
|
||||
llvm::copy(taskReductionVars,
|
||||
std::back_inserter(result.taskReductionVars));
|
||||
|
@ -39,7 +39,7 @@ namespace lower {
|
||||
namespace omp {
|
||||
|
||||
// explicit template declarations
|
||||
template void ReductionProcessor::processReductionArguments<
|
||||
template bool ReductionProcessor::processReductionArguments<
|
||||
mlir::omp::DeclareReductionOp, omp::clause::ReductionOperatorList>(
|
||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||
const omp::clause::ReductionOperatorList &redOperatorList,
|
||||
@ -48,7 +48,7 @@ template void ReductionProcessor::processReductionArguments<
|
||||
llvm::SmallVectorImpl<mlir::Attribute> &reductionDeclSymbols,
|
||||
const llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSymbols);
|
||||
|
||||
template void ReductionProcessor::processReductionArguments<
|
||||
template bool ReductionProcessor::processReductionArguments<
|
||||
fir::DeclareReductionOp, llvm::SmallVector<fir::ReduceOperationEnum>>(
|
||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||
const llvm::SmallVector<fir::ReduceOperationEnum> &redOperatorList,
|
||||
@ -607,7 +607,7 @@ static bool doReductionByRef(mlir::Value reductionVar) {
|
||||
}
|
||||
|
||||
template <typename OpType, typename RedOperatorListTy>
|
||||
void ReductionProcessor::processReductionArguments(
|
||||
bool ReductionProcessor::processReductionArguments(
|
||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||
const RedOperatorListTy &redOperatorList,
|
||||
llvm::SmallVectorImpl<mlir::Value> &reductionVars,
|
||||
@ -627,10 +627,10 @@ void ReductionProcessor::processReductionArguments(
|
||||
std::get_if<omp::clause::ProcedureDesignator>(&redOperator.u)) {
|
||||
if (!ReductionProcessor::supportedIntrinsicProcReduction(
|
||||
*reductionIntrinsic)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -765,6 +765,8 @@ void ReductionProcessor::processReductionArguments(
|
||||
|
||||
if (isDoConcurrent)
|
||||
builder.restoreInsertionPoint(dcIP);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const semantics::SourceName
|
||||
|
25
flang/test/Lower/OpenMP/wsloop-reduction-non-intrinsic.f90
Normal file
25
flang/test/Lower/OpenMP/wsloop-reduction-non-intrinsic.f90
Normal file
@ -0,0 +1,25 @@
|
||||
! Tests reduction processor behavior when a reduction symbol is not supported.
|
||||
|
||||
! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
subroutine foo
|
||||
implicit none
|
||||
integer :: k, i
|
||||
|
||||
interface max
|
||||
function max(m1,m2)
|
||||
integer :: m1, m2
|
||||
end function
|
||||
end interface
|
||||
|
||||
!$omp do reduction (max: k)
|
||||
do i=1,10
|
||||
end do
|
||||
!$omp end do
|
||||
end
|
||||
|
||||
! Verify that unsupported reduction is ignored.
|
||||
! CHECK: omp.wsloop
|
||||
! CHECK-SAME: private(@{{[^[:space:]]+}} %{{[^[:space:]]+}}
|
||||
! CHECK-SAME: -> %{{[^[:space:]]+}} : !{{[^[:space:]]+}}) {
|
||||
! CHECK: }
|
Loading…
x
Reference in New Issue
Block a user