Reverts llvm/llvm-project#188851
This commit is contained in:
parent
29c083a61f
commit
d59356aac5
@ -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())) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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<i32> = %[[CONST]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) {
|
||||
!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref<i32> = %[[CONST]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) private(@_QFdo_simdEi_private_i32 {{.*}} -> %arg0 : !fir.ref<i32>) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) private(@_QFdo_simdEi_private_i32 {{.*}} -> %arg0 : !fir.ref<i32>) {
|
||||
!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<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
|
||||
!CHECK: omp.teams {
|
||||
!CHECK: omp.distribute {
|
||||
!CHECK: omp.distribute private(@_QFdistribute_simdEi_private_i32 {{.*}} -> %[[ARG0:.*]] : !fir.ref<i32>) {
|
||||
!DEFAULT: omp.simd linear({{.*}}) {
|
||||
!OPENMP52: omp.simd linear(val({{.*}})) {
|
||||
!OPENMP52: omp.simd linear(val({{.*}})) private(@_QFdistribute_simdEi_private_i32 %[[ARG0]] -> {{.*}} : !fir.ref<i32>) {
|
||||
!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<i32> = %[[CONST]] : i32) {
|
||||
!OPENMP52: omp.simd linear(val(%[[I]]#0 : !fir.ref<i32> = %[[CONST]] : i32)) {
|
||||
!DEFAULT: omp.simd linear(%[[I]]#0 : !fir.ref<i32> = %[[CONST]] : i32) private(@_QFdistribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
!OPENMP52: omp.simd linear(val(%[[I]]#0 : !fir.ref<i32> = %[[CONST]] : i32)) private(@_QFdistribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
!$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<i32> = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) {
|
||||
!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref<i32> = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) private(@_QFparallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) private(@_QFparallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
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<i32> = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) {
|
||||
!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref<i32> = %[[LINEAR_STEP]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) private(@_QFteams_distributeEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[LINEAR_STEP]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) private(@_QFteams_distributeEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
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<i32> = %c1_i32 : i32, %[[I]]#0 : !fir.ref<i32> = %c1_i32_1 : i32) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %c1_i32 : i32), val(%[[I]]#0 : !fir.ref<i32> = %c1_i32_1 : i32)) {
|
||||
!DEFAULT: omp.simd linear(%[[X]]#0 : !fir.ref<i32> = %c1_i32 : i32, %[[I]]#0 : !fir.ref<i32> = %c1_i32_1 : i32) private(@_QFteams_distribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %c1_i32 : i32), val(%[[I]]#0 : !fir.ref<i32> = %c1_i32_1 : i32)) private(@_QFteams_distribute_parallel_doEi_private_i32 %[[I]]#0 -> %arg0 : !fir.ref<i32>) {
|
||||
integer :: x
|
||||
!$omp teams distribute parallel do simd linear(x)
|
||||
do i = 1, N
|
||||
|
||||
@ -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<i64>) {
|
||||
! OPENMP52-NEXT: omp.simd linear(val(%{{.*}})) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^:]+]]
|
||||
! OPENMP52-SAME: : !fir.ref<i64>) {
|
||||
! DEFAULT-NEXT: omp.simd linear(%{{.*}}) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^,]+]],
|
||||
! DEFAULT-SAME: @{{.*}} %[[INDEX]]#0 -> %[[INDEX_ARG:.*]] : !fir.ref<i64>, !fir.ref<i32>) {
|
||||
! OPENMP52-NEXT: omp.simd linear(val(%{{.*}})) private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^,]+]],
|
||||
! OPENMP52-SAME: @{{.*}} %[[INDEX]]#0 -> %[[INDEX_ARG:.*]] : !fir.ref<i64>, !fir.ref<i32>) {
|
||||
! 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
|
||||
|
||||
@ -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<!fir.box<!fir.heap<i32>>>)
|
||||
! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]], @[[PRIV_IVAR_SYM:.*]] %{{.*}} -> %[[PRIV_IVAR:.*]] : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<i32>)
|
||||
! 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
|
||||
|
||||
@ -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<i32> = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) {
|
||||
!OPENMP45: omp.simd linear(%[[X]]#0 : !fir.ref<i32> = %[[CONST]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) {
|
||||
!OPENMP52: omp.simd linear(val(%[[X]]#0 : !fir.ref<i32> = %[[CONST]] : i32), val(%[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32)) private({{.*}}) {
|
||||
!OPENMP45: omp.simd linear(%[[X]]#0 : !fir.ref<i32> = %[[CONST]] : i32, %[[I]]#0 : !fir.ref<i32> = %[[IV_STEP]] : i32) private({{.*}}) {
|
||||
integer :: x
|
||||
!$omp do simd linear(x:1)
|
||||
do i = 1, 10
|
||||
|
||||
@ -8,7 +8,6 @@ program loop_var
|
||||
integer, pointer :: ip1, ip2
|
||||
integer, allocatable :: ia1
|
||||
|
||||
!CHECK: %[[IA1:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<allocatable>, 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.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
|
||||
!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<pointer>, uniq_name = "_QFEip1"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
|
||||
@ -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<!fir.box<!fir.heap<i32>>>)
|
||||
!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<!fir.box<!fir.heap<i32>>>
|
||||
!CHECK: %[[IA1_PVT_DECL:.*]]:2 = hlfir.declare %[[IA1_PVT]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFEia1"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
|
||||
!CHECK: %[[IA1:.*]] = fir.convert %[[IA1_INDX]] : (i64) -> i32
|
||||
!CHECK: %[[IA1_BOX:.*]] = fir.load %[[IA1_PVT_DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
|
||||
!CHECK: %[[IA1_ADDR:.*]] = fir.box_addr %[[IA1_BOX]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
|
||||
!CHECK: hlfir.assign %[[IA1_INDX_I32]] to %[[IA1_ADDR]] : i32, !fir.heap<i32>
|
||||
!CHECK: hlfir.assign %[[IA1]] to %[[IA1_ADDR]] : i32, !fir.heap<i32>
|
||||
!CHECK: omp.yield
|
||||
!$omp simd
|
||||
do ia1 = 1, 10
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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<!fir.box<!fir.heap<i32>>>)
|
||||
! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]], @[[PRIV_IVAR_SYM:.*]] %{{.*}} -> %[[PRIV_IVAR:.*]] : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<i32>)
|
||||
! 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<i32>)
|
||||
! CHECK-NEXT: omp.simd
|
||||
! CHECK-SAME: linear({{.*}}#0 : !fir.ref<i32> = %{{[^:]*}} : i32)
|
||||
! CHECK-SAME: private(@[[PRIVATE_A_SYM:.*]] %{{.*}} -> %[[PRIVATE_A:.*]] : !fir.ref<i32>)
|
||||
! CHECK-SAME: private(@[[PRIVATE_A_SYM:.*]] %{{.*}} -> %[[PRIVATE_A:.*]], @[[PRIVATE_I_SYM:.*]] %{{.*}} -> %[[PRIVATE_I:.*]] : !fir.ref<i32>, !fir.ref<i32>)
|
||||
!$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
|
||||
|
||||
@ -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<llvm::BasicBlock *, 32> worklist;
|
||||
llvm::SmallPtrSet<llvm::BasicBlock *, 32> visited;
|
||||
llvm::SmallPtrSet<llvm::BasicBlock *, 32> 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<llvm::User *> users;
|
||||
for (llvm::User *user : linearOrigVal[varIndex]->users())
|
||||
users.push_back(user);
|
||||
for (auto *user : users) {
|
||||
if (auto *userInst = dyn_cast<llvm::Instruction>(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<llvm::BasicBlock *> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user