[flang-commits] [flang] [flang][OpenACC] Support DO CONCURRENT locality specs inside ACC constructs (PR #190406)
via flang-commits
flang-commits at lists.llvm.org
Fri Apr 3 14:14:35 PDT 2026
https://github.com/khaki3 updated https://github.com/llvm/llvm-project/pull/190406
>From 3b882088d96b9f32f21b3bf43d08b6f21e3e7344 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 2 Apr 2026 19:28:19 -0700
Subject: [PATCH 1/6] [flang][OpenACC] Support DO CONCURRENT locality specs
inside ACC constructs
Handle REDUCE, LOCAL, and LOCAL_INIT locality specs on DO CONCURRENT
loops that appear inside OpenACC compute constructs (kernels, parallel)
and combined directives (kernels loop, parallel loop).
- REDUCE locality spec is lowered to acc.reduction operations with
the appropriate reduction recipe.
- LOCAL locality spec is lowered to acc.private operations.
- LOCAL_INIT locality spec is lowered to acc.firstprivate operations.
- SHARED and DEFAULT(NONE) are ignored (variables are already accessible).
Also fix pre-existing build errors where createOrGetReductionRecipe,
createOrGetPrivateRecipe, and createOrGetFirstprivateRecipe were called
with mlir::Type instead of mlir::Value after an upstream API change.
Made-with: Cursor
---
flang/lib/Lower/OpenACC.cpp | 116 ++++++++-
.../OpenACC/acc-do-concurrent-locality.f90 | 241 ++++++++++++++++++
2 files changed, 351 insertions(+), 6 deletions(-)
create mode 100644 flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 2154f38dca568..fc137e76ffba5 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -1181,7 +1181,8 @@ genReductions(const Fortran::parser::AccObjectListWithReduction &objectList,
fastMathAttr = mlir::arith::FastMathFlagsAttr::get(
builder.getContext(), builder.getFastMathFlags());
mlir::SymbolRefAttr recipe = fir::acc::createOrGetReductionRecipe(
- builder, operandLocation, info.addr, mlirOp, bounds, fastMathAttr);
+ builder, operandLocation, op.getAccVar(), mlirOp, bounds,
+ fastMathAttr);
op.setRecipeAttr(recipe);
reductionOperands.push_back(op.getAccVar());
// Track the symbol and its corresponding mlir::Value if requested so that
@@ -1553,6 +1554,103 @@ static void visitLoopControl(
}
}
+// Process DO CONCURRENT locality specs (REDUCE, LOCAL, LOCAL_INIT, SHARED)
+// that appear inside an ACC construct, converting them to the corresponding
+// ACC clauses.
+static void processDoConcurrentLocalitySpecs(
+ Fortran::lower::AbstractConverter &converter, mlir::Location loc,
+ fir::FirOpBuilder &builder,
+ const std::list<Fortran::parser::LocalitySpec> &localityList,
+ llvm::SmallVector<mlir::Value> &privateOperands,
+ llvm::SmallVector<mlir::Value> &reductionOperands, AccDataMap &dataMap) {
+ for (const Fortran::parser::LocalitySpec &locSpec : localityList) {
+ if (const auto *reduceSpec =
+ std::get_if<Fortran::parser::LocalitySpec::Reduce>(&locSpec.u)) {
+ const auto &reduceOp =
+ std::get<Fortran::parser::ReductionOperator>(reduceSpec->t);
+ const auto &names =
+ std::get<std::list<Fortran::parser::Name>>(reduceSpec->t);
+ for (const Fortran::parser::Name &name : names) {
+ const Fortran::semantics::Symbol &sym = name.symbol->GetUltimate();
+ mlir::Value symAddr = converter.getSymbolAddress(sym);
+ assert(symAddr && "expected symbol to have an address");
+
+ mlir::Type reductionTy = fir::unwrapRefType(symAddr.getType());
+ if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(reductionTy))
+ reductionTy = seqTy.getEleTy();
+
+ if (!isSupportedReductionType(reductionTy))
+ TODO(loc, "DO CONCURRENT reduction with unsupported type");
+
+ mlir::acc::ReductionOperator mlirOp =
+ getReductionOperator(reduceOp, reductionTy, converter);
+
+ llvm::SmallVector<mlir::Value> bounds;
+ std::stringstream asFortran;
+ asFortran << Fortran::lower::mangle::demangleName(
+ toStringRef(sym.name()));
+ auto op = createDataEntryOp<mlir::acc::ReductionOp>(
+ builder, loc, symAddr, asFortran, bounds, /*structured=*/true,
+ /*implicit=*/false, mlir::acc::DataClause::acc_reduction,
+ symAddr.getType(),
+ /*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
+ mlir::Attribute fastMathAttr;
+ if (builder.getFastMathFlags() != mlir::arith::FastMathFlags::none)
+ fastMathAttr = mlir::arith::FastMathFlagsAttr::get(
+ builder.getContext(), builder.getFastMathFlags());
+ mlir::SymbolRefAttr recipe = fir::acc::createOrGetReductionRecipe(
+ builder, loc, op.getAccVar(), mlirOp, bounds, fastMathAttr);
+ op.setRecipeAttr(recipe);
+ reductionOperands.push_back(op.getAccVar());
+ dataMap.emplaceSymbol(op.getAccVar(),
+ Fortran::semantics::SymbolRef(sym));
+ }
+ } else if (const auto *localSpec =
+ std::get_if<Fortran::parser::LocalitySpec::Local>(
+ &locSpec.u)) {
+ for (const Fortran::parser::Name &name : localSpec->v) {
+ const Fortran::semantics::Symbol &sym = name.symbol->GetUltimate();
+ mlir::Value symAddr = converter.getSymbolAddress(sym);
+ assert(symAddr && "expected symbol to have an address");
+
+ llvm::SmallVector<mlir::Value> bounds;
+ std::stringstream asFortran;
+ asFortran << Fortran::lower::mangle::demangleName(
+ toStringRef(sym.name()));
+ auto op = createDataEntryOp<mlir::acc::PrivateOp>(
+ builder, loc, symAddr, asFortran, bounds, /*structured=*/true,
+ /*implicit=*/false, mlir::acc::DataClause::acc_private,
+ symAddr.getType(),
+ /*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
+ privateOperands.push_back(op.getAccVar());
+ dataMap.emplaceSymbol(op.getAccVar(),
+ Fortran::semantics::SymbolRef(sym));
+ }
+ } else if (const auto *localInitSpec =
+ std::get_if<Fortran::parser::LocalitySpec::LocalInit>(
+ &locSpec.u)) {
+ for (const Fortran::parser::Name &name : localInitSpec->v) {
+ const Fortran::semantics::Symbol &sym = name.symbol->GetUltimate();
+ mlir::Value symAddr = converter.getSymbolAddress(sym);
+ assert(symAddr && "expected symbol to have an address");
+
+ llvm::SmallVector<mlir::Value> bounds;
+ std::stringstream asFortran;
+ asFortran << Fortran::lower::mangle::demangleName(
+ toStringRef(sym.name()));
+ auto op = createDataEntryOp<mlir::acc::FirstprivateOp>(
+ builder, loc, symAddr, asFortran, bounds, /*structured=*/true,
+ /*implicit=*/false, mlir::acc::DataClause::acc_firstprivate,
+ symAddr.getType(),
+ /*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
+ privateOperands.push_back(op.getAccVar());
+ dataMap.emplaceSymbol(op.getAccVar(),
+ Fortran::semantics::SymbolRef(sym));
+ }
+ }
+ }
+}
+
// Extract loop bounds, steps, induction variables, and privatization info
// for both DO CONCURRENT and regular do loops
static void processDoLoopBounds(
@@ -1570,7 +1668,8 @@ static void processDoLoopBounds(
llvm::SmallVector<mlir::Type> &ivTypes,
llvm::SmallVector<mlir::Location> &ivLocs,
llvm::SmallVector<bool> &inclusiveBounds,
- llvm::SmallVector<mlir::Location> &locs, uint64_t loopsToProcess) {
+ llvm::SmallVector<mlir::Location> &locs, uint64_t loopsToProcess,
+ llvm::SmallVector<mlir::Value> &reductionOperands, AccDataMap &dataMap) {
assert(loopsToProcess > 0 && "expect at least one loop");
locs.push_back(currentLocation); // Location of the directive
bool isDoConcurrent = outerDoConstruct.IsDoConcurrent();
@@ -1582,9 +1681,13 @@ static void processDoLoopBounds(
&*outerDoConstruct.GetLoopControl();
const auto &concurrent =
std::get<Fortran::parser::LoopControl::Concurrent>(loopControl->u);
- if (!std::get<std::list<Fortran::parser::LocalitySpec>>(concurrent.t)
- .empty())
- TODO(currentLocation, "DO CONCURRENT with locality spec inside ACC");
+
+ const auto &localityList =
+ std::get<std::list<Fortran::parser::LocalitySpec>>(concurrent.t);
+ if (!localityList.empty())
+ processDoConcurrentLocalitySpecs(converter, currentLocation, builder,
+ localityList, privateOperands,
+ reductionOperands, dataMap);
const auto &concurrentHeader =
std::get<Fortran::parser::ConcurrentHeader>(concurrent.t);
@@ -1840,7 +1943,8 @@ buildACCLoopOp(Fortran::lower::AbstractConverter &converter,
processDoLoopBounds(converter, currentLocation, stmtCtx, builder,
outerDoConstruct, eval, lowerbounds, upperbounds, steps,
privateOperands, ivPrivate, ivTypes, ivLocs,
- inclusiveBounds, locs, loopsToProcess);
+ inclusiveBounds, locs, loopsToProcess,
+ reductionOperands, dataMap);
} else {
// When the loop contains early exits, privatize induction variables, but do
// not create acc.loop bounds. The control flow of the loop will be
diff --git a/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90 b/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
new file mode 100644
index 0000000000000..91a42146b3cfe
--- /dev/null
+++ b/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
@@ -0,0 +1,241 @@
+! Test lowering of DO CONCURRENT with locality specs inside ACC constructs.
+! Per OpenACC 2.17.2:
+! - DO CONCURRENT without a loop construct in a kernels construct is
+! treated as if annotated with loop auto.
+! - DO CONCURRENT in a parallel construct or accelerator routine is
+! treated as if annotated with loop independent.
+
+! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
+
+! ---------------------------------------------------------------------------
+! REDUCE locality spec
+! ---------------------------------------------------------------------------
+
+! Scalar reduction in kernels region (no explicit loop → auto)
+! CHECK-LABEL: func.func @_QPreduce_kernels_region
+subroutine reduce_kernels_region()
+ real :: a(10), s
+ integer :: i
+ s = 0.
+ !$acc kernels
+ do concurrent(i=1:10) reduce(+:s)
+ s = s + a(i)
+ end do
+ !$acc end kernels
+end subroutine
+
+! CHECK: acc.kernels {
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
+
+! Scalar reduction in parallel region (no explicit loop → independent)
+! CHECK-LABEL: func.func @_QPreduce_parallel_region
+subroutine reduce_parallel_region()
+ real :: a(10), s
+ integer :: i
+ s = 0.
+ !$acc parallel
+ do concurrent(i=1:10) reduce(+:s)
+ s = s + a(i)
+ end do
+ !$acc end parallel
+end subroutine
+
+! CHECK: acc.parallel {
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
+
+! Combined kernels loop with reduce (auto)
+! CHECK-LABEL: func.func @_QPreduce_kernels_loop
+subroutine reduce_kernels_loop()
+ real :: a(16,16), b(16,16), s
+ integer :: i, j
+ s = 0.
+ !$acc kernels loop
+ do concurrent(i=1:16, j=1:16) reduce(+:s)
+ b(i,j) = a(i,j)**2
+ s = s + b(i,j)
+ end do
+end subroutine
+
+! CHECK: acc.kernels combined(loop)
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop combined(kernels) {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true, true>}
+
+! Combined parallel loop with reduce (independent)
+! CHECK-LABEL: func.func @_QPreduce_parallel_loop
+subroutine reduce_parallel_loop()
+ real :: a(10), s
+ integer :: i
+ s = 0.
+ !$acc parallel loop
+ do concurrent(i=1:10) reduce(+:s)
+ s = s + a(i)
+ end do
+end subroutine
+
+! CHECK: acc.parallel combined(loop)
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop combined(parallel) {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
+
+! Multiple reductions (add + multiply)
+! CHECK-LABEL: func.func @_QPmulti_reduce
+subroutine multi_reduce()
+ real :: a(10), s, p
+ integer :: i
+ s = 0.
+ p = 1.
+ !$acc parallel loop
+ do concurrent(i=1:10) reduce(+:s) reduce(*:p)
+ s = s + a(i)
+ p = p * a(i)
+ end do
+end subroutine
+
+! CHECK: acc.parallel combined(loop)
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_mul{{.*}}) -> !fir.ref<f32> {name = "p"}
+! CHECK: acc.loop {{.*}} reduction(
+
+! Max/min reductions
+! CHECK-LABEL: func.func @_QPreduce_max_min
+subroutine reduce_max_min()
+ real :: a(10), mx, mn
+ integer :: i
+ mx = -huge(mx)
+ mn = huge(mn)
+ !$acc kernels loop
+ do concurrent(i=1:10) reduce(max:mx) reduce(min:mn)
+ mx = max(mx, a(i))
+ mn = min(mn, a(i))
+ end do
+end subroutine
+
+! CHECK: acc.kernels combined(loop)
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_max{{.*}}) -> !fir.ref<f32> {name = "mx"}
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_min{{.*}}) -> !fir.ref<f32> {name = "mn"}
+! CHECK: acc.loop {{.*}} reduction(
+
+! Integer multiply reduction
+! CHECK-LABEL: func.func @_QPint_reduce
+subroutine int_reduce()
+ integer :: a(10), prod, i
+ prod = 1
+ !$acc kernels loop
+ do concurrent(i=1:10) reduce(*:prod)
+ prod = prod * a(i)
+ end do
+end subroutine
+
+! CHECK: acc.kernels combined(loop)
+! CHECK: acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul{{.*}}) -> !fir.ref<i32> {name = "prod"}
+
+! ---------------------------------------------------------------------------
+! LOCAL locality spec → acc.private
+! ---------------------------------------------------------------------------
+
+! LOCAL in kernels region (auto)
+! CHECK-LABEL: func.func @_QPlocal_kernels_region
+subroutine local_kernels_region()
+ real :: a(10), tmp
+ integer :: i
+ !$acc kernels
+ do concurrent(i=1:10) local(tmp)
+ tmp = a(i) * 2.0
+ a(i) = tmp + 1.0
+ end do
+ !$acc end kernels
+end subroutine
+
+! CHECK: acc.kernels {
+! CHECK: %[[PRIV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
+! CHECK: acc.loop {{.*}} private({{.*}}%[[PRIV]]{{.*}} : {{.*}}!fir.ref<f32>
+! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
+
+! LOCAL in parallel region (independent)
+! CHECK-LABEL: func.func @_QPlocal_parallel_region
+subroutine local_parallel_region()
+ real :: a(10), tmp
+ integer :: i
+ !$acc parallel
+ do concurrent(i=1:10) local(tmp)
+ tmp = a(i) * 2.0
+ a(i) = tmp + 1.0
+ end do
+ !$acc end parallel
+end subroutine
+
+! CHECK: acc.parallel {
+! CHECK: %[[PRIV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
+! CHECK: acc.loop {{.*}} private({{.*}}%[[PRIV]]{{.*}} : {{.*}}!fir.ref<f32>
+! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
+
+! ---------------------------------------------------------------------------
+! LOCAL_INIT locality spec → acc.firstprivate
+! ---------------------------------------------------------------------------
+
+! LOCAL_INIT in kernels region (auto)
+! CHECK-LABEL: func.func @_QPlocal_init_kernels_region
+subroutine local_init_kernels_region()
+ real :: a(10), scale
+ integer :: i
+ scale = 2.0
+ !$acc kernels
+ do concurrent(i=1:10) local_init(scale)
+ a(i) = a(i) * scale
+ end do
+ !$acc end kernels
+end subroutine
+
+! CHECK: acc.kernels {
+! CHECK: %[[FP:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref<f32>) recipe(@firstprivatization_ref_f32) -> !fir.ref<f32> {name = "scale"}
+! CHECK: acc.loop {{.*}}
+! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
+
+! ---------------------------------------------------------------------------
+! Mixed locality specs: REDUCE + LOCAL
+! ---------------------------------------------------------------------------
+
+! CHECK-LABEL: func.func @_QPmixed_locality
+subroutine mixed_locality()
+ real :: a(10), s, tmp
+ integer :: i
+ s = 0.
+ !$acc parallel loop
+ do concurrent(i=1:10) reduce(+:s) local(tmp)
+ tmp = a(i) * a(i)
+ s = s + tmp
+ end do
+end subroutine
+
+! CHECK: acc.parallel combined(loop)
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK-DAG: acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
+! CHECK: acc.loop {{.*}} reduction({{.*}})
+! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
+
+! ---------------------------------------------------------------------------
+! Reduce combined with explicit ACC reduction clause
+! ---------------------------------------------------------------------------
+
+! CHECK-LABEL: func.func @_QPreduce_with_acc_clause
+subroutine reduce_with_acc_clause()
+ real :: a(10), s1, s2
+ integer :: i
+ s1 = 0.
+ s2 = 0.
+ !$acc parallel loop reduction(+:s1)
+ do concurrent(i=1:10) reduce(+:s2)
+ s1 = s1 + a(i)
+ s2 = s2 + a(i) * 2.0
+ end do
+end subroutine
+
+! CHECK: acc.parallel combined(loop)
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s1"}
+! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s2"}
+! CHECK: acc.loop {{.*}} reduction(
>From 37555e34a305f25679227f8ac154d0745c247433 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 2 Apr 2026 20:08:01 -0700
Subject: [PATCH 2/6] [flang][OpenACC] Handle LOCAL/LOCAL_INIT locality specs
and fix recipes
- LOCAL maps to acc.private with privatization recipe
- LOCAL_INIT maps to acc.firstprivate with firstprivatization recipe
- Fix HostAssoc symbol binding for DO CONCURRENT LOCAL/LOCAL_INIT
variables: the body references the HostAssoc symbol (with LocalityLocal
flag), so we copy the binding from the ultimate symbol after
remapDataOperandSymbols.
- Separate firstprivate operands into their own segment on acc.loop.
- Add recipes to private/firstprivate ops from locality specs.
Made-with: Cursor
---
flang/lib/Lower/OpenACC.cpp | 78 ++++++++++++++-----
.../OpenACC/acc-do-concurrent-locality.f90 | 26 +++----
2 files changed, 72 insertions(+), 32 deletions(-)
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index fc137e76ffba5..cd33a55e9292b 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -1556,13 +1556,19 @@ static void visitLoopControl(
// Process DO CONCURRENT locality specs (REDUCE, LOCAL, LOCAL_INIT, SHARED)
// that appear inside an ACC construct, converting them to the corresponding
-// ACC clauses.
+// ACC clauses. localSymPairs tracks (HostAssoc, ultimate) symbol pairs for
+// LOCAL/LOCAL_INIT so that the HostAssoc symbol can be bound after region
+// creation.
static void processDoConcurrentLocalitySpecs(
Fortran::lower::AbstractConverter &converter, mlir::Location loc,
fir::FirOpBuilder &builder,
const std::list<Fortran::parser::LocalitySpec> &localityList,
llvm::SmallVector<mlir::Value> &privateOperands,
- llvm::SmallVector<mlir::Value> &reductionOperands, AccDataMap &dataMap) {
+ llvm::SmallVector<mlir::Value> &firstprivateOperands,
+ llvm::SmallVector<mlir::Value> &reductionOperands, AccDataMap &dataMap,
+ llvm::SmallVector<std::pair<Fortran::semantics::SymbolRef,
+ Fortran::semantics::SymbolRef>>
+ &localSymPairs) {
for (const Fortran::parser::LocalitySpec &locSpec : localityList) {
if (const auto *reduceSpec =
std::get_if<Fortran::parser::LocalitySpec::Reduce>(&locSpec.u)) {
@@ -1609,43 +1615,61 @@ static void processDoConcurrentLocalitySpecs(
std::get_if<Fortran::parser::LocalitySpec::Local>(
&locSpec.u)) {
for (const Fortran::parser::Name &name : localSpec->v) {
- const Fortran::semantics::Symbol &sym = name.symbol->GetUltimate();
- mlir::Value symAddr = converter.getSymbolAddress(sym);
+ const Fortran::semantics::Symbol &ultimateSym =
+ name.symbol->GetUltimate();
+ mlir::Value symAddr = converter.getSymbolAddress(ultimateSym);
assert(symAddr && "expected symbol to have an address");
llvm::SmallVector<mlir::Value> bounds;
std::stringstream asFortran;
asFortran << Fortran::lower::mangle::demangleName(
- toStringRef(sym.name()));
+ toStringRef(ultimateSym.name()));
auto op = createDataEntryOp<mlir::acc::PrivateOp>(
builder, loc, symAddr, asFortran, bounds, /*structured=*/true,
/*implicit=*/false, mlir::acc::DataClause::acc_private,
symAddr.getType(),
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
+ mlir::SymbolRefAttr recipe =
+ fir::acc::createOrGetPrivateRecipe(builder, loc, symAddr, bounds);
+ op.setRecipeAttr(recipe);
privateOperands.push_back(op.getAccVar());
- dataMap.emplaceSymbol(op.getAccVar(),
- Fortran::semantics::SymbolRef(sym));
+ dataMap.emplaceSymbol(
+ op.getAccVar(),
+ Fortran::semantics::SymbolRef(ultimateSym));
+ if (name.symbol->HasLocalLocality())
+ localSymPairs.emplace_back(
+ Fortran::semantics::SymbolRef(*name.symbol),
+ Fortran::semantics::SymbolRef(ultimateSym));
}
} else if (const auto *localInitSpec =
std::get_if<Fortran::parser::LocalitySpec::LocalInit>(
&locSpec.u)) {
for (const Fortran::parser::Name &name : localInitSpec->v) {
- const Fortran::semantics::Symbol &sym = name.symbol->GetUltimate();
- mlir::Value symAddr = converter.getSymbolAddress(sym);
+ const Fortran::semantics::Symbol &ultimateSym =
+ name.symbol->GetUltimate();
+ mlir::Value symAddr = converter.getSymbolAddress(ultimateSym);
assert(symAddr && "expected symbol to have an address");
llvm::SmallVector<mlir::Value> bounds;
std::stringstream asFortran;
asFortran << Fortran::lower::mangle::demangleName(
- toStringRef(sym.name()));
+ toStringRef(ultimateSym.name()));
auto op = createDataEntryOp<mlir::acc::FirstprivateOp>(
builder, loc, symAddr, asFortran, bounds, /*structured=*/true,
/*implicit=*/false, mlir::acc::DataClause::acc_firstprivate,
symAddr.getType(),
/*async=*/{}, /*asyncDeviceTypes=*/{}, /*asyncOnlyDeviceTypes=*/{});
- privateOperands.push_back(op.getAccVar());
- dataMap.emplaceSymbol(op.getAccVar(),
- Fortran::semantics::SymbolRef(sym));
+ mlir::SymbolRefAttr recipe = fir::acc::createOrGetFirstprivateRecipe(
+ builder, loc, symAddr, bounds);
+ op.setRecipeAttr(recipe);
+ firstprivateOperands.push_back(op.getAccVar());
+ dataMap.emplaceSymbol(
+ op.getAccVar(),
+ Fortran::semantics::SymbolRef(ultimateSym));
+ if (name.symbol->HasLocalLocality())
+ localSymPairs.emplace_back(
+ Fortran::semantics::SymbolRef(*name.symbol),
+ Fortran::semantics::SymbolRef(ultimateSym));
}
}
}
@@ -1669,7 +1693,11 @@ static void processDoLoopBounds(
llvm::SmallVector<mlir::Location> &ivLocs,
llvm::SmallVector<bool> &inclusiveBounds,
llvm::SmallVector<mlir::Location> &locs, uint64_t loopsToProcess,
- llvm::SmallVector<mlir::Value> &reductionOperands, AccDataMap &dataMap) {
+ llvm::SmallVector<mlir::Value> &reductionOperands,
+ llvm::SmallVector<mlir::Value> &firstprivateOperands, AccDataMap &dataMap,
+ llvm::SmallVector<std::pair<Fortran::semantics::SymbolRef,
+ Fortran::semantics::SymbolRef>>
+ &localSymPairs) {
assert(loopsToProcess > 0 && "expect at least one loop");
locs.push_back(currentLocation); // Location of the directive
bool isDoConcurrent = outerDoConstruct.IsDoConcurrent();
@@ -1687,7 +1715,9 @@ static void processDoLoopBounds(
if (!localityList.empty())
processDoConcurrentLocalitySpecs(converter, currentLocation, builder,
localityList, privateOperands,
- reductionOperands, dataMap);
+ firstprivateOperands,
+ reductionOperands, dataMap,
+ localSymPairs);
const auto &concurrentHeader =
std::get<Fortran::parser::ConcurrentHeader>(concurrent.t);
@@ -1935,6 +1965,10 @@ buildACCLoopOp(Fortran::lower::AbstractConverter &converter,
llvm::SmallVector<bool> inclusiveBounds;
llvm::SmallVector<mlir::Location> locs;
llvm::SmallVector<mlir::Value> lowerbounds, upperbounds, steps;
+ llvm::SmallVector<mlir::Value> firstprivateOperands;
+ llvm::SmallVector<std::pair<Fortran::semantics::SymbolRef,
+ Fortran::semantics::SymbolRef>>
+ localSymPairs;
// Look at the do/do concurrent loops to extract bounds information unless
// this loop is lowered in an unstructured fashion, in which case bounds are
@@ -1944,7 +1978,8 @@ buildACCLoopOp(Fortran::lower::AbstractConverter &converter,
outerDoConstruct, eval, lowerbounds, upperbounds, steps,
privateOperands, ivPrivate, ivTypes, ivLocs,
inclusiveBounds, locs, loopsToProcess,
- reductionOperands, dataMap);
+ reductionOperands, firstprivateOperands, dataMap,
+ localSymPairs);
} else {
// When the loop contains early exits, privatize induction variables, but do
// not create acc.loop bounds. The control flow of the loop will be
@@ -1964,9 +1999,7 @@ buildACCLoopOp(Fortran::lower::AbstractConverter &converter,
addOperands(operands, operandSegments, tileOperands);
addOperands(operands, operandSegments, cacheOperands);
addOperands(operands, operandSegments, privateOperands);
- // fill empty firstprivate operands since they are not permitted
- // from OpenACC language perspective.
- addOperands(operands, operandSegments, {});
+ addOperands(operands, operandSegments, firstprivateOperands);
addOperands(operands, operandSegments, reductionOperands);
auto loopOp = createRegionOp<mlir::acc::LoopOp, mlir::acc::YieldOp>(
@@ -1981,6 +2014,13 @@ buildACCLoopOp(Fortran::lower::AbstractConverter &converter,
// Remap symbols from data clauses to use data operation results
dataMap.remapDataOperandSymbols(converter, builder, loopOp.getRegion());
+ // For DO CONCURRENT LOCAL/LOCAL_INIT variables, the body references the
+ // HostAssoc symbol (with LocalityLocal flag), not the ultimate symbol.
+ // Copy the binding from the ultimate to the HostAssoc symbol so lookups
+ // inside the region find the privatized variable.
+ for (auto &[hostAssocSym, ultimateSym] : localSymPairs)
+ converter.copySymbolBinding(ultimateSym, hostAssocSym);
+
if (!eval.lowerAsUnstructured()) {
for (auto [arg, iv] :
llvm::zip(loopOp.getLoopRegions().front()->front().getArguments(),
diff --git a/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90 b/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
index 91a42146b3cfe..0e5060432d522 100644
--- a/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
+++ b/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
@@ -26,7 +26,7 @@ subroutine reduce_kernels_region()
! CHECK: acc.kernels {
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
-! CHECK: acc.loop {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: acc.loop {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
! Scalar reduction in parallel region (no explicit loop → independent)
@@ -44,7 +44,7 @@ subroutine reduce_parallel_region()
! CHECK: acc.parallel {
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
-! CHECK: acc.loop {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: acc.loop {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
! Combined kernels loop with reduce (auto)
@@ -62,7 +62,7 @@ subroutine reduce_kernels_loop()
! CHECK: acc.kernels combined(loop)
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
-! CHECK: acc.loop combined(kernels) {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: acc.loop combined(kernels) {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true, true>}
! Combined parallel loop with reduce (independent)
@@ -79,7 +79,7 @@ subroutine reduce_parallel_loop()
! CHECK: acc.parallel combined(loop)
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
-! CHECK: acc.loop combined(parallel) {{.*}} reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: acc.loop combined(parallel) {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
! Multiple reductions (add + multiply)
@@ -99,7 +99,7 @@ subroutine multi_reduce()
! CHECK: acc.parallel combined(loop)
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_mul{{.*}}) -> !fir.ref<f32> {name = "p"}
-! CHECK: acc.loop {{.*}} reduction(
+! CHECK: acc.loop {{.*}}reduction(
! Max/min reductions
! CHECK-LABEL: func.func @_QPreduce_max_min
@@ -118,7 +118,7 @@ subroutine reduce_max_min()
! CHECK: acc.kernels combined(loop)
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_max{{.*}}) -> !fir.ref<f32> {name = "mx"}
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_min{{.*}}) -> !fir.ref<f32> {name = "mn"}
-! CHECK: acc.loop {{.*}} reduction(
+! CHECK: acc.loop {{.*}}reduction(
! Integer multiply reduction
! CHECK-LABEL: func.func @_QPint_reduce
@@ -153,7 +153,7 @@ subroutine local_kernels_region()
! CHECK: acc.kernels {
! CHECK: %[[PRIV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
-! CHECK: acc.loop {{.*}} private({{.*}}%[[PRIV]]{{.*}} : {{.*}}!fir.ref<f32>
+! CHECK: acc.loop private(%[[PRIV]],
! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
! LOCAL in parallel region (independent)
@@ -171,7 +171,7 @@ subroutine local_parallel_region()
! CHECK: acc.parallel {
! CHECK: %[[PRIV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
-! CHECK: acc.loop {{.*}} private({{.*}}%[[PRIV]]{{.*}} : {{.*}}!fir.ref<f32>
+! CHECK: acc.loop private(%[[PRIV]],
! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
! ---------------------------------------------------------------------------
@@ -193,7 +193,7 @@ subroutine local_init_kernels_region()
! CHECK: acc.kernels {
! CHECK: %[[FP:.*]] = acc.firstprivate varPtr(%{{.*}} : !fir.ref<f32>) recipe(@firstprivatization_ref_f32) -> !fir.ref<f32> {name = "scale"}
-! CHECK: acc.loop {{.*}}
+! CHECK: acc.loop {{.*}}firstprivate(%[[FP]] : !fir.ref<f32>)
! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
! ---------------------------------------------------------------------------
@@ -213,9 +213,9 @@ subroutine mixed_locality()
end subroutine
! CHECK: acc.parallel combined(loop)
-! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
-! CHECK-DAG: acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
-! CHECK: acc.loop {{.*}} reduction({{.*}})
+! CHECK-DAG: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK-DAG: %[[PRIV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<f32>) recipe(@privatization_ref_f32) -> !fir.ref<f32> {name = "tmp"}
+! CHECK: acc.loop {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
! ---------------------------------------------------------------------------
@@ -238,4 +238,4 @@ subroutine reduce_with_acc_clause()
! CHECK: acc.parallel combined(loop)
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s1"}
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s2"}
-! CHECK: acc.loop {{.*}} reduction(
+! CHECK: acc.loop {{.*}}reduction(
>From 5094038ac0b58afab10bd14379e5c7452173aeb5 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 2 Apr 2026 20:15:26 -0700
Subject: [PATCH 3/6] =?UTF-8?q?[flang][OpenACC][test]=20Update=20reduction?=
=?UTF-8?q?=20recipe=20names=20after=20Type=E2=86=92Value=20API=20change?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The recipe creation functions now take mlir::Value instead of
mlir::Type, which changes generated recipe names from
@reduction_<op>_ref_<ty> to @reduction_<op>_optional_ref_<ty> (and
similarly for box/heap variants). Update all affected test expectations.
Made-with: Cursor
---
flang/test/Lower/OpenACC/acc-kernels-loop.f90 | 4 +-
flang/test/Lower/OpenACC/acc-loop.f90 | 4 +-
.../test/Lower/OpenACC/acc-parallel-loop.f90 | 4 +-
flang/test/Lower/OpenACC/acc-parallel.f90 | 4 +-
.../Lower/OpenACC/acc-reduction-maxmin.f90 | 32 +--
.../Lower/OpenACC/acc-reduction-remapping.f90 | 8 +-
flang/test/Lower/OpenACC/acc-reduction.f90 | 228 +++++++++---------
flang/test/Lower/OpenACC/acc-serial-loop.f90 | 4 +-
flang/test/Lower/OpenACC/acc-serial.f90 | 4 +-
.../Lower/OpenACC/do-loops-to-acc-loops.f90 | 4 +-
10 files changed, 148 insertions(+), 148 deletions(-)
diff --git a/flang/test/Lower/OpenACC/acc-kernels-loop.f90 b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
index 70f5b7d30cb9a..51bbcd2c2467e 100644
--- a/flang/test/Lower/OpenACC/acc-kernels-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
@@ -704,8 +704,8 @@ subroutine acc_kernels_loop
! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}
! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}
! CHECK: acc.kernels {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {{.*}} {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90
index ed87cf76038b5..69210d4f77d7c 100644
--- a/flang/test/Lower/OpenACC/acc-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-loop.f90
@@ -334,8 +334,8 @@ program acc_loop
reduction_i = 1
end do
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}
! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) control(%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) {
! CHECK: acc.yield
diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
index b5ad46a69c125..2de063a624154 100644
--- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
@@ -722,8 +722,8 @@ subroutine acc_parallel_loop
! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}
! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}
! CHECK: acc.parallel {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {{.*}}
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90
index 6d6cc9c623ce5..34e30b99abcec 100644
--- a/flang/test/Lower/OpenACC/acc-parallel.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel.f90
@@ -337,8 +337,8 @@ subroutine acc_parallel
!$acc parallel reduction(+:reduction_r) reduction(*:reduction_i)
!$acc end parallel
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32>
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32>
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32>
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32>
! CHECK: acc.parallel reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90 b/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90
index cd6e3fd2fb07b..81a90206fb0d7 100644
--- a/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90
+++ b/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90
@@ -33,84 +33,84 @@ subroutine acc_array_reduction_min(a)
!$acc end parallel
end subroutine acc_array_reduction_min
-! LEGACY-LABEL: acc.reduction.recipe @reduction_min_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_min_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
! LEGACY: } combiner {
! LEGACY: fir.do_loop
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! LEGACY-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! LEGACY: } combiner {
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! LEGACY-LABEL: acc.reduction.recipe @reduction_max_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_max_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
! LEGACY: } combiner {
! LEGACY: fir.do_loop
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! LEGACY-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! LEGACY: } combiner {
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minimumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minimumf> init {
! EXTREMUM: } combiner {
! EXTREMUM: fir.do_loop
! EXTREMUM: %[[MINIMUMF_0:.*]] = arith.minimumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_ref_f32 : !fir.ref<f32> reduction_operator <minimumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <minimumf> init {
! EXTREMUM: %[[CST:.*]] = arith.constant 3.40282347E+38 : f32
! EXTREMUM: } combiner {
! EXTREMUM: %[[MINIMUMF_0:.*]] = arith.minimumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maximumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maximumf> init {
! EXTREMUM: } combiner {
! EXTREMUM: fir.do_loop
! EXTREMUM: %[[MAXIMUMF_0:.*]] = arith.maximumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_ref_f32 : !fir.ref<f32> reduction_operator <maximumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <maximumf> init {
! EXTREMUM-LABEL: } combiner {
! EXTREMUM: %[[MAXIMUMF_0:.*]] = arith.maximumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minnumf> init {
! EXTREMENUM: } combiner {
! EXTREMENUM: fir.do_loop
! EXTREMENUM: %[[MINNUMF_0:.*]] = arith.minnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_ref_f32 : !fir.ref<f32> reduction_operator <minnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <minnumf> init {
! EXTREMENUM: %[[CST:.*]] = arith.constant 3.40282347E+38 : f32
! EXTREMENUM: } combiner {
! EXTREMENUM: %[[MINNUMF_0:.*]] = arith.minnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maxnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maxnumf> init {
! EXTREMENUM: } combiner {
! EXTREMENUM: fir.do_loop
! EXTREMENUM: %[[MAXNUMF_0:.*]] = arith.maxnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_ref_f32 : !fir.ref<f32> reduction_operator <maxnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <maxnumf> init {
! EXTREMENUM-LABEL: } combiner {
! EXTREMENUM: %[[MAXNUMF_0:.*]] = arith.maxnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: fir.do_loop
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: fir.do_loop
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
diff --git a/flang/test/Lower/OpenACC/acc-reduction-remapping.f90 b/flang/test/Lower/OpenACC/acc-reduction-remapping.f90
index 8c69efe7e8de6..b93f79c67e349 100644
--- a/flang/test/Lower/OpenACC/acc-reduction-remapping.f90
+++ b/flang/test/Lower/OpenACC/acc-reduction-remapping.f90
@@ -53,7 +53,7 @@ subroutine array_split(x, y, n)
! CHECK-LABEL: func.func @_QPscalar_combined(
! CHECK: %[[DUMMY_SCOPE_0:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_Y:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %[[DUMMY_SCOPE_0]] arg 2 {uniq_name = "_QFscalar_combinedEy"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y]]#0 : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y]]#0 : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "y"}
! CHECK: acc.parallel {{.*}} reduction(%[[REDUCTION_Y]] : !fir.ref<f32>) {
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_RED_PAR:.*]]:2 = hlfir.declare %[[REDUCTION_Y]] dummy_scope %[[DUMMY_SCOPE_1]] arg 2 {uniq_name = "_QFscalar_combinedEy"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
@@ -81,7 +81,7 @@ subroutine array_split(x, y, n)
! CHECK: acc.parallel dataOperands({{.*}}%[[CREATE_Y]] : {{.*}}) {
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_Y_PAR:.*]]:2 = hlfir.declare %[[CREATE_Y]] dummy_scope %[[DUMMY_SCOPE_1]] arg 2 {uniq_name = "_QFscalar_splitEy"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y_PAR]]#0 : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y_PAR]]#0 : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "y"}
! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr({{.*}}) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}
! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_Y]] : !fir.ref<f32>) {{.*}} {
! CHECK: %[[DUMMY_SCOPE_2:.*]] = fir.dummy_scope : !fir.dscope
@@ -101,7 +101,7 @@ subroutine array_split(x, y, n)
! CHECK: %[[DUMMY_SCOPE_0:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_N:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %[[DUMMY_SCOPE_0]] arg 3 {uniq_name = "_QFarray_combinedEn"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
! CHECK: %[[DECLARE_Y:.*]]:2 = hlfir.declare %{{.*}}({{.*}}) dummy_scope %[[DUMMY_SCOPE_0]] arg 2 {uniq_name = "_QFarray_combinedEy"} : (!fir.ref<!fir.array<?xf32>>, {{.*}}, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.ref<!fir.array<?xf32>>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_optional_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
! CHECK: acc.parallel dataOperands({{.*}}) reduction(%[[REDUCTION_Y]] : !fir.box<!fir.array<?xf32>>) {
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[BOX_ADDR_RED:.*]] = fir.box_addr %[[REDUCTION_Y]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
@@ -135,7 +135,7 @@ subroutine array_split(x, y, n)
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[BOX_ADDR_Y:.*]] = fir.box_addr %[[CREATE_Y]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
! CHECK: %[[DECLARE_Y_PAR:.*]]:2 = hlfir.declare %[[BOX_ADDR_Y]]({{.*}}) dummy_scope %[[DUMMY_SCOPE_1]] arg 2 {uniq_name = "_QFarray_splitEy"} : (!fir.ref<!fir.array<?xf32>>, {{.*}}, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.ref<!fir.array<?xf32>>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y_PAR]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y_PAR]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_optional_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
! CHECK: %[[PRIVATE_J:.*]] = acc.private varPtr({{.*}}) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "j"}
! CHECK: acc.loop private(%[[PRIVATE_J]] : !fir.ref<i32>) reduction(%[[REDUCTION_Y]] : !fir.box<!fir.array<?xf32>>) {{.*}} {
! CHECK: %[[BOX_ADDR_RED:.*]] = fir.box_addr %[[REDUCTION_Y]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
diff --git a/flang/test/Lower/OpenACC/acc-reduction.f90 b/flang/test/Lower/OpenACC/acc-reduction.f90
index 49789efc545ba..a7b76cf2a0a82 100644
--- a/flang/test/Lower/OpenACC/acc-reduction.f90
+++ b/flang/test/Lower/OpenACC/acc-reduction.f90
@@ -3,7 +3,7 @@
! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
! RUN: bbc -fopenacc -emit-hlfir %s -o - -openacc-use-reduction-combine | FileCheck -check-prefix=ACC_COMBINE %s
-! CHECK-LABEL: acc.reduction.recipe @reduction_lor_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant false
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>
@@ -38,7 +38,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?x?xf32>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[CONSTANT_1:.*]] = arith.constant 0 : index
@@ -125,7 +125,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
@@ -194,7 +194,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
@@ -262,7 +262,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -331,7 +331,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.box<!fir.array<?xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[CONSTANT_1:.*]] = arith.constant 0 : index
@@ -394,7 +394,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
! CHECK: %[[CONSTANT_1:.*]] = arith.constant 0 : index
@@ -456,7 +456,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<10x20xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<10x20xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -535,7 +535,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<10x20xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -594,7 +594,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
@@ -627,7 +627,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<i32>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>
@@ -659,7 +659,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<complex<f32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca complex<f32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1.000000e+00 : f32
@@ -679,7 +679,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<complex<f32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<complex<f32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca complex<f32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0.000000e+00 : f32
@@ -699,7 +699,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<complex<f32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_neqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_neqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant false
@@ -718,7 +718,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_eqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_eqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant true
@@ -737,7 +737,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_lor_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant false
@@ -756,7 +756,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_land_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_land_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant true
@@ -775,7 +775,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_xor_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_xor_optional_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -791,7 +791,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_ior_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_ior_optional_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -807,7 +807,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_iand_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_iand_optional_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -1 : i32
@@ -823,7 +823,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
@@ -858,7 +858,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
@@ -875,7 +875,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -2147483648 : i32
@@ -917,7 +917,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -2147483648 : i32
@@ -933,7 +933,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 3.40282347E+38 : f32
@@ -976,7 +976,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 3.40282347E+38 : f32
@@ -993,7 +993,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 2147483647 : i32
@@ -1027,7 +1027,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 2147483647 : i32
@@ -1043,7 +1043,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1.000000e+00 : f32
@@ -1077,7 +1077,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1.000000e+00 : f32
@@ -1093,7 +1093,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1 : i32
@@ -1127,7 +1127,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1 : i32
@@ -1143,7 +1143,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0.000000e+00 : f32
@@ -1177,7 +1177,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0.000000e+00 : f32
@@ -1193,7 +1193,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10x2xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10x2xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1243,7 +1243,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10x2xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1285,7 +1285,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1325,7 +1325,7 @@
! CHECK: acc.yield %[[ALLOCA_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1354,7 +1354,7 @@ subroutine acc_reduction_add_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_add_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_add_int_array_1d(a, b)
@@ -1370,7 +1370,7 @@ subroutine acc_reduction_add_int_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_add_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_add_optional_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_add_int_array_2d(a, b)
@@ -1388,7 +1388,7 @@ subroutine acc_reduction_add_int_array_2d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int_array_2d(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "b"}) {
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_add_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_add_optional_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10xi32>>)
! CHECK: } attributes {collapse = [2]{{.*}}
@@ -1409,7 +1409,7 @@ subroutine acc_reduction_add_int_array_3d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int_array_3d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100x10x2xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10x2xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10x2xi32>>) recipe(@reduction_add_ref_100x10x2xi32) -> !fir.ref<!fir.array<100x10x2xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10x2xi32>>) recipe(@reduction_add_optional_ref_100x10x2xi32) -> !fir.ref<!fir.array<100x10x2xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10x2xi32>>)
! CHECK: } attributes {collapse = [3]{{.*}}
@@ -1426,7 +1426,7 @@ subroutine acc_reduction_add_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_add_float_array_1d(a, b)
@@ -1442,7 +1442,7 @@ subroutine acc_reduction_add_float_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_float_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_add_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_add_optional_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xf32>>)
subroutine acc_reduction_mul_int(a, b)
@@ -1458,7 +1458,7 @@ subroutine acc_reduction_mul_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_mul_int_array_1d(a, b)
@@ -1474,7 +1474,7 @@ subroutine acc_reduction_mul_int_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_int_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_mul_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_mul_optional_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_mul_float(a, b)
@@ -1490,7 +1490,7 @@ subroutine acc_reduction_mul_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_mul_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_mul_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_mul_float_array_1d(a, b)
@@ -1506,7 +1506,7 @@ subroutine acc_reduction_mul_float_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_float_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_mul_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_mul_optional_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xf32>>)
subroutine acc_reduction_min_int(a, b)
@@ -1522,7 +1522,7 @@ subroutine acc_reduction_min_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_min_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_min_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_min_int_array_1d(a, b)
@@ -1538,7 +1538,7 @@ subroutine acc_reduction_min_int_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_int_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_min_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_min_optional_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_min_float(a, b)
@@ -1554,7 +1554,7 @@ subroutine acc_reduction_min_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_min_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_min_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_min_float_array2d(a, b)
@@ -1572,7 +1572,7 @@ subroutine acc_reduction_min_float_array2d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_float_array2d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100x10xf32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xf32>>) recipe(@reduction_min_ref_100x10xf32) -> !fir.ref<!fir.array<100x10xf32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xf32>>) recipe(@reduction_min_optional_ref_100x10xf32) -> !fir.ref<!fir.array<100x10xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10xf32>>)
! CHECK: attributes {collapse = [2]{{.*}}
@@ -1589,7 +1589,7 @@ subroutine acc_reduction_max_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_max_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_max_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_max_int_array2d(a, b)
@@ -1607,7 +1607,7 @@ subroutine acc_reduction_max_int_array2d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_int_array2d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_max_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_max_optional_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10xi32>>)
subroutine acc_reduction_max_float(a, b)
@@ -1623,7 +1623,7 @@ subroutine acc_reduction_max_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_max_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_max_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_max_float_array1d(a, b)
@@ -1639,7 +1639,7 @@ subroutine acc_reduction_max_float_array1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_float_array1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_max_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_max_optional_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100xf32>>)
subroutine acc_reduction_iand()
@@ -1649,7 +1649,7 @@ subroutine acc_reduction_iand()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_iand()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_iand_ref_i32) -> !fir.ref<i32> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_iand_optional_ref_i32) -> !fir.ref<i32> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<i32>)
subroutine acc_reduction_ior()
@@ -1659,7 +1659,7 @@ subroutine acc_reduction_ior()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_ior()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_ior_ref_i32) -> !fir.ref<i32> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_ior_optional_ref_i32) -> !fir.ref<i32> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<i32>)
subroutine acc_reduction_ieor()
@@ -1669,7 +1669,7 @@ subroutine acc_reduction_ieor()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_ieor()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_xor_ref_i32) -> !fir.ref<i32> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_xor_optional_ref_i32) -> !fir.ref<i32> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<i32>)
subroutine acc_reduction_and()
@@ -1681,7 +1681,7 @@ subroutine acc_reduction_and()
! CHECK-LABEL: func.func @_QPacc_reduction_and()
! CHECK: %[[L:.*]] = fir.alloca !fir.logical<4> {bindc_name = "l", uniq_name = "_QFacc_reduction_andEl"}
! CHECK: %[[DECLL:.*]]:2 = hlfir.declare %[[L]]
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLL]]#0 : !fir.ref<!fir.logical<4>>) recipe(@reduction_land_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLL]]#0 : !fir.ref<!fir.logical<4>>) recipe(@reduction_land_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_or()
@@ -1691,7 +1691,7 @@ subroutine acc_reduction_or()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_or()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_lor_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_lor_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_eqv()
@@ -1701,7 +1701,7 @@ subroutine acc_reduction_eqv()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_eqv()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_eqv_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_eqv_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_neqv()
@@ -1711,7 +1711,7 @@ subroutine acc_reduction_neqv()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_neqv()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_neqv_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_neqv_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_add_cmplx()
@@ -1721,7 +1721,7 @@ subroutine acc_reduction_add_cmplx()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_add_cmplx()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_add_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_add_optional_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<complex<f32>>)
subroutine acc_reduction_mul_cmplx()
@@ -1731,7 +1731,7 @@ subroutine acc_reduction_mul_cmplx()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_mul_cmplx()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_mul_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_mul_optional_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<complex<f32>>)
subroutine acc_reduction_add_alloc()
@@ -1744,7 +1744,7 @@ subroutine acc_reduction_add_alloc()
! CHECK-LABEL: func.func @_QPacc_reduction_add_alloc()
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "i", uniq_name = "_QFacc_reduction_add_allocEi"}
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOCA]]
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>) recipe(@reduction_add_ref_box_heap_i32) -> !fir.ref<!fir.box<!fir.heap<i32>>> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>) recipe(@reduction_add_optional_ref_box_heap_i32) -> !fir.ref<!fir.box<!fir.heap<i32>>> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.heap<i32>>>)
subroutine acc_reduction_add_pointer(i)
@@ -1756,7 +1756,7 @@ subroutine acc_reduction_add_pointer(i)
! CHECK-LABEL: func.func @_QPacc_reduction_add_pointer(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "i"})
! CHECK: %[[DECLARG0:.*]]:2 = hlfir.declare %[[ARG0]]
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>) recipe(@reduction_add_ref_box_ptr_i32) -> !fir.ref<!fir.box<!fir.ptr<i32>>> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>) recipe(@reduction_add_optional_ref_box_ptr_i32) -> !fir.ref<!fir.box<!fir.ptr<i32>>> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.ptr<i32>>>)
subroutine acc_reduction_add_static_slice(a)
@@ -1773,7 +1773,7 @@ subroutine acc_reduction_add_static_slice(a)
! CHECK: %[[LB:.*]] = arith.constant 10 : index
! CHECK: %[[UB:.*]] = arith.constant 19 : index
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%[[C100]] : index) stride(%[[C1]] : index) startIdx(%[[C1]] : index)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_section_lb10.ub19_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "a(11:20)"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_optional_section_lb10.ub19_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "a(11:20)"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_add_static_slice_2d(a)
@@ -1795,7 +1795,7 @@ subroutine acc_reduction_add_static_slice_2d(a)
! CHECK: %[[UB19:.*]] = arith.constant 19 : index
! CHECK: %[[BOUND1:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB19]] : index) extent(%[[C20]] : index)
! stride(%[[STRIDE1]] : index) startIdx(%[[C1]] : index)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<10x20xi32>>) bounds(%[[BOUND0]], %[[BOUND1]]) recipe(@reduction_add_section_lb0.ub9xlb0.ub19_ref_10x20xi32) ->
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<10x20xi32>>) bounds(%[[BOUND0]], %[[BOUND1]]) recipe(@reduction_add_optional_section_lb0.ub9xlb0.ub19_ref_10x20xi32) ->
! !fir.ref<!fir.array<10x20xi32>> {name = "a(:10,:20)"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.array<10x20xi32>>)
@@ -1808,7 +1808,7 @@ subroutine acc_reduction_add_dynamic_extent_add(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_dynamic_extent_add(
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"})
! CHECK: %[[DECLARG0:.*]]:2 = hlfir.declare %[[ARG0]]
-! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xi32>>) recipe(@reduction_add_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xi32>>) recipe(@reduction_add_optional_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED:.*]] : !fir.box<!fir.array<?xi32>>)
subroutine acc_reduction_add_assumed_shape_max(a)
@@ -1820,7 +1820,7 @@ subroutine acc_reduction_add_assumed_shape_max(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_assumed_shape_max(
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "a"})
! CHECK: %[[DECLARG0:.*]]:2 = hlfir.declare %[[ARG0]]
-! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xf32>>) recipe(@reduction_max_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xf32>>) recipe(@reduction_max_optional_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.box<!fir.array<?xf32>>) {
subroutine acc_reduction_add_dynamic_extent_add_with_section(a)
@@ -1833,7 +1833,7 @@ subroutine acc_reduction_add_dynamic_extent_add_with_section(a)
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"})
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFacc_reduction_add_dynamic_extent_add_with_sectionEa"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%c1{{.*}} : index) upperbound(%c3{{.*}} : index) extent(%{{.*}}#1 : index) stride(%{{.*}}#2 : index) startIdx(%{{.*}} : index) {strideInBytes = true}
-! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL]]#0 : !fir.box<!fir.array<?xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_section_lb1.ub3_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a(2:4)"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL]]#0 : !fir.box<!fir.array<?xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_optional_section_lb1.ub3_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a(2:4)"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.box<!fir.array<?xi32>>)
subroutine acc_reduction_add_allocatable(a)
@@ -1845,7 +1845,7 @@ subroutine acc_reduction_add_allocatable(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_allocatable(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {fir.bindc_name = "a"})
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFacc_reduction_add_allocatableEa"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.dscope) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) recipe(@reduction_max_ref_box_heap_Uxf32) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) recipe(@reduction_max_optional_ref_box_heap_Uxf32) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>)
subroutine acc_reduction_add_pointer_array(a)
@@ -1857,7 +1857,7 @@ subroutine acc_reduction_add_pointer_array(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_pointer_array(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {fir.bindc_name = "a"})
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFacc_reduction_add_pointer_arrayEa"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.dscope) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) recipe(@reduction_max_ref_box_ptr_Uxf32) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) recipe(@reduction_max_optional_ref_box_ptr_Uxf32) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
subroutine acc_reduction_max_dynamic_extent_max(a, n)
@@ -1870,7 +1870,7 @@ subroutine acc_reduction_max_dynamic_extent_max(a, n)
! CHECK-LABEL: func.func @_QPacc_reduction_max_dynamic_extent_max(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "a"}, %{{.*}}: !fir.ref<i32> {fir.bindc_name = "n"})
! CHECK: %[[DECL_A:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFacc_reduction_max_dynamic_extent_maxEa"} : (!fir.ref<!fir.array<?x?xf32>>, !fir.shape<2>, !fir.dscope) -> (!fir.box<!fir.array<?x?xf32>>, !fir.ref<!fir.array<?x?xf32>>)
-! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL_A]]#0 : !fir.box<!fir.array<?x?xf32>>) recipe(@reduction_max_box_UxUxf32) -> !fir.box<!fir.array<?x?xf32>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL_A]]#0 : !fir.box<!fir.array<?x?xf32>>) recipe(@reduction_max_optional_box_UxUxf32) -> !fir.box<!fir.array<?x?xf32>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.box<!fir.array<?x?xf32>>)
subroutine acc_reduction_logical_allocatable(l)
@@ -1879,19 +1879,19 @@ subroutine acc_reduction_logical_allocatable(l)
!$acc end parallel
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_logical_allocatable(
-! CHECK: %[[REDUCTION_0:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>) recipe(@reduction_lor_ref_box_heap_l32) -> !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> {name = "l"}
+! CHECK: %[[REDUCTION_0:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>) recipe(@reduction_lor_optional_ref_box_heap_l32) -> !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> {name = "l"}
! CHECK: acc.parallel reduction(%[[REDUCTION_0]] : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>)
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! ACC_COMBINE-LABEL: } combiner {
! ACC_COMBINE: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>, %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>>):
! ACC_COMBINE: %[[CONSTANT_0:.*]] = arith.constant 1 : index
@@ -1922,70 +1922,70 @@ subroutine acc_reduction_logical_allocatable(l)
! ACC_COMBINE: }
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ptr<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.heap<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<complex<f32>>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<complex<f32>>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_neqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_neqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_eqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_eqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_land_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_land_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_xor_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_xor_optional_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <xor> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_ior_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_ior_optional_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <ior> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_iand_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_iand_optional_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <iand> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
! ACC_COMBINE-NOT: acc.reduction_combine
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
diff --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90
index de070262a52fb..cd9bc57bca1ed 100644
--- a/flang/test/Lower/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90
@@ -657,8 +657,8 @@ subroutine acc_serial_loop
! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}
! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}
! CHECK: acc.serial {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>)
! CHECK-NOT: fir.do_loop
! CHECK: acc.yield
diff --git a/flang/test/Lower/OpenACC/acc-serial.f90 b/flang/test/Lower/OpenACC/acc-serial.f90
index e46e9a9281664..52af3fd0d7aaf 100644
--- a/flang/test/Lower/OpenACC/acc-serial.f90
+++ b/flang/test/Lower/OpenACC/acc-serial.f90
@@ -279,8 +279,8 @@ subroutine acc_serial
!$acc serial reduction(+:reduction_r) reduction(*:reduction_i)
!$acc end serial
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.serial reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90 b/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90
index 2bfc5615ff657..c1310e3920de3 100644
--- a/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90
+++ b/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90
@@ -359,8 +359,8 @@ subroutine nested_loop_with_reduction(x, y)
!$acc end parallel
! CHECK: acc.parallel {
-! CHECK: %[[REDUCTION_X:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "x"}
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "y"}
+! CHECK: %[[REDUCTION_X:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_optional_ref_i32) -> !fir.ref<i32> {name = "x"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_optional_ref_i32) -> !fir.ref<i32> {name = "y"}
! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}
! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_X]], %[[REDUCTION_Y]] : !fir.ref<i32>, !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)
! CHECK: %[[PRIVATE_I_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I]] {uniq_name = "_QFnested_loop_with_reductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
>From da22ab4fb45f10083fdb4024c3c8275e1db5319b Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 2 Apr 2026 20:27:22 -0700
Subject: [PATCH 4/6] [flang][OpenACC] Fix recipe creation to use original
variable, not acc op result
Pass the original variable address (info.addr / symAddr) to
createOrGetReductionRecipe instead of the acc.reduction result
(op.getAccVar()). The acc op result is defined by acc.reduction which
hlfir::Entity::mayBeOptional() doesn't recognize as definitely
non-optional, causing spurious "_optional" in recipe names.
Using the original variable (typically defined by hlfir.declare) allows
mayBeOptional() to correctly query isOptional() via
FortranVariableOpInterface, preserving the correct recipe names.
Made-with: Cursor
---
flang/lib/Lower/OpenACC.cpp | 5 +-
flang/test/Lower/OpenACC/acc-kernels-loop.f90 | 4 +-
flang/test/Lower/OpenACC/acc-loop.f90 | 4 +-
.../test/Lower/OpenACC/acc-parallel-loop.f90 | 4 +-
flang/test/Lower/OpenACC/acc-parallel.f90 | 4 +-
.../Lower/OpenACC/acc-reduction-maxmin.f90 | 32 +--
.../Lower/OpenACC/acc-reduction-remapping.f90 | 8 +-
flang/test/Lower/OpenACC/acc-reduction.f90 | 228 +++++++++---------
flang/test/Lower/OpenACC/acc-serial-loop.f90 | 4 +-
flang/test/Lower/OpenACC/acc-serial.f90 | 4 +-
.../Lower/OpenACC/do-loops-to-acc-loops.f90 | 4 +-
11 files changed, 150 insertions(+), 151 deletions(-)
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index cd33a55e9292b..c7a22022bfb30 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -1181,8 +1181,7 @@ genReductions(const Fortran::parser::AccObjectListWithReduction &objectList,
fastMathAttr = mlir::arith::FastMathFlagsAttr::get(
builder.getContext(), builder.getFastMathFlags());
mlir::SymbolRefAttr recipe = fir::acc::createOrGetReductionRecipe(
- builder, operandLocation, op.getAccVar(), mlirOp, bounds,
- fastMathAttr);
+ builder, operandLocation, info.addr, mlirOp, bounds, fastMathAttr);
op.setRecipeAttr(recipe);
reductionOperands.push_back(op.getAccVar());
// Track the symbol and its corresponding mlir::Value if requested so that
@@ -1605,7 +1604,7 @@ static void processDoConcurrentLocalitySpecs(
fastMathAttr = mlir::arith::FastMathFlagsAttr::get(
builder.getContext(), builder.getFastMathFlags());
mlir::SymbolRefAttr recipe = fir::acc::createOrGetReductionRecipe(
- builder, loc, op.getAccVar(), mlirOp, bounds, fastMathAttr);
+ builder, loc, symAddr, mlirOp, bounds, fastMathAttr);
op.setRecipeAttr(recipe);
reductionOperands.push_back(op.getAccVar());
dataMap.emplaceSymbol(op.getAccVar(),
diff --git a/flang/test/Lower/OpenACC/acc-kernels-loop.f90 b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
index 51bbcd2c2467e..70f5b7d30cb9a 100644
--- a/flang/test/Lower/OpenACC/acc-kernels-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
@@ -704,8 +704,8 @@ subroutine acc_kernels_loop
! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}
! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}
! CHECK: acc.kernels {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {{.*}} {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90
index 69210d4f77d7c..ed87cf76038b5 100644
--- a/flang/test/Lower/OpenACC/acc-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-loop.f90
@@ -334,8 +334,8 @@ program acc_loop
reduction_i = 1
end do
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}
! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) control(%arg0 : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32) {
! CHECK: acc.yield
diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
index 2de063a624154..b5ad46a69c125 100644
--- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
@@ -722,8 +722,8 @@ subroutine acc_parallel_loop
! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}
! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}
! CHECK: acc.parallel {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {{.*}}
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90
index 34e30b99abcec..6d6cc9c623ce5 100644
--- a/flang/test/Lower/OpenACC/acc-parallel.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel.f90
@@ -337,8 +337,8 @@ subroutine acc_parallel
!$acc parallel reduction(+:reduction_r) reduction(*:reduction_i)
!$acc end parallel
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32>
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32>
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32>
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32>
! CHECK: acc.parallel reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90 b/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90
index 81a90206fb0d7..cd6e3fd2fb07b 100644
--- a/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90
+++ b/flang/test/Lower/OpenACC/acc-reduction-maxmin.f90
@@ -33,84 +33,84 @@ subroutine acc_array_reduction_min(a)
!$acc end parallel
end subroutine acc_array_reduction_min
-! LEGACY-LABEL: acc.reduction.recipe @reduction_min_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_min_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
! LEGACY: } combiner {
! LEGACY: fir.do_loop
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! LEGACY-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! LEGACY: } combiner {
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! LEGACY-LABEL: acc.reduction.recipe @reduction_max_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_max_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
! LEGACY: } combiner {
! LEGACY: fir.do_loop
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! LEGACY-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! LEGACY-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! LEGACY: } combiner {
! LEGACY: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<contract> : f32
! LEGACY: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minimumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minimumf> init {
! EXTREMUM: } combiner {
! EXTREMUM: fir.do_loop
! EXTREMUM: %[[MINIMUMF_0:.*]] = arith.minimumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <minimumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_minimumf_ref_f32 : !fir.ref<f32> reduction_operator <minimumf> init {
! EXTREMUM: %[[CST:.*]] = arith.constant 3.40282347E+38 : f32
! EXTREMUM: } combiner {
! EXTREMUM: %[[MINIMUMF_0:.*]] = arith.minimumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maximumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maximumf> init {
! EXTREMUM: } combiner {
! EXTREMUM: fir.do_loop
! EXTREMUM: %[[MAXIMUMF_0:.*]] = arith.maximumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <maximumf> init {
+! EXTREMUM-LABEL: acc.reduction.recipe @reduction_maximumf_ref_f32 : !fir.ref<f32> reduction_operator <maximumf> init {
! EXTREMUM-LABEL: } combiner {
! EXTREMUM: %[[MAXIMUMF_0:.*]] = arith.maximumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <minnumf> init {
! EXTREMENUM: } combiner {
! EXTREMENUM: fir.do_loop
! EXTREMENUM: %[[MINNUMF_0:.*]] = arith.minnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <minnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_minnumf_ref_f32 : !fir.ref<f32> reduction_operator <minnumf> init {
! EXTREMENUM: %[[CST:.*]] = arith.constant 3.40282347E+38 : f32
! EXTREMENUM: } combiner {
! EXTREMENUM: %[[MINNUMF_0:.*]] = arith.minnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maxnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <maxnumf> init {
! EXTREMENUM: } combiner {
! EXTREMENUM: fir.do_loop
! EXTREMENUM: %[[MAXNUMF_0:.*]] = arith.maxnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_optional_ref_f32 : !fir.ref<f32> reduction_operator <maxnumf> init {
+! EXTREMENUM-LABEL: acc.reduction.recipe @reduction_maxnumf_ref_f32 : !fir.ref<f32> reduction_operator <maxnumf> init {
! EXTREMENUM-LABEL: } combiner {
! EXTREMENUM: %[[MAXNUMF_0:.*]] = arith.maxnumf %{{.*}}, %{{.*}} fastmath<contract> : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <min> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: fir.do_loop
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf olt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_optional_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_ref_10xf32 : !fir.ref<!fir.array<10xf32>> reduction_operator <max> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: fir.do_loop
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
-! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! PORTABLE-NANNSZ-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! PORTABLE-NANNSZ: } combiner {
! PORTABLE-NANNSZ: %[[CMPF_0:.*]] = arith.cmpf ogt, %[[LOAD_1:.*]], %[[LOAD_0:.*]] fastmath<nnan,nsz,contract> : f32
! PORTABLE-NANNSZ: %[[SELECT_0:.*]] = arith.select %[[CMPF_0]], %[[LOAD_1]], %[[LOAD_0]] : f32
diff --git a/flang/test/Lower/OpenACC/acc-reduction-remapping.f90 b/flang/test/Lower/OpenACC/acc-reduction-remapping.f90
index b93f79c67e349..8c69efe7e8de6 100644
--- a/flang/test/Lower/OpenACC/acc-reduction-remapping.f90
+++ b/flang/test/Lower/OpenACC/acc-reduction-remapping.f90
@@ -53,7 +53,7 @@ subroutine array_split(x, y, n)
! CHECK-LABEL: func.func @_QPscalar_combined(
! CHECK: %[[DUMMY_SCOPE_0:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_Y:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %[[DUMMY_SCOPE_0]] arg 2 {uniq_name = "_QFscalar_combinedEy"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y]]#0 : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y]]#0 : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "y"}
! CHECK: acc.parallel {{.*}} reduction(%[[REDUCTION_Y]] : !fir.ref<f32>) {
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_RED_PAR:.*]]:2 = hlfir.declare %[[REDUCTION_Y]] dummy_scope %[[DUMMY_SCOPE_1]] arg 2 {uniq_name = "_QFscalar_combinedEy"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
@@ -81,7 +81,7 @@ subroutine array_split(x, y, n)
! CHECK: acc.parallel dataOperands({{.*}}%[[CREATE_Y]] : {{.*}}) {
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_Y_PAR:.*]]:2 = hlfir.declare %[[CREATE_Y]] dummy_scope %[[DUMMY_SCOPE_1]] arg 2 {uniq_name = "_QFscalar_splitEy"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y_PAR]]#0 : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%[[DECLARE_Y_PAR]]#0 : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "y"}
! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr({{.*}}) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}
! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_Y]] : !fir.ref<f32>) {{.*}} {
! CHECK: %[[DUMMY_SCOPE_2:.*]] = fir.dummy_scope : !fir.dscope
@@ -101,7 +101,7 @@ subroutine array_split(x, y, n)
! CHECK: %[[DUMMY_SCOPE_0:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[DECLARE_N:.*]]:2 = hlfir.declare %{{.*}} dummy_scope %[[DUMMY_SCOPE_0]] arg 3 {uniq_name = "_QFarray_combinedEn"} : (!fir.ref<i64>, !fir.dscope) -> (!fir.ref<i64>, !fir.ref<i64>)
! CHECK: %[[DECLARE_Y:.*]]:2 = hlfir.declare %{{.*}}({{.*}}) dummy_scope %[[DUMMY_SCOPE_0]] arg 2 {uniq_name = "_QFarray_combinedEy"} : (!fir.ref<!fir.array<?xf32>>, {{.*}}, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.ref<!fir.array<?xf32>>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_optional_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
! CHECK: acc.parallel dataOperands({{.*}}) reduction(%[[REDUCTION_Y]] : !fir.box<!fir.array<?xf32>>) {
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[BOX_ADDR_RED:.*]] = fir.box_addr %[[REDUCTION_Y]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
@@ -135,7 +135,7 @@ subroutine array_split(x, y, n)
! CHECK: %[[DUMMY_SCOPE_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[BOX_ADDR_Y:.*]] = fir.box_addr %[[CREATE_Y]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
! CHECK: %[[DECLARE_Y_PAR:.*]]:2 = hlfir.declare %[[BOX_ADDR_Y]]({{.*}}) dummy_scope %[[DUMMY_SCOPE_1]] arg 2 {uniq_name = "_QFarray_splitEy"} : (!fir.ref<!fir.array<?xf32>>, {{.*}}, !fir.dscope) -> (!fir.box<!fir.array<?xf32>>, !fir.ref<!fir.array<?xf32>>)
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y_PAR]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_optional_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction var(%[[DECLARE_Y_PAR]]#0 : !fir.box<!fir.array<?xf32>>) recipe(@reduction_add_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "y"}
! CHECK: %[[PRIVATE_J:.*]] = acc.private varPtr({{.*}}) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "j"}
! CHECK: acc.loop private(%[[PRIVATE_J]] : !fir.ref<i32>) reduction(%[[REDUCTION_Y]] : !fir.box<!fir.array<?xf32>>) {{.*}} {
! CHECK: %[[BOX_ADDR_RED:.*]] = fir.box_addr %[[REDUCTION_Y]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>
diff --git a/flang/test/Lower/OpenACC/acc-reduction.f90 b/flang/test/Lower/OpenACC/acc-reduction.f90
index a7b76cf2a0a82..49789efc545ba 100644
--- a/flang/test/Lower/OpenACC/acc-reduction.f90
+++ b/flang/test/Lower/OpenACC/acc-reduction.f90
@@ -3,7 +3,7 @@
! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
! RUN: bbc -fopenacc -emit-hlfir %s -o - -openacc-use-reduction-combine | FileCheck -check-prefix=ACC_COMBINE %s
-! CHECK-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_lor_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant false
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>
@@ -38,7 +38,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?x?xf32>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[CONSTANT_1:.*]] = arith.constant 0 : index
@@ -125,7 +125,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
@@ -194,7 +194,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
@@ -262,7 +262,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -331,7 +331,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.box<!fir.array<?xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
! CHECK: %[[CONSTANT_1:.*]] = arith.constant 0 : index
@@ -394,7 +394,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
! CHECK: %[[CONSTANT_1:.*]] = arith.constant 0 : index
@@ -456,7 +456,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<10x20xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<10x20xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -535,7 +535,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<10x20xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -594,7 +594,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
@@ -627,7 +627,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<i32>>>):
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
! CHECK: %[[LOAD_0:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>
@@ -659,7 +659,7 @@
! CHECK: acc.terminator
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<complex<f32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca complex<f32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1.000000e+00 : f32
@@ -679,7 +679,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<complex<f32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<complex<f32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca complex<f32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0.000000e+00 : f32
@@ -699,7 +699,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<complex<f32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_neqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_neqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant false
@@ -718,7 +718,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_eqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_eqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant true
@@ -737,7 +737,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_lor_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant false
@@ -756,7 +756,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_land_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_land_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.logical<4>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant true
@@ -775,7 +775,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.logical<4>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_xor_optional_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_xor_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -791,7 +791,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_ior_optional_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_ior_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -807,7 +807,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_iand_optional_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_iand_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -1 : i32
@@ -823,7 +823,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
@@ -858,7 +858,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -3.40282347E+38 : f32
@@ -875,7 +875,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -2147483648 : i32
@@ -917,7 +917,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_max_optional_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_max_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant -2147483648 : i32
@@ -933,7 +933,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 3.40282347E+38 : f32
@@ -976,7 +976,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 3.40282347E+38 : f32
@@ -993,7 +993,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 2147483647 : i32
@@ -1027,7 +1027,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_min_optional_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_min_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 2147483647 : i32
@@ -1043,7 +1043,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1.000000e+00 : f32
@@ -1077,7 +1077,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1.000000e+00 : f32
@@ -1093,7 +1093,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1 : i32
@@ -1127,7 +1127,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_mul_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 1 : i32
@@ -1143,7 +1143,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0.000000e+00 : f32
@@ -1177,7 +1177,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100xf32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<f32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca f32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0.000000e+00 : f32
@@ -1193,7 +1193,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<f32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10x2xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10x2xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1243,7 +1243,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10x2xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100x10xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100x10xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1285,7 +1285,7 @@
! CHECK: acc.yield %[[VAL_0]] : !fir.ref<!fir.array<100x10xi32>>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.array<100xi32>>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca !fir.array<100xi32> {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1325,7 +1325,7 @@
! CHECK: acc.yield %[[ALLOCA_0]] : !fir.ref<i32>
! CHECK: }
-! CHECK-LABEL: acc.reduction.recipe @reduction_add_optional_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
+! CHECK-LABEL: acc.reduction.recipe @reduction_add_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):
! CHECK: %[[ALLOCA_0:.*]] = fir.alloca i32 {bindc_name = "acc.reduction.init"}
! CHECK: %[[CONSTANT_0:.*]] = arith.constant 0 : i32
@@ -1354,7 +1354,7 @@ subroutine acc_reduction_add_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_add_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_add_int_array_1d(a, b)
@@ -1370,7 +1370,7 @@ subroutine acc_reduction_add_int_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_add_optional_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_add_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_add_int_array_2d(a, b)
@@ -1388,7 +1388,7 @@ subroutine acc_reduction_add_int_array_2d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int_array_2d(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "b"}) {
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_add_optional_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_add_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10xi32>>)
! CHECK: } attributes {collapse = [2]{{.*}}
@@ -1409,7 +1409,7 @@ subroutine acc_reduction_add_int_array_3d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_int_array_3d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100x10x2xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10x2xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10x2xi32>>) recipe(@reduction_add_optional_ref_100x10x2xi32) -> !fir.ref<!fir.array<100x10x2xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10x2xi32>>) recipe(@reduction_add_ref_100x10x2xi32) -> !fir.ref<!fir.array<100x10x2xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10x2xi32>>)
! CHECK: } attributes {collapse = [3]{{.*}}
@@ -1426,7 +1426,7 @@ subroutine acc_reduction_add_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_add_float_array_1d(a, b)
@@ -1442,7 +1442,7 @@ subroutine acc_reduction_add_float_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_add_float_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_add_optional_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_add_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xf32>>)
subroutine acc_reduction_mul_int(a, b)
@@ -1458,7 +1458,7 @@ subroutine acc_reduction_mul_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_mul_int_array_1d(a, b)
@@ -1474,7 +1474,7 @@ subroutine acc_reduction_mul_int_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_int_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_mul_optional_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_mul_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_mul_float(a, b)
@@ -1490,7 +1490,7 @@ subroutine acc_reduction_mul_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_mul_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_mul_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_mul_float_array_1d(a, b)
@@ -1506,7 +1506,7 @@ subroutine acc_reduction_mul_float_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_mul_float_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_mul_optional_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_mul_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<!fir.array<100xf32>>)
subroutine acc_reduction_min_int(a, b)
@@ -1522,7 +1522,7 @@ subroutine acc_reduction_min_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_min_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_min_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_min_int_array_1d(a, b)
@@ -1538,7 +1538,7 @@ subroutine acc_reduction_min_int_array_1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_int_array_1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_min_optional_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xi32>>) recipe(@reduction_min_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_min_float(a, b)
@@ -1554,7 +1554,7 @@ subroutine acc_reduction_min_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_min_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_min_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_min_float_array2d(a, b)
@@ -1572,7 +1572,7 @@ subroutine acc_reduction_min_float_array2d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_min_float_array2d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100x10xf32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xf32>>) recipe(@reduction_min_optional_ref_100x10xf32) -> !fir.ref<!fir.array<100x10xf32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xf32>>) recipe(@reduction_min_ref_100x10xf32) -> !fir.ref<!fir.array<100x10xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10xf32>>)
! CHECK: attributes {collapse = [2]{{.*}}
@@ -1589,7 +1589,7 @@ subroutine acc_reduction_max_int(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_int(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<i32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_max_optional_ref_i32) -> !fir.ref<i32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<i32>) recipe(@reduction_max_ref_i32) -> !fir.ref<i32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<i32>)
subroutine acc_reduction_max_int_array2d(a, b)
@@ -1607,7 +1607,7 @@ subroutine acc_reduction_max_int_array2d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_int_array2d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x10xi32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_max_optional_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100x10xi32>>) recipe(@reduction_max_ref_100x10xi32) -> !fir.ref<!fir.array<100x10xi32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100x10xi32>>)
subroutine acc_reduction_max_float(a, b)
@@ -1623,7 +1623,7 @@ subroutine acc_reduction_max_float(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_float(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<f32> {fir.bindc_name = "b"})
! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]
-! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_max_optional_ref_f32) -> !fir.ref<f32> {name = "b"}
+! CHECK: %[[RED_B:.*]] = acc.reduction varPtr(%[[DECLB]]#0 : !fir.ref<f32>) recipe(@reduction_max_ref_f32) -> !fir.ref<f32> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_B]] : !fir.ref<f32>)
subroutine acc_reduction_max_float_array1d(a, b)
@@ -1639,7 +1639,7 @@ subroutine acc_reduction_max_float_array1d(a, b)
! CHECK-LABEL: func.func @_QPacc_reduction_max_float_array1d(
! CHECK-SAME: %{{.*}}: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "b"})
! CHECK: %[[DECLARG1:.*]]:2 = hlfir.declare %[[ARG1]]
-! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_max_optional_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
+! CHECK: %[[RED_ARG1:.*]] = acc.reduction varPtr(%[[DECLARG1]]#0 : !fir.ref<!fir.array<100xf32>>) recipe(@reduction_max_ref_100xf32) -> !fir.ref<!fir.array<100xf32>> {name = "b"}
! CHECK: acc.loop {{.*}} reduction(%[[RED_ARG1]] : !fir.ref<!fir.array<100xf32>>)
subroutine acc_reduction_iand()
@@ -1649,7 +1649,7 @@ subroutine acc_reduction_iand()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_iand()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_iand_optional_ref_i32) -> !fir.ref<i32> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_iand_ref_i32) -> !fir.ref<i32> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<i32>)
subroutine acc_reduction_ior()
@@ -1659,7 +1659,7 @@ subroutine acc_reduction_ior()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_ior()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_ior_optional_ref_i32) -> !fir.ref<i32> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_ior_ref_i32) -> !fir.ref<i32> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<i32>)
subroutine acc_reduction_ieor()
@@ -1669,7 +1669,7 @@ subroutine acc_reduction_ieor()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_ieor()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_xor_optional_ref_i32) -> !fir.ref<i32> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_xor_ref_i32) -> !fir.ref<i32> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<i32>)
subroutine acc_reduction_and()
@@ -1681,7 +1681,7 @@ subroutine acc_reduction_and()
! CHECK-LABEL: func.func @_QPacc_reduction_and()
! CHECK: %[[L:.*]] = fir.alloca !fir.logical<4> {bindc_name = "l", uniq_name = "_QFacc_reduction_andEl"}
! CHECK: %[[DECLL:.*]]:2 = hlfir.declare %[[L]]
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLL]]#0 : !fir.ref<!fir.logical<4>>) recipe(@reduction_land_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLL]]#0 : !fir.ref<!fir.logical<4>>) recipe(@reduction_land_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_or()
@@ -1691,7 +1691,7 @@ subroutine acc_reduction_or()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_or()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_lor_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_lor_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_eqv()
@@ -1701,7 +1701,7 @@ subroutine acc_reduction_eqv()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_eqv()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_eqv_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_eqv_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_neqv()
@@ -1711,7 +1711,7 @@ subroutine acc_reduction_neqv()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_neqv()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_neqv_optional_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) recipe(@reduction_neqv_ref_l32) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.logical<4>>)
subroutine acc_reduction_add_cmplx()
@@ -1721,7 +1721,7 @@ subroutine acc_reduction_add_cmplx()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_add_cmplx()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_add_optional_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_add_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<complex<f32>>)
subroutine acc_reduction_mul_cmplx()
@@ -1731,7 +1731,7 @@ subroutine acc_reduction_mul_cmplx()
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_mul_cmplx()
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_mul_optional_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<complex<f32>>) recipe(@reduction_mul_ref_z32) -> !fir.ref<complex<f32>> {name = "c"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<complex<f32>>)
subroutine acc_reduction_add_alloc()
@@ -1744,7 +1744,7 @@ subroutine acc_reduction_add_alloc()
! CHECK-LABEL: func.func @_QPacc_reduction_add_alloc()
! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "i", uniq_name = "_QFacc_reduction_add_allocEi"}
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ALLOCA]]
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>) recipe(@reduction_add_optional_ref_box_heap_i32) -> !fir.ref<!fir.box<!fir.heap<i32>>> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>) recipe(@reduction_add_ref_box_heap_i32) -> !fir.ref<!fir.box<!fir.heap<i32>>> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.heap<i32>>>)
subroutine acc_reduction_add_pointer(i)
@@ -1756,7 +1756,7 @@ subroutine acc_reduction_add_pointer(i)
! CHECK-LABEL: func.func @_QPacc_reduction_add_pointer(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "i"})
! CHECK: %[[DECLARG0:.*]]:2 = hlfir.declare %[[ARG0]]
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>) recipe(@reduction_add_optional_ref_box_ptr_i32) -> !fir.ref<!fir.box<!fir.ptr<i32>>> {name = "i"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>) recipe(@reduction_add_ref_box_ptr_i32) -> !fir.ref<!fir.box<!fir.ptr<i32>>> {name = "i"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.ptr<i32>>>)
subroutine acc_reduction_add_static_slice(a)
@@ -1773,7 +1773,7 @@ subroutine acc_reduction_add_static_slice(a)
! CHECK: %[[LB:.*]] = arith.constant 10 : index
! CHECK: %[[UB:.*]] = arith.constant 19 : index
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%[[C100]] : index) stride(%[[C1]] : index) startIdx(%[[C1]] : index)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_optional_section_lb10.ub19_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "a(11:20)"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_section_lb10.ub19_ref_100xi32) -> !fir.ref<!fir.array<100xi32>> {name = "a(11:20)"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.array<100xi32>>)
subroutine acc_reduction_add_static_slice_2d(a)
@@ -1795,7 +1795,7 @@ subroutine acc_reduction_add_static_slice_2d(a)
! CHECK: %[[UB19:.*]] = arith.constant 19 : index
! CHECK: %[[BOUND1:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB19]] : index) extent(%[[C20]] : index)
! stride(%[[STRIDE1]] : index) startIdx(%[[C1]] : index)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<10x20xi32>>) bounds(%[[BOUND0]], %[[BOUND1]]) recipe(@reduction_add_optional_section_lb0.ub9xlb0.ub19_ref_10x20xi32) ->
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECLARG0]]#0 : !fir.ref<!fir.array<10x20xi32>>) bounds(%[[BOUND0]], %[[BOUND1]]) recipe(@reduction_add_section_lb0.ub9xlb0.ub19_ref_10x20xi32) ->
! !fir.ref<!fir.array<10x20xi32>> {name = "a(:10,:20)"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.array<10x20xi32>>)
@@ -1808,7 +1808,7 @@ subroutine acc_reduction_add_dynamic_extent_add(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_dynamic_extent_add(
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"})
! CHECK: %[[DECLARG0:.*]]:2 = hlfir.declare %[[ARG0]]
-! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xi32>>) recipe(@reduction_add_optional_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xi32>>) recipe(@reduction_add_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED:.*]] : !fir.box<!fir.array<?xi32>>)
subroutine acc_reduction_add_assumed_shape_max(a)
@@ -1820,7 +1820,7 @@ subroutine acc_reduction_add_assumed_shape_max(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_assumed_shape_max(
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "a"})
! CHECK: %[[DECLARG0:.*]]:2 = hlfir.declare %[[ARG0]]
-! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xf32>>) recipe(@reduction_max_optional_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%{{.*}} : !fir.box<!fir.array<?xf32>>) recipe(@reduction_max_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.box<!fir.array<?xf32>>) {
subroutine acc_reduction_add_dynamic_extent_add_with_section(a)
@@ -1833,7 +1833,7 @@ subroutine acc_reduction_add_dynamic_extent_add_with_section(a)
! CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"})
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFacc_reduction_add_dynamic_extent_add_with_sectionEa"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%c1{{.*}} : index) upperbound(%c3{{.*}} : index) extent(%{{.*}}#1 : index) stride(%{{.*}}#2 : index) startIdx(%{{.*}} : index) {strideInBytes = true}
-! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL]]#0 : !fir.box<!fir.array<?xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_optional_section_lb1.ub3_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a(2:4)"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL]]#0 : !fir.box<!fir.array<?xi32>>) bounds(%[[BOUND]]) recipe(@reduction_add_section_lb1.ub3_box_Uxi32) -> !fir.box<!fir.array<?xi32>> {name = "a(2:4)"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.box<!fir.array<?xi32>>)
subroutine acc_reduction_add_allocatable(a)
@@ -1845,7 +1845,7 @@ subroutine acc_reduction_add_allocatable(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_allocatable(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {fir.bindc_name = "a"})
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFacc_reduction_add_allocatableEa"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.dscope) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) recipe(@reduction_max_optional_ref_box_heap_Uxf32) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) recipe(@reduction_max_ref_box_heap_Uxf32) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>)
subroutine acc_reduction_add_pointer_array(a)
@@ -1857,7 +1857,7 @@ subroutine acc_reduction_add_pointer_array(a)
! CHECK-LABEL: func.func @_QPacc_reduction_add_pointer_array(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {fir.bindc_name = "a"})
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFacc_reduction_add_pointer_arrayEa"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.dscope) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
-! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) recipe(@reduction_max_optional_ref_box_ptr_Uxf32) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%[[DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) recipe(@reduction_max_ref_box_ptr_Uxf32) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
subroutine acc_reduction_max_dynamic_extent_max(a, n)
@@ -1870,7 +1870,7 @@ subroutine acc_reduction_max_dynamic_extent_max(a, n)
! CHECK-LABEL: func.func @_QPacc_reduction_max_dynamic_extent_max(
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<?x?xf32>> {fir.bindc_name = "a"}, %{{.*}}: !fir.ref<i32> {fir.bindc_name = "n"})
! CHECK: %[[DECL_A:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFacc_reduction_max_dynamic_extent_maxEa"} : (!fir.ref<!fir.array<?x?xf32>>, !fir.shape<2>, !fir.dscope) -> (!fir.box<!fir.array<?x?xf32>>, !fir.ref<!fir.array<?x?xf32>>)
-! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL_A]]#0 : !fir.box<!fir.array<?x?xf32>>) recipe(@reduction_max_optional_box_UxUxf32) -> !fir.box<!fir.array<?x?xf32>> {name = "a"}
+! CHECK: %[[RED:.*]] = acc.reduction var(%[[DECL_A]]#0 : !fir.box<!fir.array<?x?xf32>>) recipe(@reduction_max_box_UxUxf32) -> !fir.box<!fir.array<?x?xf32>> {name = "a"}
! CHECK: acc.parallel reduction(%[[RED]] : !fir.box<!fir.array<?x?xf32>>)
subroutine acc_reduction_logical_allocatable(l)
@@ -1879,19 +1879,19 @@ subroutine acc_reduction_logical_allocatable(l)
!$acc end parallel
end subroutine
! CHECK-LABEL: func.func @_QPacc_reduction_logical_allocatable(
-! CHECK: %[[REDUCTION_0:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>) recipe(@reduction_lor_optional_ref_box_heap_l32) -> !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> {name = "l"}
+! CHECK: %[[REDUCTION_0:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>) recipe(@reduction_lor_ref_box_heap_l32) -> !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> {name = "l"}
! CHECK: acc.parallel reduction(%[[REDUCTION_0]] : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>>)
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_ref_box_heap_l32 : !fir.ref<!fir.box<!fir.heap<!fir.logical<4>>>> reduction_operator <lor> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_box_UxUxf32 : !fir.box<!fir.array<?x?xf32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_box_ptr_Uxf32 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_box_heap_Uxf32 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_section_lb1.ub3_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! ACC_COMBINE-LABEL: } combiner {
! ACC_COMBINE: ^bb0(%[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>>, %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>>):
! ACC_COMBINE: %[[CONSTANT_0:.*]] = arith.constant 1 : index
@@ -1922,70 +1922,70 @@ subroutine acc_reduction_logical_allocatable(l)
! ACC_COMBINE: }
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_box_Uxf32 : !fir.box<!fir.array<?xf32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_box_Uxi32 : !fir.box<!fir.array<?xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_section_lb0.ub9xlb0.ub19_ref_10x20xi32 : !fir.ref<!fir.array<10x20xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_section_lb10.ub19_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_box_ptr_i32 : !fir.ref<!fir.box<!fir.ptr<i32>>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ptr<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.heap<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_z32 : !fir.ref<complex<f32>> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<complex<f32>>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_z32 : !fir.ref<complex<f32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<complex<f32>>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_neqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_neqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <neqv> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_eqv_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_eqv_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <eqv> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_lor_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <lor> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_land_optional_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_land_ref_l32 : !fir.ref<!fir.logical<4>> reduction_operator <land> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_xor_optional_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_xor_ref_i32 : !fir.ref<i32> reduction_operator <xor> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <xor> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_ior_optional_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_ior_ref_i32 : !fir.ref<i32> reduction_operator <ior> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <ior> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_iand_optional_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_iand_ref_i32 : !fir.ref<i32> reduction_operator <iand> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <iand> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_f32 : !fir.ref<f32> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_optional_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_max_ref_i32 : !fir.ref<i32> reduction_operator <max> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_100x10xf32 : !fir.ref<!fir.array<100x10xf32>> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_f32 : !fir.ref<f32> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_optional_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_min_ref_i32 : !fir.ref<i32> reduction_operator <min> init {
! ACC_COMBINE-NOT: acc.reduction_combine
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <mul> init {
! ACC_COMBINE-NOT: acc.reduction_combine
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_f32 : !fir.ref<f32> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_optional_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_mul_ref_i32 : !fir.ref<i32> reduction_operator <mul> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <mul> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100xf32 : !fir.ref<!fir.array<100xf32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_f32 : !fir.ref<f32> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<f32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100x10x2xi32 : !fir.ref<!fir.array<100x10x2xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100x10xi32 : !fir.ref<!fir.array<100x10xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_100xi32 : !fir.ref<!fir.array<100xi32>> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
-! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_optional_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
+! ACC_COMBINE-LABEL: acc.reduction.recipe @reduction_add_ref_i32 : !fir.ref<i32> reduction_operator <add> init {
! ACC_COMBINE: acc.reduction_combine %{{.*}} into %{{.*}} <add> : !fir.ref<i32>
diff --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90
index cd9bc57bca1ed..de070262a52fb 100644
--- a/flang/test/Lower/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90
@@ -657,8 +657,8 @@ subroutine acc_serial_loop
! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}
! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}
! CHECK: acc.serial {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>)
! CHECK-NOT: fir.do_loop
! CHECK: acc.yield
diff --git a/flang/test/Lower/OpenACC/acc-serial.f90 b/flang/test/Lower/OpenACC/acc-serial.f90
index 52af3fd0d7aaf..e46e9a9281664 100644
--- a/flang/test/Lower/OpenACC/acc-serial.f90
+++ b/flang/test/Lower/OpenACC/acc-serial.f90
@@ -279,8 +279,8 @@ subroutine acc_serial
!$acc serial reduction(+:reduction_r) reduction(*:reduction_i)
!$acc end serial
-! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_optional_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
-! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_optional_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
+! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}
+! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}
! CHECK: acc.serial reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
diff --git a/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90 b/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90
index c1310e3920de3..2bfc5615ff657 100644
--- a/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90
+++ b/flang/test/Lower/OpenACC/do-loops-to-acc-loops.f90
@@ -359,8 +359,8 @@ subroutine nested_loop_with_reduction(x, y)
!$acc end parallel
! CHECK: acc.parallel {
-! CHECK: %[[REDUCTION_X:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_optional_ref_i32) -> !fir.ref<i32> {name = "x"}
-! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_optional_ref_i32) -> !fir.ref<i32> {name = "y"}
+! CHECK: %[[REDUCTION_X:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "x"}
+! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "y"}
! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}
! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_X]], %[[REDUCTION_Y]] : !fir.ref<i32>, !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)
! CHECK: %[[PRIVATE_I_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I]] {uniq_name = "_QFnested_loop_with_reductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
>From 92c2895e626099f65dcab0ced8e9c2b8cef51cf5 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 2 Apr 2026 21:17:28 -0700
Subject: [PATCH 5/6] [flang][OpenACC] Apply clang-format
Made-with: Cursor
---
flang/lib/Lower/OpenACC.cpp | 41 ++++++++++++++++---------------------
1 file changed, 18 insertions(+), 23 deletions(-)
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index c7a22022bfb30..5a7fe899b372f 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -1565,8 +1565,8 @@ static void processDoConcurrentLocalitySpecs(
llvm::SmallVector<mlir::Value> &privateOperands,
llvm::SmallVector<mlir::Value> &firstprivateOperands,
llvm::SmallVector<mlir::Value> &reductionOperands, AccDataMap &dataMap,
- llvm::SmallVector<std::pair<Fortran::semantics::SymbolRef,
- Fortran::semantics::SymbolRef>>
+ llvm::SmallVector<
+ std::pair<Fortran::semantics::SymbolRef, Fortran::semantics::SymbolRef>>
&localSymPairs) {
for (const Fortran::parser::LocalitySpec &locSpec : localityList) {
if (const auto *reduceSpec =
@@ -1632,9 +1632,8 @@ static void processDoConcurrentLocalitySpecs(
fir::acc::createOrGetPrivateRecipe(builder, loc, symAddr, bounds);
op.setRecipeAttr(recipe);
privateOperands.push_back(op.getAccVar());
- dataMap.emplaceSymbol(
- op.getAccVar(),
- Fortran::semantics::SymbolRef(ultimateSym));
+ dataMap.emplaceSymbol(op.getAccVar(),
+ Fortran::semantics::SymbolRef(ultimateSym));
if (name.symbol->HasLocalLocality())
localSymPairs.emplace_back(
Fortran::semantics::SymbolRef(*name.symbol),
@@ -1662,9 +1661,8 @@ static void processDoConcurrentLocalitySpecs(
builder, loc, symAddr, bounds);
op.setRecipeAttr(recipe);
firstprivateOperands.push_back(op.getAccVar());
- dataMap.emplaceSymbol(
- op.getAccVar(),
- Fortran::semantics::SymbolRef(ultimateSym));
+ dataMap.emplaceSymbol(op.getAccVar(),
+ Fortran::semantics::SymbolRef(ultimateSym));
if (name.symbol->HasLocalLocality())
localSymPairs.emplace_back(
Fortran::semantics::SymbolRef(*name.symbol),
@@ -1694,8 +1692,8 @@ static void processDoLoopBounds(
llvm::SmallVector<mlir::Location> &locs, uint64_t loopsToProcess,
llvm::SmallVector<mlir::Value> &reductionOperands,
llvm::SmallVector<mlir::Value> &firstprivateOperands, AccDataMap &dataMap,
- llvm::SmallVector<std::pair<Fortran::semantics::SymbolRef,
- Fortran::semantics::SymbolRef>>
+ llvm::SmallVector<
+ std::pair<Fortran::semantics::SymbolRef, Fortran::semantics::SymbolRef>>
&localSymPairs) {
assert(loopsToProcess > 0 && "expect at least one loop");
locs.push_back(currentLocation); // Location of the directive
@@ -1712,11 +1710,9 @@ static void processDoLoopBounds(
const auto &localityList =
std::get<std::list<Fortran::parser::LocalitySpec>>(concurrent.t);
if (!localityList.empty())
- processDoConcurrentLocalitySpecs(converter, currentLocation, builder,
- localityList, privateOperands,
- firstprivateOperands,
- reductionOperands, dataMap,
- localSymPairs);
+ processDoConcurrentLocalitySpecs(
+ converter, currentLocation, builder, localityList, privateOperands,
+ firstprivateOperands, reductionOperands, dataMap, localSymPairs);
const auto &concurrentHeader =
std::get<Fortran::parser::ConcurrentHeader>(concurrent.t);
@@ -1965,20 +1961,19 @@ buildACCLoopOp(Fortran::lower::AbstractConverter &converter,
llvm::SmallVector<mlir::Location> locs;
llvm::SmallVector<mlir::Value> lowerbounds, upperbounds, steps;
llvm::SmallVector<mlir::Value> firstprivateOperands;
- llvm::SmallVector<std::pair<Fortran::semantics::SymbolRef,
- Fortran::semantics::SymbolRef>>
+ llvm::SmallVector<
+ std::pair<Fortran::semantics::SymbolRef, Fortran::semantics::SymbolRef>>
localSymPairs;
// Look at the do/do concurrent loops to extract bounds information unless
// this loop is lowered in an unstructured fashion, in which case bounds are
// not represented on acc.loop and explicit control flow is used inside body.
if (!eval.lowerAsUnstructured()) {
- processDoLoopBounds(converter, currentLocation, stmtCtx, builder,
- outerDoConstruct, eval, lowerbounds, upperbounds, steps,
- privateOperands, ivPrivate, ivTypes, ivLocs,
- inclusiveBounds, locs, loopsToProcess,
- reductionOperands, firstprivateOperands, dataMap,
- localSymPairs);
+ processDoLoopBounds(
+ converter, currentLocation, stmtCtx, builder, outerDoConstruct, eval,
+ lowerbounds, upperbounds, steps, privateOperands, ivPrivate, ivTypes,
+ ivLocs, inclusiveBounds, locs, loopsToProcess, reductionOperands,
+ firstprivateOperands, dataMap, localSymPairs);
} else {
// When the loop contains early exits, privatize induction variables, but do
// not create acc.loop bounds. The control flow of the loop will be
>From 9b3b33d3798c6e7660bf14d3870ca13840e7a04b Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Fri, 3 Apr 2026 11:43:39 -0700
Subject: [PATCH 6/6] [flang][OpenACC][test] Add tests for kernels loop
auto/seq/independent with locality specs
Made-with: Cursor
---
.../OpenACC/acc-do-concurrent-locality.f90 | 55 +++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90 b/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
index 0e5060432d522..a93f3939c36c1 100644
--- a/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
+++ b/flang/test/Lower/OpenACC/acc-do-concurrent-locality.f90
@@ -239,3 +239,58 @@ subroutine reduce_with_acc_clause()
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s1"}
! CHECK-DAG: acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s2"}
! CHECK: acc.loop {{.*}}reduction(
+
+! ---------------------------------------------------------------------------
+! Explicit loop par mode clauses: auto, seq, independent
+! ---------------------------------------------------------------------------
+
+! kernels loop auto with reduce
+! CHECK-LABEL: func.func @_QPreduce_kernels_loop_auto
+subroutine reduce_kernels_loop_auto()
+ real :: a(10), s
+ integer :: i
+ s = 0.
+ !$acc kernels loop auto
+ do concurrent(i=1:10) reduce(+:s)
+ s = s + a(i)
+ end do
+end subroutine
+
+! CHECK: acc.kernels combined(loop)
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop combined(kernels) {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
+
+! kernels loop seq with reduce
+! CHECK-LABEL: func.func @_QPreduce_kernels_loop_seq
+subroutine reduce_kernels_loop_seq()
+ real :: a(10), s
+ integer :: i
+ s = 0.
+ !$acc kernels loop seq
+ do concurrent(i=1:10) reduce(+:s)
+ s = s + a(i)
+ end do
+end subroutine
+
+! CHECK: acc.kernels combined(loop)
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop combined(kernels) {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}
+
+! kernels loop independent with reduce
+! CHECK-LABEL: func.func @_QPreduce_kernels_loop_independent
+subroutine reduce_kernels_loop_independent()
+ real :: a(10), s
+ integer :: i
+ s = 0.
+ !$acc kernels loop independent
+ do concurrent(i=1:10) reduce(+:s)
+ s = s + a(i)
+ end do
+end subroutine
+
+! CHECK: acc.kernels combined(loop)
+! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add{{.*}}) -> !fir.ref<f32> {name = "s"}
+! CHECK: acc.loop combined(kernels) {{.*}}reduction(%[[RED]] : !fir.ref<f32>)
+! CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}
More information about the flang-commits
mailing list