Skip to content

Commit 1689860

Browse files
Fix lastprivate update of IVs
1 parent 4cc6e3b commit 1689860

File tree

7 files changed

+62
-23
lines changed

7 files changed

+62
-23
lines changed

flang/lib/Lower/OpenMP/DataSharingProcessor.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,10 @@ void DataSharingProcessor::insertLastPrivateCompare(mlir::Operation *op) {
308308
firOpBuilder.setInsertionPointToStart(&ifOp.getThenRegion().front());
309309
for (auto [v, loopIV] : llvm::zip_equal(vs, loopIVs)) {
310310
assert(loopIV && "loopIV was not set");
311-
firOpBuilder.createStoreWithConvert(loc, v, loopIV);
311+
hlfir::Entity loopIVEntity{loopIV};
312+
loopIVEntity =
313+
hlfir::derefPointersAndAllocatables(loc, firOpBuilder, loopIVEntity);
314+
firOpBuilder.create<hlfir::AssignOp>(loc, v, loopIVEntity);
312315
}
313316
lastPrivIP = firOpBuilder.saveInsertionPoint();
314317
} else if (mlir::isa<mlir::omp::SectionsOp>(op)) {

flang/test/Lower/OpenMP/lastprivate-allocatable.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
! if this is the last iteration
1818
! CHECK: fir.if %{{.*}} {
1919
! store loop IV
20-
! CHECK: fir.store %{{.*}} to %[[VAL_18]]#1 : !fir.ref<i32>
20+
! CHECK: hlfir.assign %{{.*}} to %[[VAL_18]]#1 : i32, !fir.ref<i32>
2121
! assign private variable to original copy: realloc
2222
! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_16]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
2323
! CHECK: %[[VAL_24:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>

flang/test/Lower/OpenMP/lastprivate-commonblock.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
!CHECK: %[[V_GT:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
2323
!CHECK: %[[LAST_ITER:.*]] = arith.select %[[NEG_STEP]], %[[V_LT]], %[[V_GT]] : i1
2424
!CHECK: fir.if %[[LAST_ITER]] {
25-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
25+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
2626
!CHECK: %[[PRIVATE_X_VAL:.*]] = fir.load %[[PRIVATE_X_DECL]]#0 : !fir.ref<f32>
2727
!CHECK: hlfir.assign %[[PRIVATE_X_VAL]] to %[[X_DECL]]#0 : f32, !fir.ref<f32>
2828
!CHECK: %[[PRIVATE_Y_VAL:.*]] = fir.load %[[PRIVATE_Y_DECL]]#0 : !fir.ref<f32>

flang/test/Lower/OpenMP/lastprivate-iv.f90

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
! Test LASTPRIVATE with iteration variable.
22
! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
3+
! RUN: %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck --check-prefix=CHECK-FIR %s
34

45
!CHECK-LABEL: func @_QPlastprivate_iv_inc
56

@@ -20,7 +21,7 @@
2021
!CHECK: %[[V_GT:.*]] = arith.cmpi sgt, %[[V]], %[[UB]] : i32
2122
!CHECK: %[[CMP:.*]] = arith.select %[[STEP_NEG]], %[[V_LT]], %[[V_GT]] : i1
2223
!CHECK: fir.if %[[CMP]] {
23-
!CHECK: fir.store %[[V]] to %[[I]]#1 : !fir.ref<i32>
24+
!CHECK: hlfir.assign %[[V]] to %[[I]]#1 : i32, !fir.ref<i32>
2425
!CHECK: %[[I_VAL:.*]] = fir.load %[[I]]#0 : !fir.ref<i32>
2526
!CHECK: hlfir.assign %[[I_VAL]] to %[[I2]]#0 : i32, !fir.ref<i32>
2627
!CHECK: }
@@ -54,7 +55,7 @@ subroutine lastprivate_iv_inc()
5455
!CHECK: %[[V_GT:.*]] = arith.cmpi sgt, %[[V]], %[[UB]] : i32
5556
!CHECK: %[[CMP:.*]] = arith.select %[[STEP_NEG]], %[[V_LT]], %[[V_GT]] : i1
5657
!CHECK: fir.if %[[CMP]] {
57-
!CHECK: fir.store %[[V]] to %[[I]]#1 : !fir.ref<i32>
58+
!CHECK: hlfir.assign %[[V]] to %[[I]]#1 : i32, !fir.ref<i32>
5859
!CHECK: %[[I_VAL:.*]] = fir.load %[[I]]#0 : !fir.ref<i32>
5960
!CHECK: hlfir.assign %[[I_VAL]] to %[[I2]]#0 : i32, !fir.ref<i32>
6061
!CHECK: }
@@ -78,13 +79,48 @@ subroutine lastprivate_iv_i1
7879
!CHECK: omp.wsloop private({{.*}})
7980
!CHECK: omp.loop_nest
8081
!CHECK: fir.if %{{.*}} {
81-
!CHECK: %[[I8_VAL:.*]] = fir.convert %{{.*}} : (i32) -> i8
82-
!CHECK: fir.store %[[I8_VAL]] to %[[IV:.*]]#1 : !fir.ref<i8>
82+
!CHECK: hlfir.assign %{{.*}} to %[[IV:.*]]#1 : i32, !fir.ref<i8>
8383
!CHECK: %[[IV_VAL:.*]] = fir.load %[[IV]]#0 : !fir.ref<i8>
8484
!CHECK: hlfir.assign %[[IV_VAL]] to %{{.*}}#0 : i8, !fir.ref<i8>
8585
!CHECK: }
86+
87+
8688
!$omp do lastprivate(i1)
8789
do i1=1,8
8890
enddo
8991
!$omp end do
9092
end subroutine
93+
94+
!CHECK: omp.wsloop private(@_QFlastprivate_iv_pointerEi_private_box_ptr_i32 %{{.*}}#0 -> %[[PRIVATE_IV:.*]] : !fir.ref<!fir.box<!fir.ptr<i32>>>) {
95+
!CHECK: omp.loop_nest (%[[LOOP_INDEX:.*]]) : i64
96+
!CHECK: %[[PRIVATE_IV_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFlastprivate_iv_pointerEi"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
97+
!CHECK: %[[LOOP_INDEX_INCR:.*]] = arith.addi %[[LOOP_INDEX]], %{{.*}} : i64
98+
!CHECK: fir.if %{{.*}} {
99+
!CHECK: %[[PRIVATE_IV_BOX:.*]] = fir.load %[[PRIVATE_IV_DECL]]#1 : !fir.ref<!fir.box<!fir.ptr<i32>>>
100+
!CHECK: %[[PRIVATE_IV_ADDR:.*]] = fir.box_addr %[[PRIVATE_IV_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
101+
!CHECK: hlfir.assign %[[LOOP_INDEX_INCR]] to %[[PRIVATE_IV_ADDR]] : i64, !fir.ptr<i32>
102+
!CHECK: }
103+
!CHECK: omp.yield
104+
!CHECK: }
105+
!CHECK: }
106+
107+
!CHECK-FIR: omp.wsloop private(@_QFlastprivate_iv_pointerEi_private_box_ptr_i32 %{{.*}} -> %[[PRIVATE_IV:.*]] : !fir.ref<!fir.box<!fir.ptr<i32>>>) {
108+
!CHECK-FIR: omp.loop_nest (%[[LOOP_INDEX:.*]]) : i64
109+
!CHECK-FIR: %[[PRIVATE_IV_DECL:.*]] = fir.declare %[[PRIVATE_IV]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFlastprivate_iv_pointerEi"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
110+
!CHECK-FIR: %[[LOOP_INDEX_INCR:.*]] = arith.addi %[[LOOP_INDEX]], %{{.*}} : i64
111+
!CHECK-FIR: fir.if %{{.*}} {
112+
!CHECK-FIR: %[[PRIVATE_IV_BOX:.*]] = fir.load %[[PRIVATE_IV_DECL]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
113+
!CHECK-FIR: %[[PRIVATE_IV_ADDR:.*]] = fir.box_addr %[[PRIVATE_IV_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
114+
!CHECK-FIR: %[[LOOP_INDEX_CVT:.*]] = fir.convert %[[LOOP_INDEX_INCR]] : (i64) -> i32
115+
!CHECK-FIR: fir.store %[[LOOP_INDEX_CVT]] to %[[PRIVATE_IV_ADDR]] : !fir.ptr<i32>
116+
!CHECK-FIR: }
117+
!CHECK-FIR: omp.yield
118+
!CHECK-FIR: }
119+
subroutine lastprivate_iv_pointer()
120+
integer, pointer :: i
121+
122+
!$omp do lastprivate(i)
123+
do i = 1, 20
124+
end do
125+
!$omp end do
126+
end subroutine

flang/test/Lower/OpenMP/lastprivate-simd.f90

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ subroutine simd_ivs
3939
! CHECK: %[[IDO3_PRIV_DECL:.*]]:2 = hlfir.declare %[[IDO3_PRIV_ARG]] {uniq_name = "{{.*}}Eido3"}
4040

4141
! CHECK: fir.if %33 {
42-
! CHECK: fir.store %{{.*}} to %[[IDO1_PRIV_DECL]]#1
43-
! CHECK: fir.store %{{.*}} to %[[IDO2_PRIV_DECL]]#1
44-
! CHECK: fir.store %{{.*}} to %[[IDO3_PRIV_DECL]]#1
42+
! CHECK: hlfir.assign %{{.*}} to %[[IDO1_PRIV_DECL]]#1
43+
! CHECK: hlfir.assign %{{.*}} to %[[IDO2_PRIV_DECL]]#1
44+
! CHECK: hlfir.assign %{{.*}} to %[[IDO3_PRIV_DECL]]#1
4545
! CHECK: %[[IDO1_VAL:.*]] = fir.load %[[IDO1_PRIV_DECL]]#0
4646
! CHECK: hlfir.assign %[[IDO1_VAL]] to %[[IDO1_HOST_DECL]]#0
4747
! CHECK: %[[IDO2_VAL:.*]] = fir.load %[[IDO2_PRIV_DECL]]#0

flang/test/Lower/OpenMP/parallel-lastprivate-clause-scalar.f90

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
3535
!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1
3636
!CHECK: fir.if %[[IV_CMP]] {
37-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
37+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
3838

3939
! Testing lastprivate val update
4040
!CHECK: hlfir.assign %[[ARG1_PVT_DECL]]#0 to %[[ARG1_DECL]]#0 : !fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>
@@ -70,7 +70,7 @@ subroutine lastprivate_character(arg1)
7070
!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
7171
!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1
7272
!CHECK: fir.if %[[IV_CMP]] {
73-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
73+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
7474

7575
! Testing lastprivate val update
7676
!CHECK-NEXT: %[[CLONE_LD:.*]] = fir.load %[[CLONE_DECL]]#0 : !fir.ref<i32>
@@ -110,7 +110,7 @@ subroutine lastprivate_int(arg1)
110110
!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
111111
!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1
112112
!CHECK: fir.if %[[IV_CMP]] {
113-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
113+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
114114
! Testing lastprivate val update
115115
!CHECK-DAG: %[[CLONE_LD1:.*]] = fir.load %[[CLONE1_DECL]]#0 : !fir.ref<i32>
116116
!CHECK-DAG: hlfir.assign %[[CLONE_LD1]] to %[[ARG1_DECL]]#0 : i32, !fir.ref<i32>
@@ -152,7 +152,7 @@ subroutine mult_lastprivate_int(arg1, arg2)
152152
!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
153153
!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1
154154
!CHECK: fir.if %[[IV_CMP]] {
155-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
155+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
156156
!Testing lastprivate val update
157157
!CHECK-DAG: %[[CLONE_LD2:.*]] = fir.load %[[CLONE2_DECL]]#0 : !fir.ref<i32>
158158
!CHECK-DAG: hlfir.assign %[[CLONE_LD2]] to %[[ARG2_DECL]]#0 : i32, !fir.ref<i32>
@@ -196,7 +196,7 @@ subroutine mult_lastprivate_int2(arg1, arg2)
196196
!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
197197
!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1
198198
!CHECK: fir.if %[[IV_CMP]] {
199-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
199+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
200200
! Testing lastprivate val update
201201
!CHECK-NEXT: %[[CLONE_LD:.*]] = fir.load %[[CLONE2_DECL]]#0 : !fir.ref<i32>
202202
!CHECK-NEXT: hlfir.assign %[[CLONE_LD]] to %[[ARG2_DECL]]#0 : i32, !fir.ref<i32>
@@ -240,7 +240,7 @@ subroutine firstpriv_lastpriv_int(arg1, arg2)
240240
!CHECK: %[[T3:.*]] = arith.cmpi sgt, %[[V]], %{{.*}} : i32
241241
!CHECK: %[[IV_CMP:.*]] = arith.select %[[T1]], %[[T2]], %[[T3]] : i1
242242
!CHECK: fir.if %[[IV_CMP]] {
243-
!CHECK: fir.store %[[V]] to %{{.*}} : !fir.ref<i32>
243+
!CHECK: hlfir.assign %[[V]] to %{{.*}} : i32, !fir.ref<i32>
244244
! Testing lastprivate val update
245245
!CHECK-NEXT: %[[CLONE_LD:.*]] = fir.load %[[CLONE1_DECL]]#0 : !fir.ref<i32>
246246
!CHECK-NEXT: hlfir.assign %[[CLONE_LD]] to %[[ARG1_DECL]]#0 : i32, !fir.ref<i32>

flang/test/Lower/OpenMP/parallel-wsloop-lastpriv.f90

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ subroutine omp_do_lastprivate(a)
3030
! CHECK: %[[GT_UB:.*]] = arith.cmpi sgt, %[[NEXT_ARG1]], %[[UB]] : i32
3131
! CHECK: %[[SEL:.*]] = arith.select %[[STEP_DIR]], %[[LT_UB]], %[[GT_UB]] : i1
3232
! CHECK: fir.if %[[SEL]] {
33-
! CHECK: fir.store %[[NEXT_ARG1]] to %[[I_PVT_DECL]]#1 : !fir.ref<i32>
33+
! CHECK: hlfir.assign %[[NEXT_ARG1]] to %[[I_PVT_DECL]]#1 : i32, !fir.ref<i32>
3434
! CHECK: %[[A_PVT_LOAD:.*]] = fir.load %[[A_PVT_DECL]]#0 : !fir.ref<i32>
3535
! CHECK: hlfir.assign %[[A_PVT_LOAD]] to %[[ARG0_DECL]]#0 : i32, !fir.ref<i32>
3636
! CHECK: }
@@ -74,7 +74,7 @@ subroutine omp_do_lastprivate2(a, n)
7474
! CHECK: %[[GT_UB:.*]] = arith.cmpi sgt, %[[NEXT_ARG2]], %[[UB]] : i32
7575
! CHECK: %[[SEL:.*]] = arith.select %[[STEP_DIR]], %[[LT_UB]], %[[GT_UB]] : i1
7676
! CHECK: fir.if %[[SEL]] {
77-
! CHECK: fir.store %[[NEXT_ARG2]] to %[[I_PVT_DECL]]#1 : !fir.ref<i32>
77+
! CHECK: hlfir.assign %[[NEXT_ARG2]] to %[[I_PVT_DECL]]#1 : i32, !fir.ref<i32>
7878
! CHECK: %[[A_PVT_LOAD:.*]] = fir.load %[[A_PVT_DECL]]#0 : !fir.ref<i32>
7979
! CHECK: hlfir.assign %[[A_PVT_LOAD]] to %[[ARG0_DECL]]#0 : i32, !fir.ref<i32>
8080
! CHECK: %[[N_PVT_LOAD:.*]] = fir.load %[[N_PVT_DECL]]#0 : !fir.ref<i32>
@@ -126,8 +126,8 @@ subroutine omp_do_lastprivate_collapse2(a)
126126
! CHECK: %[[SEL2:.*]] = arith.select %[[STEP2_END]], %[[LT_UB2]], %[[GT_UB2]] : i1
127127
! CHECK: %[[AND:.*]] = arith.andi %[[SEL1]], %[[SEL2]] : i1
128128
! CHECK: fir.if %[[AND]] {
129-
! CHECK: fir.store %[[NEXT_ARG1]] to %[[I_PVT_DECL]]#1 : !fir.ref<i32>
130-
! CHECK: fir.store %[[NEXT_ARG2]] to %[[J_PVT_DECL]]#1 : !fir.ref<i32>
129+
! CHECK: hlfir.assign %[[NEXT_ARG1]] to %[[I_PVT_DECL]]#1 : i32, !fir.ref<i32>
130+
! CHECK: hlfir.assign %[[NEXT_ARG2]] to %[[J_PVT_DECL]]#1 : i32, !fir.ref<i32>
131131
! CHECK: %[[A_PVT_LOAD:.*]] = fir.load %[[A_PVT_DECL]]#0 : !fir.ref<i32>
132132
! CHECK: hlfir.assign %[[A_PVT_LOAD]] to %[[ARG0_DECL]]#0 : i32, !fir.ref<i32>
133133
! CHECK: }
@@ -194,9 +194,9 @@ subroutine omp_do_lastprivate_collapse3(a)
194194
! CHECK: %[[SEL3:.*]] = arith.select %[[STEP3_END]], %[[LT_UB3]], %[[GT_UB3]] : i1
195195
! CHECK: %[[AND2:.*]] = arith.andi %[[AND1]], %[[SEL3]] : i1
196196
! CHECK: fir.if %[[AND2]] {
197-
! CHECK: fir.store %[[NEXT_ARG1]] to %[[I_PVT_DECL]]#1 : !fir.ref<i32>
198-
! CHECK: fir.store %[[NEXT_ARG2]] to %[[J_PVT_DECL]]#1 : !fir.ref<i32>
199-
! CHECK: fir.store %[[NEXT_ARG3]] to %[[K_PVT_DECL]]#1 : !fir.ref<i32>
197+
! CHECK: hlfir.assign %[[NEXT_ARG1]] to %[[I_PVT_DECL]]#1 : i32, !fir.ref<i32>
198+
! CHECK: hlfir.assign %[[NEXT_ARG2]] to %[[J_PVT_DECL]]#1 : i32, !fir.ref<i32>
199+
! CHECK: hlfir.assign %[[NEXT_ARG3]] to %[[K_PVT_DECL]]#1 : i32, !fir.ref<i32>
200200
! CHECK: %[[A_PVT_LOAD:.*]] = fir.load %[[A_PVT_DECL]]#0 : !fir.ref<i32>
201201
! CHECK: hlfir.assign %[[A_PVT_LOAD]] to %[[ARG0_DECL]]#0 : i32, !fir.ref<i32>
202202
! CHECK: }

0 commit comments

Comments
 (0)