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
|
/// Creates a reduction declaration and associates it with an OpenMP block
|
||||||
/// directive.
|
/// directive.
|
||||||
template <typename OpType, typename RedOperatorListTy>
|
template <typename OpType, typename RedOperatorListTy>
|
||||||
static void processReductionArguments(
|
static bool processReductionArguments(
|
||||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||||
const RedOperatorListTy &redOperatorList,
|
const RedOperatorListTy &redOperatorList,
|
||||||
llvm::SmallVectorImpl<mlir::Value> &reductionVars,
|
llvm::SmallVectorImpl<mlir::Value> &reductionVars,
|
||||||
|
@ -2125,9 +2125,10 @@ private:
|
|||||||
|
|
||||||
llvm::SmallVector<mlir::Value> reduceVars;
|
llvm::SmallVector<mlir::Value> reduceVars;
|
||||||
Fortran::lower::omp::ReductionProcessor rp;
|
Fortran::lower::omp::ReductionProcessor rp;
|
||||||
rp.processReductionArguments<fir::DeclareReductionOp>(
|
bool result = rp.processReductionArguments<fir::DeclareReductionOp>(
|
||||||
toLocation(), *this, info.reduceOperatorList, reduceVars,
|
toLocation(), *this, info.reduceOperatorList, reduceVars,
|
||||||
reduceVarByRef, reductionDeclSymbols, info.reduceSymList);
|
reduceVarByRef, reductionDeclSymbols, info.reduceSymList);
|
||||||
|
assert(result && "Failed to process `do concurrent` reductions");
|
||||||
|
|
||||||
doConcurrentLoopOp.getReduceVarsMutable().assign(reduceVars);
|
doConcurrentLoopOp.getReduceVarsMutable().assign(reduceVars);
|
||||||
doConcurrentLoopOp.setReduceSymsAttr(
|
doConcurrentLoopOp.setReduceSymsAttr(
|
||||||
|
@ -1116,11 +1116,12 @@ bool ClauseProcessor::processInReduction(
|
|||||||
collectReductionSyms(clause, inReductionSyms);
|
collectReductionSyms(clause, inReductionSyms);
|
||||||
|
|
||||||
ReductionProcessor rp;
|
ReductionProcessor rp;
|
||||||
rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
if (!rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||||
currentLocation, converter,
|
currentLocation, converter,
|
||||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||||
inReductionVars, inReduceVarByRef, inReductionDeclSymbols,
|
inReductionVars, inReduceVarByRef, inReductionDeclSymbols,
|
||||||
inReductionSyms);
|
inReductionSyms))
|
||||||
|
inReductionSyms.clear();
|
||||||
|
|
||||||
// Copy local lists into the output.
|
// Copy local lists into the output.
|
||||||
llvm::copy(inReductionVars, std::back_inserter(result.inReductionVars));
|
llvm::copy(inReductionVars, std::back_inserter(result.inReductionVars));
|
||||||
@ -1461,10 +1462,12 @@ bool ClauseProcessor::processReduction(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReductionProcessor rp;
|
ReductionProcessor rp;
|
||||||
rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
if (!rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||||
currentLocation, converter,
|
currentLocation, converter,
|
||||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||||
reductionVars, reduceVarByRef, reductionDeclSymbols, reductionSyms);
|
reductionVars, reduceVarByRef, reductionDeclSymbols,
|
||||||
|
reductionSyms))
|
||||||
|
reductionSyms.clear();
|
||||||
// Copy local lists into the output.
|
// Copy local lists into the output.
|
||||||
llvm::copy(reductionVars, std::back_inserter(result.reductionVars));
|
llvm::copy(reductionVars, std::back_inserter(result.reductionVars));
|
||||||
llvm::copy(reduceVarByRef, std::back_inserter(result.reductionByref));
|
llvm::copy(reduceVarByRef, std::back_inserter(result.reductionByref));
|
||||||
@ -1486,11 +1489,12 @@ bool ClauseProcessor::processTaskReduction(
|
|||||||
collectReductionSyms(clause, taskReductionSyms);
|
collectReductionSyms(clause, taskReductionSyms);
|
||||||
|
|
||||||
ReductionProcessor rp;
|
ReductionProcessor rp;
|
||||||
rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
if (!rp.processReductionArguments<mlir::omp::DeclareReductionOp>(
|
||||||
currentLocation, converter,
|
currentLocation, converter,
|
||||||
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
std::get<typename omp::clause::ReductionOperatorList>(clause.t),
|
||||||
taskReductionVars, taskReduceVarByRef, taskReductionDeclSymbols,
|
taskReductionVars, taskReduceVarByRef, taskReductionDeclSymbols,
|
||||||
taskReductionSyms);
|
taskReductionSyms))
|
||||||
|
taskReductionSyms.clear();
|
||||||
// Copy local lists into the output.
|
// Copy local lists into the output.
|
||||||
llvm::copy(taskReductionVars,
|
llvm::copy(taskReductionVars,
|
||||||
std::back_inserter(result.taskReductionVars));
|
std::back_inserter(result.taskReductionVars));
|
||||||
|
@ -39,7 +39,7 @@ namespace lower {
|
|||||||
namespace omp {
|
namespace omp {
|
||||||
|
|
||||||
// explicit template declarations
|
// explicit template declarations
|
||||||
template void ReductionProcessor::processReductionArguments<
|
template bool ReductionProcessor::processReductionArguments<
|
||||||
mlir::omp::DeclareReductionOp, omp::clause::ReductionOperatorList>(
|
mlir::omp::DeclareReductionOp, omp::clause::ReductionOperatorList>(
|
||||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||||
const omp::clause::ReductionOperatorList &redOperatorList,
|
const omp::clause::ReductionOperatorList &redOperatorList,
|
||||||
@ -48,7 +48,7 @@ template void ReductionProcessor::processReductionArguments<
|
|||||||
llvm::SmallVectorImpl<mlir::Attribute> &reductionDeclSymbols,
|
llvm::SmallVectorImpl<mlir::Attribute> &reductionDeclSymbols,
|
||||||
const llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSymbols);
|
const llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSymbols);
|
||||||
|
|
||||||
template void ReductionProcessor::processReductionArguments<
|
template bool ReductionProcessor::processReductionArguments<
|
||||||
fir::DeclareReductionOp, llvm::SmallVector<fir::ReduceOperationEnum>>(
|
fir::DeclareReductionOp, llvm::SmallVector<fir::ReduceOperationEnum>>(
|
||||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||||
const llvm::SmallVector<fir::ReduceOperationEnum> &redOperatorList,
|
const llvm::SmallVector<fir::ReduceOperationEnum> &redOperatorList,
|
||||||
@ -607,7 +607,7 @@ static bool doReductionByRef(mlir::Value reductionVar) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename OpType, typename RedOperatorListTy>
|
template <typename OpType, typename RedOperatorListTy>
|
||||||
void ReductionProcessor::processReductionArguments(
|
bool ReductionProcessor::processReductionArguments(
|
||||||
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
mlir::Location currentLocation, lower::AbstractConverter &converter,
|
||||||
const RedOperatorListTy &redOperatorList,
|
const RedOperatorListTy &redOperatorList,
|
||||||
llvm::SmallVectorImpl<mlir::Value> &reductionVars,
|
llvm::SmallVectorImpl<mlir::Value> &reductionVars,
|
||||||
@ -627,10 +627,10 @@ void ReductionProcessor::processReductionArguments(
|
|||||||
std::get_if<omp::clause::ProcedureDesignator>(&redOperator.u)) {
|
std::get_if<omp::clause::ProcedureDesignator>(&redOperator.u)) {
|
||||||
if (!ReductionProcessor::supportedIntrinsicProcReduction(
|
if (!ReductionProcessor::supportedIntrinsicProcReduction(
|
||||||
*reductionIntrinsic)) {
|
*reductionIntrinsic)) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -765,6 +765,8 @@ void ReductionProcessor::processReductionArguments(
|
|||||||
|
|
||||||
if (isDoConcurrent)
|
if (isDoConcurrent)
|
||||||
builder.restoreInsertionPoint(dcIP);
|
builder.restoreInsertionPoint(dcIP);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const semantics::SourceName
|
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