Skip to content

Commit 4be1b11

Browse files
[flang] Propagate volatile on reduction variables
Reference type was being constructed without propagating volatility. Fix and add a test. Sorry for another small patch, I missed this in my last one.
1 parent a3c7d46 commit 4be1b11

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

flang/lib/Lower/Support/PrivateReductionUtils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,15 @@ static void createCleanupRegion(Fortran::lower::AbstractConverter &converter,
5858
};
5959

6060
mlir::Type valTy = fir::unwrapRefType(argType);
61+
const bool argIsVolatile = fir::isa_volatile_type(argType);
6162
if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(valTy)) {
6263
// TODO: what about undoing init of unboxed derived types?
6364
if (auto recTy = mlir::dyn_cast<fir::RecordType>(
6465
fir::unwrapSequenceType(fir::dyn_cast_ptrOrBoxEleTy(boxTy)))) {
6566
mlir::Type eleTy = boxTy.getEleTy();
6667
if (mlir::isa<fir::PointerType, fir::HeapType>(eleTy)) {
6768
mlir::Type mutableBoxTy =
68-
fir::ReferenceType::get(fir::BoxType::get(eleTy));
69+
fir::ReferenceType::get(fir::BoxType::get(eleTy), argIsVolatile);
6970
mlir::Value converted =
7071
builder.createConvert(loc, mutableBoxTy, block->getArgument(0));
7172
if (recTy.getNumLenParams() > 0)

flang/test/Lower/volatile-openmp2.f03

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
! RUN: bbc -fopenmp --strict-fir-volatile-verifier %s -o - | FileCheck %s
2+
type x
3+
integer::x1=1
4+
end type x
5+
class(x),allocatable,volatile,asynchronous::v(:)
6+
!$omp parallel private(v)
7+
!$omp end parallel
8+
end
9+
10+
! CHECK-LABEL: func.func @_QQmain() {
11+
! CHECK: %[[VAL_0:.*]] = arith.constant 0 : index
12+
! CHECK: %[[VAL_1:.*]] = arith.constant 1 : index
13+
! CHECK: %[[VAL_2:.*]] = arith.constant 2 : index
14+
! CHECK: %[[VAL_3:.*]] = fir.dummy_scope : !fir.dscope
15+
! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QFE.n.x1) : !fir.ref<!fir.char<1,2>>
16+
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] typeparams %[[VAL_2]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFE.n.x1"} : (!fir.ref<!fir.char<1,2>>, index) -> (!fir.ref<!fir.char<1,2>>, !fir.ref<!fir.char<1,2>>)
17+
! CHECK: %[[VAL_6:.*]] = fir.address_of(@_QFE.di.x.x1) : !fir.ref<i32>
18+
! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFE.di.x.x1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
19+
! CHECK: %[[VAL_8:.*]] = fir.address_of(@_QFE.n.x) : !fir.ref<!fir.char<1>>
20+
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_8]] typeparams %[[VAL_1]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFE.n.x"} : (!fir.ref<!fir.char<1>>, index) -> (!fir.ref<!fir.char<1>>, !fir.ref<!fir.char<1>>)
21+
! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QFEv) : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>>>
22+
! CHECK: %[[VAL_11:.*]] = fir.volatile_cast %[[VAL_10]] : (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>>>) -> !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>
23+
! CHECK: %[[VAL_12:.*]]:2 = hlfir.declare %[[VAL_11]] {fortran_attrs = #fir.var_attrs<allocatable, asynchronous, volatile>, uniq_name = "_QFEv"} : (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>) -> (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>, !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>)
24+
! CHECK: %[[VAL_13:.*]] = fir.address_of(@_QFE.c.x) : !fir.ref<!fir.array<1x!fir.type<{{.*}}>>>
25+
! CHECK: %[[VAL_14:.*]] = fir.shape_shift %[[VAL_0]], %[[VAL_1]] : (index, index) -> !fir.shapeshift<1>
26+
! CHECK: %[[VAL_15:.*]]:2 = hlfir.declare %[[VAL_13]](%[[VAL_14]]) {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFE.c.x"} : (!fir.ref<!fir.array<1x!fir.type<{{.*}}>>>, !fir.shapeshift<1>) -> (!fir.box<!fir.array<1x!fir.type<{{.*}}>>>, !fir.ref<!fir.array<1x!fir.type<{{.*}}>>>)
27+
! CHECK: %[[VAL_16:.*]] = fir.address_of(@_QFE.dt.x) : !fir.ref<!fir.type<{{.*}}>>
28+
! CHECK: %[[VAL_17:.*]]:2 = hlfir.declare %[[VAL_16]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFE.dt.x"} : (!fir.ref<!fir.type<{{.*}}>>) -> (!fir.ref<!fir.type<{{.*}}>>, !fir.ref<!fir.type<{{.*}}>>)
29+
! CHECK: omp.parallel private(@_QFEv_private_class_heap_Uxrec__QFTx %[[VAL_12]]#0 -> %[[VAL_18:.*]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>) {
30+
! CHECK: %[[VAL_19:.*]]:2 = hlfir.declare %[[VAL_18]] {fortran_attrs = #fir.var_attrs<allocatable, asynchronous, volatile>, uniq_name = "_QFEv"} : (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>) -> (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>, !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<{{.*}}>>>, volatile>, volatile>)
31+
! CHECK: omp.terminator
32+
! CHECK: }
33+
! CHECK: return
34+
! CHECK: }

0 commit comments

Comments
 (0)