1 ! Test lowering of non elemental calls and there inputs inside WHERE
2 ! constructs. These must be lowered inside hlfir.exactly_once so that
3 ! they are properly hoisted once the loops are materialized and
4 ! expression evaluations are scheduled.
5 ! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
7 subroutine test_where(a
, b
, c
)
8 real, dimension(:) :: a
, b
, c
10 function logical_func1()
11 logical :: logical_func1(100)
13 function logical_func2()
14 logical :: logical_func2(100)
16 real elemental
function elem_func(x
)
20 where (logical_func1())
21 a
= b
+ real_func(a
+b
+real_func2()) + elem_func(a
)
22 elsewhere(logical_func2())
26 ! CHECK-LABEL: func.func @_QPtest_where(
27 ! CHECK: hlfir.where {
28 ! CHECK-NOT: hlfir.exactly_once
29 ! CHECK: %[[VAL_19:.*]] = hlfir.eval_in_mem {{.*}} {
30 ! CHECK: fir.call @_QPlogical_func1() fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>
32 ! CHECK: hlfir.yield %[[VAL_19]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
33 ! CHECK: hlfir.destroy %[[VAL_19]]
36 ! CHECK: hlfir.region_assign {
37 ! CHECK: %[[VAL_24:.*]] = hlfir.exactly_once : f32 {
38 ! CHECK: %[[VAL_28:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
40 ! CHECK-NOT: hlfir.exactly_once
41 ! CHECK: %[[VAL_35:.*]] = fir.call @_QPreal_func2() fastmath<contract> : () -> f32
42 ! CHECK: %[[VAL_36:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
43 ! CHECK: ^bb0(%[[VAL_37:.*]]: index):
44 ! CHECK: %[[VAL_38:.*]] = hlfir.apply %[[VAL_28]], %[[VAL_37]] : (!hlfir.expr<?xf32>, index) -> f32
45 ! CHECK: %[[VAL_39:.*]] = arith.addf %[[VAL_38]], %[[VAL_35]] fastmath<contract> : f32
46 ! CHECK: hlfir.yield_element %[[VAL_39]] : f32
48 ! CHECK: %[[VAL_41:.*]] = fir.call @_QPreal_func
49 ! CHECK: hlfir.yield %[[VAL_41]] : f32 cleanup {
50 ! CHECK: hlfir.destroy %[[VAL_36]] : !hlfir.expr<?xf32>
51 ! CHECK: hlfir.destroy %[[VAL_28]] : !hlfir.expr<?xf32>
54 ! CHECK: %[[VAL_45:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
56 ! CHECK-NOT: hlfir.exactly_once
58 ! CHECK: %[[VAL_53:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
59 ! CHECK: fir.call @_QPelem_func
61 ! CHECK: %[[VAL_57:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
64 ! CHECK: hlfir.yield %[[VAL_57]] : !hlfir.expr<?xf32> cleanup {
65 ! CHECK: hlfir.destroy %[[VAL_57]] : !hlfir.expr<?xf32>
66 ! CHECK: hlfir.destroy %[[VAL_53]] : !hlfir.expr<?xf32>
67 ! CHECK: hlfir.destroy %[[VAL_45]] : !hlfir.expr<?xf32>
70 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
72 ! CHECK: hlfir.elsewhere mask {
73 ! CHECK: %[[VAL_62:.*]] = hlfir.exactly_once : !hlfir.expr<100x!fir.logical<4>> {
74 ! CHECK: %[[VAL_72:.*]] = hlfir.eval_in_mem {{.*}} {
75 ! CHECK: fir.call @_QPlogical_func2() fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>
77 ! CHECK: hlfir.yield %[[VAL_72]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
78 ! CHECK: hlfir.destroy %[[VAL_72]]
81 ! CHECK: hlfir.yield %[[VAL_62]] : !hlfir.expr<100x!fir.logical<4>>
83 ! CHECK: hlfir.region_assign {
84 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
86 ! CHECK: %[[VAL_80:.*]] = hlfir.exactly_once : i32 {
87 ! CHECK: %[[VAL_81:.*]] = fir.call @_QPifoo() fastmath<contract> : () -> i32
88 ! CHECK: hlfir.yield %[[VAL_81]] : i32
90 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
97 subroutine test_where_in_forall(a
, b
, c
)
98 real, dimension(:, :) :: a
, b
, c
100 pure
function pure_logical_func1()
101 logical :: pure_logical_func1(100)
103 pure
function pure_logical_func2()
104 logical :: pure_logical_func2(100)
106 real pure elemental
function pure_elem_func(x
)
107 real, intent(in
) :: x
109 integer pure
function pure_ifoo()
113 where (pure_logical_func1())
114 a(2*i
, :) = b(i
, :) + pure_real_func(a(i
,:)+b(i
,:)+pure_real_func2()) + pure_elem_func(a(i
,:))
115 elsewhere(pure_logical_func2())
116 a(2*i
, 1:pure_ifoo()) = c(i
, :)
120 ! CHECK-LABEL: func.func @_QPtest_where_in_forall(
121 ! CHECK: hlfir.forall lb {
122 ! CHECK: hlfir.yield %{{.*}} : i32
124 ! CHECK: hlfir.yield %{{.*}} : i32
125 ! CHECK: } (%[[VAL_10:.*]]: i32) {
126 ! CHECK: %[[VAL_11:.*]] = hlfir.forall_index "i" %[[VAL_10]] : (i32) -> !fir.ref<i32>
127 ! CHECK: hlfir.where {
128 ! CHECK-NOT: hlfir.exactly_once
129 ! CHECK: %[[VAL_23:.*]] = hlfir.eval_in_mem {{.*}} {
130 ! CHECK: fir.call @_QPpure_logical_func1() proc_attrs<pure> fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>
132 ! CHECK: hlfir.yield %[[VAL_23]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
133 ! CHECK: hlfir.destroy %[[VAL_23]]
136 ! CHECK: hlfir.region_assign {
137 ! CHECK: %[[VAL_41:.*]] = hlfir.designate
138 ! CHECK: %[[VAL_42:.*]] = hlfir.exactly_once : f32 {
139 ! CHECK: hlfir.designate
140 ! CHECK: hlfir.designate
141 ! CHECK: %[[VAL_71:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
144 ! CHECK-NOT: hlfir.exactly_once
145 ! CHECK: %[[VAL_78:.*]] = fir.call @_QPpure_real_func2() fastmath<contract> : () -> f32
146 ! CHECK: %[[VAL_79:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
149 ! CHECK: %[[VAL_84:.*]] = fir.call @_QPpure_real_func(
150 ! CHECK: hlfir.yield %[[VAL_84]] : f32 cleanup {
151 ! CHECK: hlfir.destroy %[[VAL_79]] : !hlfir.expr<?xf32>
152 ! CHECK: hlfir.destroy %[[VAL_71]] : !hlfir.expr<?xf32>
155 ! CHECK: %[[VAL_85:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
158 ! CHECK-NOT: hlfir.exactly_once
159 ! CHECK: %[[VAL_104:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
160 ! CHECK: ^bb0(%[[VAL_105:.*]]: index):
161 ! CHECK-NOT: hlfir.exactly_once
162 ! CHECK: fir.call @_QPpure_elem_func
164 ! CHECK: %[[VAL_108:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
167 ! CHECK: hlfir.yield %[[VAL_108]] : !hlfir.expr<?xf32> cleanup {
168 ! CHECK: hlfir.destroy %[[VAL_108]] : !hlfir.expr<?xf32>
169 ! CHECK: hlfir.destroy %[[VAL_104]] : !hlfir.expr<?xf32>
170 ! CHECK: hlfir.destroy %[[VAL_85]] : !hlfir.expr<?xf32>
173 ! CHECK: hlfir.designate
174 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
176 ! CHECK: hlfir.elsewhere mask {
177 ! CHECK: %[[VAL_129:.*]] = hlfir.exactly_once : !hlfir.expr<100x!fir.logical<4>> {
178 ! CHECK: %[[VAL_139:.*]] = hlfir.eval_in_mem {{.*}} {
179 ! CHECK: fir.call @_QPpure_logical_func2() proc_attrs<pure> fastmath<contract> : () -> !fir.array<100x!fir.logical<4>>
181 ! CHECK: hlfir.yield %[[VAL_139]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
182 ! CHECK: hlfir.destroy %[[VAL_139]]
185 ! CHECK: hlfir.yield %[[VAL_129]] : !hlfir.expr<100x!fir.logical<4>>
187 ! CHECK: hlfir.region_assign {
188 ! CHECK: hlfir.designate
189 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
191 ! CHECK: %[[VAL_165:.*]] = hlfir.exactly_once : i32 {
192 ! CHECK: %[[VAL_166:.*]] = fir.call @_QPpure_ifoo() proc_attrs<pure> fastmath<contract> : () -> i32
193 ! CHECK: hlfir.yield %[[VAL_166]] : i32
195 ! CHECK: hlfir.designate
196 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>