[llvm-branch-commits] [flang] release/23.x: [flang][Lower][OpenMP] Fix reduction on array sections aborting in lowering (#209701) (PR #211237)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 22 04:31:05 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-openmp
Author: llvmbot
<details>
<summary>Changes</summary>
Backport 6c560cd
Requested by: @<!-- -->tblah
---
Full diff: https://github.com/llvm/llvm-project/pull/211237.diff
2 Files Affected:
- (modified) flang/lib/Lower/Support/ReductionProcessor.cpp (+5-1)
- (added) flang/test/Lower/OpenMP/reduction-array-section.f90 (+39)
``````````diff
diff --git a/flang/lib/Lower/Support/ReductionProcessor.cpp b/flang/lib/Lower/Support/ReductionProcessor.cpp
index b0a2fe63ef81f..80d34285101f1 100644
--- a/flang/lib/Lower/Support/ReductionProcessor.cpp
+++ b/flang/lib/Lower/Support/ReductionProcessor.cpp
@@ -387,7 +387,11 @@ bool ReductionProcessor::isExpressionLoweredAsReductionObject(
if (!object || !object->ref())
return false;
const SomeExpr &expr = *object->ref();
- return evaluate::IsArrayElement(expr);
+ // Only genuine single array elements (rank 0) are lowered via the element
+ // path. Array sections such as a(2:96) and vector subscripts have rank > 0;
+ // lowering them here produces an unsupported sequence type and aborts in
+ // PrivateReductionUtils. Let them fall back to the boxed whole-array path.
+ return evaluate::IsArrayElement(expr) && expr.Rank() == 0;
}
template <typename ParentDeclOpType>
diff --git a/flang/test/Lower/OpenMP/reduction-array-section.f90 b/flang/test/Lower/OpenMP/reduction-array-section.f90
new file mode 100644
index 0000000000000..b081c275b1929
--- /dev/null
+++ b/flang/test/Lower/OpenMP/reduction-array-section.f90
@@ -0,0 +1,39 @@
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s --implicit-check-not=omp.reduction.element
+
+! Regression test for reductions on array *sections* (e.g. a(2:96)).
+!
+! An array section has rank > 0, so it must be lowered using the boxed
+! whole-array reduction (@add_reduction_byref_box_*) and the section applied
+! via hlfir.designate inside the region. It must NOT be routed through the
+! single-element path (uniq_name = "omp.reduction.element"), which only supports
+! rank-0 references and otherwise aborts in PrivateReductionUtils with
+! "creating reduction/privatization init region for unsupported type".
+
+subroutine reduction_array_section(a, n)
+ integer :: a(100), n
+!$omp parallel do reduction(+: a(2:96))
+ do i = 1, n
+ a(2:96) = a(2:96) + i
+ end do
+end subroutine
+
+! CHECK: omp.declare_reduction @[[RED:add_reduction_byref_box_100xi32]] : !fir.ref<!fir.box<!fir.array<100xi32>>>
+
+! CHECK-LABEL: func.func @_QPreduction_array_section
+! CHECK: omp.wsloop {{.*}} reduction(byref @[[RED]] %{{[0-9]+}} -> %[[ARG:.*]] : !fir.ref<!fir.box<!fir.array<100xi32>>>) {
+! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG]] {uniq_name = "_QFreduction_array_sectionEa"}
+! CHECK: %[[BOX:.*]] = fir.load %[[DECL]]#0 : !fir.ref<!fir.box<!fir.array<100xi32>>>
+! CHECK: hlfir.designate %[[BOX]] (%c2:%c96:%c1) {{.*}} -> !fir.ref<!fir.array<95xi32>>
+
+subroutine reduction_array_section_simd(a, n)
+ integer :: a(100), n
+!$omp parallel do simd reduction(+: a(2:96))
+ do i = 1, n
+ a(2:96) = a(2:96) + i
+ end do
+end subroutine
+
+! CHECK-LABEL: func.func @_QPreduction_array_section_simd
+! CHECK: omp.wsloop reduction(byref @[[RED]] %{{[0-9]+}} -> %[[WSARG:.*]] : !fir.ref<!fir.box<!fir.array<100xi32>>>) {
+! CHECK: omp.simd {{.*}} reduction(byref @[[RED]] %[[WSARG]] -> %[[SIMDARG:.*]] : !fir.ref<!fir.box<!fir.array<100xi32>>>) {
+! CHECK: hlfir.declare %[[SIMDARG]] {uniq_name = "_QFreduction_array_section_simdEa"}
``````````
</details>
https://github.com/llvm/llvm-project/pull/211237
More information about the llvm-branch-commits
mailing list