@@ -8,7 +8,7 @@ program p
8
8
call not_declared_volatile_in_this_scope(i)
9
9
call not_declared_volatile_in_this_scope(arr)
10
10
call declared_volatile_in_this_scope(arr,10 )
11
- print * ,arr,i
11
+ print * ,arr,i,a(),b(),c()
12
12
contains
13
13
elemental subroutine not_declared_volatile_in_this_scope (v )
14
14
integer ,intent (inout ):: v
@@ -19,34 +19,132 @@ subroutine declared_volatile_in_this_scope(v,n)
19
19
integer ,volatile,intent (inout ):: v(n)
20
20
v= 1
21
21
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
22
34
end program
23
35
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"}
28
50
! 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>
32
54
! CHECK: %[[VAL_15:.*]] = fir.volatile_cast %[[VAL_14]]#0 : (!fir.ref<i32, volatile>) -> !fir.ref<i32>
33
55
! 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>
35
62
! CHECK: %[[VAL_20:.*]] = fir.volatile_cast %[[VAL_19]] : (!fir.ref<i32, volatile>) -> !fir.ref<i32>
36
63
! 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:
37
68
! CHECK: %[[VAL_23:.*]] = fir.volatile_cast %[[VAL_11]]#0 : (!fir.ref<!fir.array<10xi32>, volatile>) -> !fir.ref<!fir.array<10xi32>>
38
69
! 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)
40
71
! CHECK: fir.call @_QFPdeclared_volatile_in_this_scope(%[[VAL_24]], %[[VAL_25]]#0) fastmath<contract> : (!fir.ref<!fir.array<?xi32>>, !fir.ref<i32>) -> ()
41
72
! 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>
46
77
! CHECK: %[[VAL_30:.*]] = fir.volatile_cast %[[VAL_29]] : (!fir.box<!fir.array<10xi32>, volatile>) -> !fir.box<!fir.array<10xi32>>
47
78
! 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]])
49
80
! 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]])
52
89
! 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