Skip to content

Commit dd0bfd1

Browse files
Handle conversions in funciton returns
1 parent fcf27ed commit dd0bfd1

File tree

2 files changed

+117
-18
lines changed

2 files changed

+117
-18
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1755,7 +1755,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
17551755
// tags all result variables with one of the largest types to allow
17561756
// them to share the same storage. Convert this to the actual type.
17571757
if (resultRef.getType() != resultRefType)
1758-
resultRef = builder->createConvert(loc, resultRefType, resultRef);
1758+
resultRef = builder->createConvertWithVolatileCast(
1759+
loc, resultRefType, resultRef);
17591760
return builder->create<fir::LoadOp>(loc, resultRef);
17601761
});
17611762
genExitRoutine(false, resultVal);

flang/test/Lower/volatile.f90

Lines changed: 115 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ program p
88
call not_declared_volatile_in_this_scope(i)
99
call not_declared_volatile_in_this_scope(arr)
1010
call declared_volatile_in_this_scope(arr,10)
11-
print*,arr,i
11+
print*,arr,i,a(),b(),c()
1212
contains
1313
elemental subroutine not_declared_volatile_in_this_scope(v)
1414
integer,intent(inout)::v
@@ -19,34 +19,132 @@ subroutine declared_volatile_in_this_scope(v,n)
1919
integer,volatile,intent(inout)::v(n)
2020
v=1
2121
end subroutine
22+
function a()
23+
integer,volatile::a
24+
a=1
25+
end function
26+
function b() result(r)
27+
integer,volatile::r
28+
r=2
29+
end function
30+
function c() result(r)
31+
volatile::r
32+
r=3
33+
end function
2234
end program
2335

24-
! CHECK-LABEL: _QQmain
25-
! CHECK: %[[VAL_10:.*]] = fir.volatile_cast %{{.+}} : (!fir.ref<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>, volatile>
26-
! CHECK: %[[VAL_11:.*]]:2 = hlfir.declare {{.+}} : (!fir.ref<!fir.array<10xi32>, volatile>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>, volatile>, !fir.ref<!fir.array<10xi32>, volatile>)
27-
! CHECK: %[[VAL_12:.*]] = fir.alloca i32
36+
! CHECK-LABEL: func.func @_QQmain
37+
! CHECK: %[[VAL_0:.*]] = arith.constant 0 : index
38+
! CHECK: %[[VAL_1:.*]] = arith.constant 11 : i32
39+
! CHECK: %[[VAL_2:.*]] = arith.constant 6 : i32
40+
! CHECK: %[[VAL_3:.*]] = arith.constant 10 : i32
41+
! CHECK: %[[VAL_4:.*]] = arith.constant 1 : index
42+
! CHECK: %[[VAL_5:.*]] = arith.constant 1 : i32
43+
! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i32
44+
! CHECK: %[[VAL_7:.*]] = arith.constant 10 : index
45+
! CHECK: %[[VAL_8:.*]] = fir.address_of(@_QFEarr) : !fir.ref<!fir.array<10xi32>>
46+
! CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1>
47+
! CHECK: %[[VAL_10:.*]] = fir.volatile_cast %[[VAL_8]] : (!fir.ref<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>, volatile>
48+
! CHECK: %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_10]](%[[VAL_9]]) {{.*}} : (!fir.ref<!fir.array<10xi32>, volatile>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>, volatile>, !fir.ref<!fir.array<10xi32>, volatile>)
49+
! CHECK: %[[VAL_12:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"}
2850
! CHECK: %[[VAL_13:.*]] = fir.volatile_cast %[[VAL_12]] : (!fir.ref<i32>) -> !fir.ref<i32, volatile>
29-
! CHECK: %[[VAL_14:.*]]:2 = hlfir.declare {{.+}} : (!fir.ref<i32, volatile>) -> (!fir.ref<i32, volatile>, !fir.ref<i32, volatile>)
30-
! CHECK: hlfir.assign %{{.+}} to %[[VAL_14]]#0 : i32, !fir.ref<i32, volatile>
31-
! CHECK: hlfir.assign %{{.+}} to %[[VAL_11]]#0 : i32, !fir.ref<!fir.array<10xi32>, volatile>
51+
! CHECK: %[[VAL_14:.*]]:2 = hlfir.declare %[[VAL_13]] {{.*}} : (!fir.ref<i32, volatile>) -> (!fir.ref<i32, volatile>, !fir.ref<i32, volatile>)
52+
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_14]]#0 : i32, !fir.ref<i32, volatile>
53+
! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_11]]#0 : i32, !fir.ref<!fir.array<10xi32>, volatile>
3254
! CHECK: %[[VAL_15:.*]] = fir.volatile_cast %[[VAL_14]]#0 : (!fir.ref<i32, volatile>) -> !fir.ref<i32>
3355
! CHECK: fir.call @_QFPnot_declared_volatile_in_this_scope(%[[VAL_15]]) proc_attrs<elemental, pure> fastmath<contract> : (!fir.ref<i32>) -> ()
34-
! CHECK: %[[VAL_19:.*]] = hlfir.designate %{{.+}} (%{{.+}}) : (!fir.ref<!fir.array<10xi32>, volatile>, index) -> !fir.ref<i32, volatile>
56+
! CHECK: cf.br ^bb1(%[[VAL_4]], %[[VAL_7]] : index, index)
57+
! CHECK: ^bb1(%[[VAL_16:.*]]: index, %[[VAL_17:.*]]: index):
58+
! CHECK: %[[VAL_18:.*]] = arith.cmpi sgt, %[[VAL_17]], %[[VAL_0]] : index
59+
! CHECK: cf.cond_br %[[VAL_18]], ^bb2, ^bb3
60+
! CHECK: ^bb2:
61+
! CHECK: %[[VAL_19:.*]] = hlfir.designate %[[VAL_11]]#0 (%[[VAL_16]]) : (!fir.ref<!fir.array<10xi32>, volatile>, index) -> !fir.ref<i32, volatile>
3562
! CHECK: %[[VAL_20:.*]] = fir.volatile_cast %[[VAL_19]] : (!fir.ref<i32, volatile>) -> !fir.ref<i32>
3663
! CHECK: fir.call @_QFPnot_declared_volatile_in_this_scope(%[[VAL_20]]) proc_attrs<elemental, pure> fastmath<contract> : (!fir.ref<i32>) -> ()
64+
! CHECK: %[[VAL_21:.*]] = arith.addi %[[VAL_16]], %[[VAL_4]] overflow<nsw> : index
65+
! CHECK: %[[VAL_22:.*]] = arith.subi %[[VAL_17]], %[[VAL_4]] : index
66+
! CHECK: cf.br ^bb1(%[[VAL_21]], %[[VAL_22]] : index, index)
67+
! CHECK: ^bb3:
3768
! CHECK: %[[VAL_23:.*]] = fir.volatile_cast %[[VAL_11]]#0 : (!fir.ref<!fir.array<10xi32>, volatile>) -> !fir.ref<!fir.array<10xi32>>
3869
! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (!fir.ref<!fir.array<10xi32>>) -> !fir.ref<!fir.array<?xi32>>
39-
! CHECK: %[[VAL_25:.*]]:3 = hlfir.associate %{{.+}} {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
70+
! CHECK: %[[VAL_25:.*]]:3 = hlfir.associate %[[VAL_3]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
4071
! CHECK: fir.call @_QFPdeclared_volatile_in_this_scope(%[[VAL_24]], %[[VAL_25]]#0) fastmath<contract> : (!fir.ref<!fir.array<?xi32>>, !fir.ref<i32>) -> ()
4172
! CHECK: hlfir.end_associate %[[VAL_25]]#1, %[[VAL_25]]#2 : !fir.ref<i32>, i1
42-
! CHECK: %[[VAL_26:.*]] = fir.address_of(
43-
! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_26]]
44-
! CHECK: %[[VAL_28:.*]] = fir.call @_FortranAioBeginExternalListOutput(
45-
! CHECK: %[[VAL_29:.*]] = fir.embox %{{.+}} : (!fir.ref<!fir.array<10xi32>, volatile>, !fir.shape<1>) -> !fir.box<!fir.array<10xi32>, volatile>
73+
! CHECK: %[[VAL_26:.*]] = fir.address_of
74+
! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (!fir.ref<!fir.char<1,{{.+}}>>) -> !fir.ref<i8>
75+
! CHECK: %[[VAL_28:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[VAL_2]], %[[VAL_27]], %[[VAL_1]]) fastmath<contract>
76+
! CHECK: %[[VAL_29:.*]] = fir.embox %[[VAL_11]]#0(%[[VAL_9]]) : (!fir.ref<!fir.array<10xi32>, volatile>, !fir.shape<1>) -> !fir.box<!fir.array<10xi32>, volatile>
4677
! CHECK: %[[VAL_30:.*]] = fir.volatile_cast %[[VAL_29]] : (!fir.box<!fir.array<10xi32>, volatile>) -> !fir.box<!fir.array<10xi32>>
4778
! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (!fir.box<!fir.array<10xi32>>) -> !fir.box<none>
48-
! CHECK: %[[VAL_32:.*]] = fir.call @_FortranAioOutputDescriptor(
79+
! CHECK: %[[VAL_32:.*]] = fir.call @_FortranAioOutputDescriptor(%[[VAL_28]], %[[VAL_31]])
4980
! CHECK: %[[VAL_33:.*]] = fir.load %[[VAL_14]]#0 : !fir.ref<i32, volatile>
50-
! CHECK: %[[VAL_34:.*]] = fir.call @_FortranAioOutputInteger32(
51-
! CHECK: %[[VAL_35:.*]] = fir.call @_FortranAioEndIoStatement(
81+
! CHECK: %[[VAL_34:.*]] = fir.call @_FortranAioOutputInteger32(%[[VAL_28]], %[[VAL_33]])
82+
! CHECK: %[[VAL_35:.*]] = fir.call @_QFPa() fastmath<contract> : () -> i32
83+
! CHECK: %[[VAL_36:.*]] = fir.call @_FortranAioOutputInteger32(%[[VAL_28]], %[[VAL_35]])
84+
! CHECK: %[[VAL_37:.*]] = fir.call @_QFPb() fastmath<contract> : () -> i32
85+
! CHECK: %[[VAL_38:.*]] = fir.call @_FortranAioOutputInteger32(%[[VAL_28]], %[[VAL_37]])
86+
! CHECK: %[[VAL_39:.*]] = fir.call @_QFPc() fastmath<contract> : () -> f32
87+
! CHECK: %[[VAL_40:.*]] = fir.call @_FortranAioOutputReal32(%[[VAL_28]], %[[VAL_39]])
88+
! CHECK: %[[VAL_41:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_28]])
5289
! CHECK: return
90+
! CHECK: }
91+
92+
! CHECK-LABEL: func.func private @_QFPnot_declared_volatile_in_this_scope(
93+
! CHECK-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.ref<i32> {fir.bindc_name = "v"}) attributes {{.+}} {
94+
! CHECK: %[[VAL_1:.*]] = arith.constant 1 : i32
95+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
96+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_2]] {{.*}} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
97+
! CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_3]]#0 : i32, !fir.ref<i32>
98+
! CHECK: return
99+
! CHECK: }
100+
101+
! CHECK-LABEL: func.func private @_QFPdeclared_volatile_in_this_scope(
102+
! CHECK-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.ref<!fir.array<?xi32>> {fir.bindc_name = "v", fir.volatile},
103+
! CHECK-SAME: %[[VAL_1:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.ref<i32> {fir.bindc_name = "n"}) attributes {{.+}} {
104+
! CHECK: %[[VAL_2:.*]] = arith.constant 1 : i32
105+
! CHECK: %[[VAL_3:.*]] = arith.constant 0 : index
106+
! CHECK: %[[VAL_4:.*]] = fir.dummy_scope : !fir.dscope
107+
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %[[VAL_4]] {{.*}} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
108+
! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>
109+
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
110+
! CHECK: %[[VAL_8:.*]] = arith.cmpi sgt, %[[VAL_7]], %[[VAL_3]] : index
111+
! CHECK: %[[VAL_9:.*]] = arith.select %[[VAL_8]], %[[VAL_7]], %[[VAL_3]] : index
112+
! CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_9]] : (index) -> !fir.shape<1>
113+
! CHECK: %[[VAL_11:.*]] = fir.volatile_cast %[[VAL_0]] : (!fir.ref<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>, volatile>
114+
! CHECK: %[[VAL_12:.*]]:2 = hlfir.declare %[[VAL_11]](%[[VAL_10]]) dummy_scope %[[VAL_4]] {{.*}} : (!fir.ref<!fir.array<?xi32>, volatile>, !fir.shape<1>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>, volatile>, !fir.ref<!fir.array<?xi32>, volatile>)
115+
! CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_12]]#0 : i32, !fir.box<!fir.array<?xi32>, volatile>
116+
! CHECK: return
117+
! CHECK: }
118+
119+
! CHECK-LABEL: func.func private @_QFPa() -> i32 attributes {{.+}} {
120+
! CHECK: %[[VAL_0:.*]] = arith.constant 1 : i32
121+
! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFFaEa"}
122+
! CHECK: %[[VAL_2:.*]] = fir.volatile_cast %[[VAL_1]] : (!fir.ref<i32>) -> !fir.ref<i32, volatile>
123+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] {{.*}} : (!fir.ref<i32, volatile>) -> (!fir.ref<i32, volatile>, !fir.ref<i32, volatile>)
124+
! CHECK: hlfir.assign %[[VAL_0]] to %[[VAL_3]]#0 : i32, !fir.ref<i32, volatile>
125+
! CHECK: %[[VAL_4:.*]] = fir.volatile_cast %[[VAL_3]]#0 : (!fir.ref<i32, volatile>) -> !fir.ref<i32>
126+
! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
127+
! CHECK: return %[[VAL_5]] : i32
128+
! CHECK: }
129+
130+
! CHECK-LABEL: func.func private @_QFPb() -> i32 attributes {{.+}} {
131+
! CHECK: %[[VAL_0:.*]] = arith.constant 2 : i32
132+
! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "r", uniq_name = "_QFFbEr"}
133+
! CHECK: %[[VAL_2:.*]] = fir.volatile_cast %[[VAL_1]] : (!fir.ref<i32>) -> !fir.ref<i32, volatile>
134+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] {{.*}} : (!fir.ref<i32, volatile>) -> (!fir.ref<i32, volatile>, !fir.ref<i32, volatile>)
135+
! CHECK: hlfir.assign %[[VAL_0]] to %[[VAL_3]]#0 : i32, !fir.ref<i32, volatile>
136+
! CHECK: %[[VAL_4:.*]] = fir.volatile_cast %[[VAL_3]]#0 : (!fir.ref<i32, volatile>) -> !fir.ref<i32>
137+
! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
138+
! CHECK: return %[[VAL_5]] : i32
139+
! CHECK: }
140+
141+
! CHECK-LABEL: func.func private @_QFPc() -> f32 attributes {{.+}} {
142+
! CHECK: %[[VAL_0:.*]] = arith.constant 3.000000e+00 : f32
143+
! CHECK: %[[VAL_1:.*]] = fir.alloca f32 {bindc_name = "r", uniq_name = "_QFFcEr"}
144+
! CHECK: %[[VAL_2:.*]] = fir.volatile_cast %[[VAL_1]] : (!fir.ref<f32>) -> !fir.ref<f32, volatile>
145+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] {{.*}} : (!fir.ref<f32, volatile>) -> (!fir.ref<f32, volatile>, !fir.ref<f32, volatile>)
146+
! CHECK: hlfir.assign %[[VAL_0]] to %[[VAL_3]]#0 : f32, !fir.ref<f32, volatile>
147+
! CHECK: %[[VAL_4:.*]] = fir.volatile_cast %[[VAL_3]]#0 : (!fir.ref<f32, volatile>) -> !fir.ref<f32>
148+
! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_4]] : !fir.ref<f32>
149+
! CHECK: return %[[VAL_5]] : f32
150+
! CHECK: }

0 commit comments

Comments
 (0)