From d59356aac5aee1d827d405b5611bb51cdcf72001 Mon Sep 17 00:00:00 2001 From: Leandro Lupori Date: Thu, 2 Apr 2026 11:09:30 -0300 Subject: [PATCH] Revert "Reland "[flang][OpenMP] Fix lowering of LINEAR iteration variables (#183794)"" (#190180) Reverts llvm/llvm-project#188851 --- .../lib/Lower/OpenMP/DataSharingProcessor.cpp | 13 ++-- flang/lib/Lower/OpenMP/OpenMP.cpp | 5 +- .../Lower/OpenMP/composite_simd_linear.f90 | 25 ++++---- .../OpenMP/distribute-parallel-do-simd.f90 | 25 ++++---- flang/test/Lower/OpenMP/distribute-simd.f90 | 6 +- flang/test/Lower/OpenMP/linear_modifier.f90 | 4 +- .../Lower/OpenMP/loop-pointer-variable.f90 | 10 +-- flang/test/Lower/OpenMP/ordered-simd.f90 | 4 +- flang/test/Lower/OpenMP/wsloop-simd.f90 | 10 +-- .../OpenMP/OpenMPToLLVMIRTranslation.cpp | 64 +++++-------------- .../Target/LLVMIR/openmp-simd-linear.mlir | 34 ---------- 11 files changed, 65 insertions(+), 135 deletions(-) delete mode 100644 mlir/test/Target/LLVMIR/openmp-simd-linear.mlir diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index c6f6b84c8b7c..78ae47534a32 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -237,6 +237,11 @@ void DataSharingProcessor::collectSymbolsForPrivatization() { // Such cases are suggested to be clearly documented and explained // instead of being silently skipped auto isException = [&](const Fortran::semantics::Symbol *sym) -> bool { + // `OmpPreDetermined` symbols cannot be exceptions since + // their privatized symbols are heavily used in FIR. + if (sym->test(Fortran::semantics::Symbol::Flag::OmpPreDetermined)) + return false; + // The handling of linear clause is deferred to the OpenMP // IRBuilder which is responsible for all its aspects, // including privatization. Privatizing linear variables at this point would @@ -260,11 +265,6 @@ void DataSharingProcessor::collectSymbolsForPrivatization() { // draw a relation between %linear and %arg0. Hence skip. if (sym->test(Fortran::semantics::Symbol::Flag::OmpLinear)) return true; - - // `OmpPreDetermined` symbols cannot be exceptions since - // their privatized symbols are heavily used in FIR. - if (sym->test(Fortran::semantics::Symbol::Flag::OmpPreDetermined)) - return false; return false; }; @@ -539,9 +539,6 @@ void DataSharingProcessor::collectPrivatizedSymbols( for (const auto *sym : allSymbols) { if (semantics::omp::IsPrivatizable(*sym) && - // Linear symbols are privatized by OpenMP IRBuilder. See comments - // in collectSymbolsForPrivatization() for more details. - !sym->test(semantics::Symbol::Flag::OmpLinear) && !symbolsInNestedRegions.contains(sym) && !explicitlyPrivatizedSymbols.contains(sym) && shouldCollectSymbol(sym) && clauseScopes.contains(&sym->owner())) { diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 4d135019ea70..f86f15921b05 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -716,10 +716,7 @@ static mlir::Operation * createAndSetPrivatizedLoopVar(lower::AbstractConverter &converter, mlir::Location loc, mlir::Value indexVal, const semantics::Symbol *sym) { - // The handling of linear symbols is deferred to the OpenMP IRBuilder, - // which is responsible for all its aspects, including privatization. - assert((converter.isPresentShallowLookup(*sym) || - sym->test(semantics::Symbol::Flag::OmpLinear)) && + assert(converter.isPresentShallowLookup(*sym) && "Expected symbol to be in symbol table."); return setLoopVar(converter, loc, indexVal, sym); } diff --git a/flang/test/Lower/OpenMP/composite_simd_linear.f90 b/flang/test/Lower/OpenMP/composite_simd_linear.f90 index ff290fc3dc4a..38ef80292326 100644 --- a/flang/test/Lower/OpenMP/composite_simd_linear.f90 +++ b/flang/test/Lower/OpenMP/composite_simd_linear.f90 @@ -9,8 +9,8 @@ subroutine do_simd !CHECK: %{{.*}} = arith.constant 1 : i32 !CHECK: %[[IV_STEP:.*]] = arith.constant 1 : i32 !CHECK: omp.wsloop { -!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[CONST]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) { -!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) { +!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[CONST]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) private(@_QFdo_simdEi_private_i32 {{.*}} -> %arg0 : !fir.ref) { +!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) private(@_QFdo_simdEi_private_i32 {{.*}} -> %arg0 : !fir.ref) { !CHECK: } !CHECK: } {linear_var_types = [i32, i32], omp.composite} !CHECK: } {omp.composite} @@ -23,11 +23,10 @@ end subroutine do_simd subroutine distribute_simd -!CHECK: %[[I:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFdistribute_simdEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) !CHECK: omp.teams { -!CHECK: omp.distribute { +!CHECK: omp.distribute private(@_QFdistribute_simdEi_private_i32 {{.*}} -> %[[ARG0:.*]] : !fir.ref) { !DEFAULT: omp.simd linear({{.*}}) { -!OPENMP52: omp.simd linear(val({{.*}})) { +!OPENMP52: omp.simd linear(val({{.*}})) private(@_QFdistribute_simdEi_private_i32 %[[ARG0]] -> {{.*}} : !fir.ref) { !CHECK: } {linear_var_types = [i32], omp.composite} !CHECK: } {omp.composite} integer :: i @@ -48,8 +47,8 @@ subroutine distribute_parallel_do !CHECK: %[[CONST]] = arith.constant 1 : i32 !CHECK: omp.distribute { !CHECK: omp.wsloop { -!DEFAULT: omp.simd linear(%[[I]]#0 : !fir.ref = %[[CONST]] : i32) { -!OPENMP52: omp.simd linear(val(%[[I]]#0 : !fir.ref = %[[CONST]] : i32)) { +!DEFAULT: omp.simd linear(%[[I]]#0 : !fir.ref = %[[CONST]] : i32) private(@_QFdistribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { +!OPENMP52: omp.simd linear(val(%[[I]]#0 : !fir.ref = %[[CONST]] : i32)) private(@_QFdistribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { !$omp teams !$omp distribute parallel do simd linear(i:1) do i = 1, N @@ -67,8 +66,8 @@ subroutine parallel_do !CHECK: %{{.*}} = arith.constant 1 : i32 !CHECK: %[[IV_STEP:.*]] = arith.constant 1 : i32 !CHECK: omp.wsloop { -!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) { -!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) { +!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) private(@_QFparallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { +!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) private(@_QFparallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { integer :: x !$omp parallel do simd linear(x:2) do i = 1, N @@ -85,8 +84,8 @@ subroutine teams_distribute !CHECK: {{.*}} = arith.constant 1 : i32 !CHECK: %[[IV_STEP:.*]] = arith.constant 1 : i32 !CHECK: omp.distribute { -!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) { -!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) { +!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) private(@_QFteams_distributeEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { +!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) private(@_QFteams_distributeEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { integer :: x !$omp teams distribute simd linear(x) do i = 1, N @@ -105,8 +104,8 @@ subroutine teams_distribute_parallel_do !CHECK: %[[IV_STEP:.*]] = arith.constant 1 : i32 !CHECK: omp.distribute { !CHECK: omp.wsloop { -!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %c1_i32 : i32, %[[I]]#0 : !fir.ref = %c1_i32_1 : i32) { -!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %c1_i32 : i32), val(%[[I]]#0 : !fir.ref = %c1_i32_1 : i32)) { +!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref = %c1_i32 : i32, %[[I]]#0 : !fir.ref = %c1_i32_1 : i32) private(@_QFteams_distribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { +!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %c1_i32 : i32), val(%[[I]]#0 : !fir.ref = %c1_i32_1 : i32)) private(@_QFteams_distribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref) { integer :: x !$omp teams distribute parallel do simd linear(x) do i = 1, N diff --git a/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 b/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 index 2543e9470452..89d8fd951f85 100644 --- a/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 +++ b/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 @@ -13,8 +13,8 @@ subroutine distribute_parallel_do_simd_num_threads() ! CHECK: omp.parallel num_threads({{.*}}) { ! CHECK: omp.distribute { ! CHECK-NEXT: omp.wsloop { - ! DEFAULT-NEXT: omp.simd linear({{.*}}) { - ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) { + ! DEFAULT-NEXT: omp.simd linear({{.*}}) private({{.*}}) { + ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) private({{.*}}) { ! CHECK-NEXT: omp.loop_nest !$omp distribute parallel do simd num_threads(10) do index_ = 1, 10 @@ -31,8 +31,8 @@ subroutine distribute_parallel_do_simd_dist_schedule() ! CHECK: omp.parallel { ! CHECK: omp.distribute dist_schedule_static dist_schedule_chunk_size({{.*}}) { ! CHECK-NEXT: omp.wsloop { - ! DEFAULT-NEXT: omp.simd linear({{.*}}) { - ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) { + ! DEFAULT-NEXT: omp.simd linear({{.*}}) private({{.*}}) { + ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) private({{.*}}) { ! CHECK-NEXT: omp.loop_nest !$omp distribute parallel do simd dist_schedule(static, 4) do index_ = 1, 10 @@ -49,8 +49,8 @@ subroutine distribute_parallel_do_simd_schedule() ! CHECK: omp.parallel { ! CHECK: omp.distribute { ! CHECK-NEXT: omp.wsloop schedule(static = {{.*}}) { - ! DEFAULT-NEXT: omp.simd linear({{.*}}) { - ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) { + ! DEFAULT-NEXT: omp.simd linear({{.*}}) private({{.*}}) { + ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) private({{.*}}) { ! CHECK-NEXT: omp.loop_nest !$omp distribute parallel do simd schedule(static, 4) do index_ = 1, 10 @@ -67,8 +67,8 @@ subroutine distribute_parallel_do_simd_simdlen() ! CHECK: omp.parallel { ! CHECK: omp.distribute { ! CHECK-NEXT: omp.wsloop { - ! DEFAULT-NEXT: omp.simd linear({{.*}}) simdlen(4) { - ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) simdlen(4) { + ! DEFAULT-NEXT: omp.simd linear({{.*}}) simdlen(4) private({{.*}}) { + ! OPENMP52-NEXT: omp.simd linear(val({{.*}})) simdlen(4) private({{.*}}) { ! CHECK-NEXT: omp.loop_nest !$omp distribute parallel do simd simdlen(4) do index_ = 1, 10 @@ -92,12 +92,13 @@ subroutine distribute_parallel_do_simd_private() ! CHECK: omp.parallel { ! CHECK: omp.distribute { ! CHECK-NEXT: omp.wsloop { - ! DEFAULT-NEXT: omp.simd linear(%{{.*}}) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^:]+]] - ! DEFAULT-SAME: : !fir.ref) { - ! OPENMP52-NEXT: omp.simd linear(val(%{{.*}})) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^:]+]] - ! OPENMP52-SAME: : !fir.ref) { + ! DEFAULT-NEXT: omp.simd linear(%{{.*}}) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^,]+]], + ! DEFAULT-SAME: @{{.*}} %[[INDEX]]#0 -> %[[INDEX_ARG:.*]] : !fir.ref, !fir.ref) { + ! OPENMP52-NEXT: omp.simd linear(val(%{{.*}})) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^,]+]], + ! OPENMP52-SAME: @{{.*}} %[[INDEX]]#0 -> %[[INDEX_ARG:.*]] : !fir.ref, !fir.ref) { ! CHECK-NEXT: omp.loop_nest ! CHECK: %[[X_PRIV:.*]]:2 = hlfir.declare %[[X_ARG]] + ! CHECK: %[[INDEX_PRIV:.*]]:2 = hlfir.declare %[[INDEX_ARG]] !$omp distribute parallel do simd private(x) do index_ = 1, 10 end do diff --git a/flang/test/Lower/OpenMP/distribute-simd.f90 b/flang/test/Lower/OpenMP/distribute-simd.f90 index f06282a10d9f..d0316d1a136a 100644 --- a/flang/test/Lower/OpenMP/distribute-simd.f90 +++ b/flang/test/Lower/OpenMP/distribute-simd.f90 @@ -61,17 +61,17 @@ end subroutine distribute_simd_simdlen ! CHECK-LABEL: func.func @_QPdistribute_simd_private( subroutine distribute_simd_private() integer, allocatable :: tmp - ! CHECK: %[[INDEX:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFdistribute_simd_privateEindex_"} ! CHECK: omp.teams !$omp teams ! CHECK: omp.distribute ! CHECK: omp.simd - ! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]] : !fir.ref>>) + ! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]], @[[PRIV_IVAR_SYM:.*]] %{{.*}} -> %[[PRIV_IVAR:.*]] : !fir.ref>>, !fir.ref) ! CHECK-NEXT: omp.loop_nest (%[[IVAR:.*]]) : i32 !$omp distribute simd private(tmp) do index_ = 1, 10 ! CHECK: %[[PRIV_BOX_DECL:.*]]:2 = hlfir.declare %[[PRIV_BOX]] - ! CHECK: hlfir.assign %[[IVAR]] to %[[INDEX]]#0 + ! CHECK: %[[PRIV_IVAR_DECL:.*]]:2 = hlfir.declare %[[PRIV_IVAR]] + ! CHECK: hlfir.assign %[[IVAR]] to %[[PRIV_IVAR_DECL]]#0 end do !$omp end distribute simd !$omp end teams diff --git a/flang/test/Lower/OpenMP/linear_modifier.f90 b/flang/test/Lower/OpenMP/linear_modifier.f90 index 624fa170cc1b..8364e5d698f0 100644 --- a/flang/test/Lower/OpenMP/linear_modifier.f90 +++ b/flang/test/Lower/OpenMP/linear_modifier.f90 @@ -42,8 +42,8 @@ subroutine do_simd_linear !CHECK: %{{.*}} = arith.constant 1 : i32 !CHECK: %[[IV_STEP:.*]] = arith.constant 1 : i32 !CHECK: omp.wsloop { -!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) { -!OPENMP45: omp.simd linear(%[[X]]#0 : !fir.ref = %[[CONST]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) { +!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32)) private({{.*}}) { +!OPENMP45: omp.simd linear(%[[X]]#0 : !fir.ref = %[[CONST]] : i32, %[[I]]#0 : !fir.ref = %[[IV_STEP]] : i32) private({{.*}}) { integer :: x !$omp do simd linear(x:1) do i = 1, 10 diff --git a/flang/test/Lower/OpenMP/loop-pointer-variable.f90 b/flang/test/Lower/OpenMP/loop-pointer-variable.f90 index 5a2ca05be7cc..0ca5d3a197dc 100644 --- a/flang/test/Lower/OpenMP/loop-pointer-variable.f90 +++ b/flang/test/Lower/OpenMP/loop-pointer-variable.f90 @@ -8,7 +8,6 @@ program loop_var integer, pointer :: ip1, ip2 integer, allocatable :: ia1 -!CHECK: %[[IA1:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QFEia1"} !CHECK: omp.wsloop private(@_QFEip1_private_box_ptr_i32 %{{.*}}#0 -> %[[IP1_PVT:.*]], @_QFEip2_private_box_ptr_i32 %{{.*}}#0 -> %[[IP2_PVT:.*]] : !fir.ref>>, !fir.ref>>) !CHECK: omp.loop_nest (%[[IP1_INDX:.*]], %[[IP2_INDX:.*]]) : i64 = ({{.*}}) to ({{.*}}) inclusive step ({{.*}}) !CHECK: %[[IP1_PVT_DECL:.*]]:2 = hlfir.declare %[[IP1_PVT]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QFEip1"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) @@ -29,12 +28,13 @@ program loop_var end do !$omp end do -!CHECK: omp.simd +!CHECK: omp.simd private(@_QFEia1_private_box_heap_i32 %{{.*}}#0 -> %[[IA1_PVT:.*]] : !fir.ref>>) !CHECK: omp.loop_nest (%[[IA1_INDX:.*]]) : i64 = ({{.*}}) to ({{.*}}) inclusive step ({{.*}}) -!CHECK: %[[IA1_INDX_I32:.*]] = fir.convert %[[IA1_INDX]] : (i64) -> i32 -!CHECK: %[[IA1_BOX:.*]] = fir.load %[[IA1]]#0 : !fir.ref>> +!CHECK: %[[IA1_PVT_DECL:.*]]:2 = hlfir.declare %[[IA1_PVT]] {fortran_attrs = #fir.var_attrs, uniq_name = "_QFEia1"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) +!CHECK: %[[IA1:.*]] = fir.convert %[[IA1_INDX]] : (i64) -> i32 +!CHECK: %[[IA1_BOX:.*]] = fir.load %[[IA1_PVT_DECL]]#0 : !fir.ref>> !CHECK: %[[IA1_ADDR:.*]] = fir.box_addr %[[IA1_BOX]] : (!fir.box>) -> !fir.heap -!CHECK: hlfir.assign %[[IA1_INDX_I32]] to %[[IA1_ADDR]] : i32, !fir.heap +!CHECK: hlfir.assign %[[IA1]] to %[[IA1_ADDR]] : i32, !fir.heap !CHECK: omp.yield !$omp simd do ia1 = 1, 10 diff --git a/flang/test/Lower/OpenMP/ordered-simd.f90 b/flang/test/Lower/OpenMP/ordered-simd.f90 index 5947c782414c..849900993319 100644 --- a/flang/test/Lower/OpenMP/ordered-simd.f90 +++ b/flang/test/Lower/OpenMP/ordered-simd.f90 @@ -7,7 +7,7 @@ subroutine ordered_simd(n) integer :: n, a(n), b(n), c(n), i ! CHECK-LABEL: func @_QPordered_simd -! CHECK: omp.simd linear({{.*}}) { +! CHECK: omp.simd linear({{.*}}) private({{.*}}) { ! CHECK: omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) inclusive step (%{{.*}}) { ! CHECK: omp.ordered.region par_level_simd { ! CHECK: omp.terminator @@ -34,7 +34,7 @@ subroutine ws_ordered_simd(n) ! CHECK-LABEL: func @_QPws_ordered_simd ! CHECK: omp.wsloop ordered(0) { -! CHECK: omp.simd linear({{.*}}) { +! CHECK: omp.simd linear({{.*}}) private({{.*}}) { ! CHECK: omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) inclusive step (%{{.*}}) { ! CHECK: omp.ordered.region par_level_simd { ! CHECK: omp.terminator diff --git a/flang/test/Lower/OpenMP/wsloop-simd.f90 b/flang/test/Lower/OpenMP/wsloop-simd.f90 index 541ec86c1b7e..03e35de04cac 100644 --- a/flang/test/Lower/OpenMP/wsloop-simd.f90 +++ b/flang/test/Lower/OpenMP/wsloop-simd.f90 @@ -70,15 +70,15 @@ end subroutine do_simd_reduction ! CHECK-LABEL: func.func @_QPdo_simd_private( subroutine do_simd_private() integer, allocatable :: tmp - ! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFdo_simd_privateEi"} ! CHECK: omp.wsloop ! CHECK-NEXT: omp.simd - ! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]] : !fir.ref>>) + ! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]], @[[PRIV_IVAR_SYM:.*]] %{{.*}} -> %[[PRIV_IVAR:.*]] : !fir.ref>>, !fir.ref) ! CHECK-NEXT: omp.loop_nest (%[[IVAR:.*]]) : i32 !$omp do simd private(tmp) do i=1, 10 ! CHECK: %[[PRIV_BOX_DECL:.*]]:2 = hlfir.declare %[[PRIV_BOX]] - ! CHECK: hlfir.assign %[[IVAR]] to %[[I_DECL]]#0 + ! CHECK: %[[PRIV_IVAR_DECL:.*]]:2 = hlfir.declare %[[PRIV_IVAR]] + ! CHECK: hlfir.assign %[[IVAR]] to %[[PRIV_IVAR_DECL]]#0 ! CHECK: %[[PRIV_BOX_LOAD:.*]] = fir.load %[[PRIV_BOX_DECL]] ! CHECK: hlfir.assign %{{.*}} to %[[PRIV_BOX_DECL]]#0 ! CHECK: omp.yield @@ -92,12 +92,12 @@ subroutine do_simd_lastprivate_firstprivate() ! CHECK: omp.wsloop ! CHECK-SAME: private(@[[FIRSTPRIVATE_A_SYM:.*]] %{{.*}} -> %[[FIRSTPRIVATE_A:.*]] : !fir.ref) ! CHECK-NEXT: omp.simd - ! CHECK-SAME: linear({{.*}}#0 : !fir.ref = %{{[^:]*}} : i32) - ! CHECK-SAME: private(@[[PRIVATE_A_SYM:.*]] %{{.*}} -> %[[PRIVATE_A:.*]] : !fir.ref) + ! CHECK-SAME: private(@[[PRIVATE_A_SYM:.*]] %{{.*}} -> %[[PRIVATE_A:.*]], @[[PRIVATE_I_SYM:.*]] %{{.*}} -> %[[PRIVATE_I:.*]] : !fir.ref, !fir.ref) !$omp do simd lastprivate(a) firstprivate(a) do i = 1, 10 ! CHECK: %[[FIRSTPRIVATE_A_DECL:.*]]:2 = hlfir.declare %[[FIRSTPRIVATE_A]] ! CHECK: %[[PRIVATE_A_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_A]] + ! CHECK: %[[PRIVATE_I_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_I]] a = a + 1 end do !$omp end do simd diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp index 97d119daed9a..74db1d8090a8 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -277,41 +277,17 @@ public: } } - // Rewrite all uses of the original variable, in the basic blocks whose names - // start with `prefix`, with the linear variable in-place. - void rewriteInPlace(llvm::IRBuilderBase &builder, llvm::BasicBlock *startBB, - llvm::BasicBlock *endBB, llvm::StringRef prefix, + // Rewrite all uses of the original variable in `BBName` + // with the linear variable in-place + void rewriteInPlace(llvm::IRBuilderBase &builder, const std::string &BBName, size_t varIndex) { - llvm::SmallVector worklist; - llvm::SmallPtrSet visited; - llvm::SmallPtrSet matchingBBs; - - assert(startBB && endBB && "Invalid startBB/endBB"); - - // Traverse basic blocks from startBB to endBB and save those - // whose names start with the specified prefix. - worklist.push_back(startBB); - visited.insert(startBB); - - while (!worklist.empty()) { - llvm::BasicBlock *bb = worklist.pop_back_val(); - - if (bb->hasName() && bb->getName().starts_with(prefix)) - matchingBBs.insert(bb); - - if (bb == endBB) - continue; - - for (llvm::BasicBlock *succ : llvm::successors(bb)) { - if (visited.insert(succ).second) - worklist.push_back(succ); - } - } - - // Rewrite all uses in the matching BBs. - for (auto *user : linearOrigVal[varIndex]->users()) { + llvm::SmallVector users; + for (llvm::User *user : linearOrigVal[varIndex]->users()) + users.push_back(user); + for (auto *user : users) { if (auto *userInst = dyn_cast(user)) { - if (matchingBBs.contains(userInst->getParent())) + if (userInst->getParent()->getName().str().find(BBName) != + std::string::npos) user->replaceUsesOfWith(linearOrigVal[varIndex], linearLoopBodyTemps[varIndex]); } @@ -3421,7 +3397,6 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder, linearClauseProcessor.initLinearStep(moduleTranslation, linearStep); } - llvm::BasicBlock *sourceBlock = builder.GetInsertBlock(); llvm::Expected regionBlock = convertOmpOpRegions( wsloopOp.getRegion(), "omp.wsloop.region", builder, moduleTranslation); @@ -3489,10 +3464,8 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder, if (failed(handleError(afterBarrierIP, *loopOp))) return failure(); for (size_t index = 0; index < wsloopOp.getLinearVars().size(); index++) - linearClauseProcessor.rewriteInPlace( - builder, sourceBlock->getSingleSuccessor(), *regionBlock, - "omp.loop_nest.region", index); - + linearClauseProcessor.rewriteInPlace(builder, "omp.loop_nest.region", + index); builder.restoreIP(oldIP); } @@ -3863,18 +3836,15 @@ convertOmpSimd(Operation &opInst, llvm::IRBuilderBase &builder, }); for (size_t index = 0; index < simdOp.getLinearVars().size(); index++) { - llvm::BasicBlock *startBB = sourceBlock->getSingleSuccessor(); - llvm::BasicBlock *endBB = *regionBlock; - linearClauseProcessor.rewriteInPlace(builder, startBB, endBB, - "omp.loop_nest.region", index); - + linearClauseProcessor.rewriteInPlace(builder, "omp.loop_nest.region", + index); if (hasOrderedRegions) { // Also rewrite uses in ordered regions so they read the current value - linearClauseProcessor.rewriteInPlace(builder, startBB, endBB, - "omp.ordered.region", index); + linearClauseProcessor.rewriteInPlace(builder, "omp.ordered.region", + index); // Also rewrite uses in finalize blocks (code after ordered regions) - linearClauseProcessor.rewriteInPlace(builder, startBB, endBB, - "omp_region.finalize", index); + linearClauseProcessor.rewriteInPlace(builder, "omp_region.finalize", + index); } } diff --git a/mlir/test/Target/LLVMIR/openmp-simd-linear.mlir b/mlir/test/Target/LLVMIR/openmp-simd-linear.mlir deleted file mode 100644 index 1722d1437ad7..000000000000 --- a/mlir/test/Target/LLVMIR/openmp-simd-linear.mlir +++ /dev/null @@ -1,34 +0,0 @@ -// Ensure that omp.simd with the linear clause is translated correctly even -// when otehr loop nests exist in the same function. -// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s - -omp.private {type = private} @test_simd_linear_private_i32 : i32 -llvm.func @test_simd_linear() { - %0 = llvm.mlir.constant(1 : i64) : i64 - %1 = llvm.mlir.constant(1 : i32) : i32 - %2 = llvm.mlir.constant(2 : i32) : i32 - %3 = llvm.mlir.constant(10 : i32) : i32 - %4 = llvm.alloca %0 x i32 {bindc_name = "j"} : (i64) -> !llvm.ptr - %5 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr - omp.parallel { - omp.wsloop private(@test_simd_linear_private_i32 %5 -> %arg0 : !llvm.ptr) { - omp.loop_nest (%arg1) : i32 = (%1) to (%3) inclusive step (%1) { - llvm.store %arg1, %arg0 : i32, !llvm.ptr - llvm.store %2, %4 : i32, !llvm.ptr - omp.simd linear(%4 : !llvm.ptr = %1 : i32) { - omp.loop_nest (%arg2) : i32 = (%1) to (%3) inclusive step (%1) { - llvm.store %arg2, %4 : i32, !llvm.ptr - omp.yield - } - } {linear_var_types = [i32]} - omp.yield - } - } - omp.terminator - } - llvm.return -} - -// CHECK-LABEL: void @test_simd_linear() -// CHECK-NOT: %.linear_result -// CHECK: %.linear_result = alloca i32