@@ -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()
1212contains
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
2234end 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