[Clang] Make OpenMP offloading consistently use the bound architecture (#125135)
[llvm-project.git] / flang / test / Lower / HLFIR / where-nonelemental.f90
blob7be583189001246fe259b28abbee40e225199384
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
9 interface
10 function logical_func1()
11 logical :: logical_func1(100)
12 end function
13 function logical_func2()
14 logical :: logical_func2(100)
15 end function
16 real elemental function elem_func(x)
17 real, intent(in) :: x
18 end function
19 end interface
20 where (logical_func1())
21 a = b + real_func(a+b+real_func2()) + elem_func(a)
22 elsewhere(logical_func2())
23 a(1:ifoo()) = c
24 end where
25 end subroutine
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>>
31 ! CHECK: }
32 ! CHECK: hlfir.yield %[[VAL_19]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
33 ! CHECK: hlfir.destroy %[[VAL_19]]
34 ! CHECK: }
35 ! CHECK: } do {
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> {
39 ! CHECK: }
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
47 ! CHECK: }
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>
52 ! CHECK: }
53 ! CHECK: }
54 ! CHECK: %[[VAL_45:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
55 ! CHECK: arith.addf
56 ! CHECK-NOT: hlfir.exactly_once
57 ! CHECK: }
58 ! CHECK: %[[VAL_53:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
59 ! CHECK: fir.call @_QPelem_func
60 ! CHECK: }
61 ! CHECK: %[[VAL_57:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
62 ! CHECK: arith.addf
63 ! CHECK: }
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>
68 ! CHECK: }
69 ! CHECK: } to {
70 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
71 ! CHECK: }
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>>
76 ! CHECK: }
77 ! CHECK: hlfir.yield %[[VAL_72]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
78 ! CHECK: hlfir.destroy %[[VAL_72]]
79 ! CHECK: }
80 ! CHECK: }
81 ! CHECK: hlfir.yield %[[VAL_62]] : !hlfir.expr<100x!fir.logical<4>>
82 ! CHECK: } do {
83 ! CHECK: hlfir.region_assign {
84 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
85 ! CHECK: } to {
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
89 ! CHECK: }
90 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
91 ! CHECK: }
92 ! CHECK: }
93 ! CHECK: }
94 ! CHECK: return
95 ! CHECK: }
97 subroutine test_where_in_forall(a, b, c)
98 real, dimension(:, :) :: a, b, c
99 interface
100 pure function pure_logical_func1()
101 logical :: pure_logical_func1(100)
102 end function
103 pure function pure_logical_func2()
104 logical :: pure_logical_func2(100)
105 end function
106 real pure elemental function pure_elem_func(x)
107 real, intent(in) :: x
108 end function
109 integer pure function pure_ifoo()
110 end function
111 end interface
112 forall(i=1:10)
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, :)
117 end where
118 end forall
119 end subroutine
120 ! CHECK-LABEL: func.func @_QPtest_where_in_forall(
121 ! CHECK: hlfir.forall lb {
122 ! CHECK: hlfir.yield %{{.*}} : i32
123 ! CHECK: } ub {
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>>
131 ! CHECK: }
132 ! CHECK: hlfir.yield %[[VAL_23]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
133 ! CHECK: hlfir.destroy %[[VAL_23]]
134 ! CHECK: }
135 ! CHECK: } do {
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> {
142 ! CHECK: arith.addf
143 ! CHECK: }
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> {
147 ! CHECK: arith.addf
148 ! CHECK: }
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>
153 ! CHECK: }
154 ! CHECK: }
155 ! CHECK: %[[VAL_85:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
156 ! CHECK: arith.addf
157 ! CHECK: }
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
163 ! CHECK: }
164 ! CHECK: %[[VAL_108:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
165 ! CHECK: arith.addf
166 ! CHECK: }
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>
171 ! CHECK: }
172 ! CHECK: } to {
173 ! CHECK: hlfir.designate
174 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
175 ! CHECK: }
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>>
180 ! CHECK: }
181 ! CHECK: hlfir.yield %[[VAL_139]] : !hlfir.expr<100x!fir.logical<4>> cleanup {
182 ! CHECK: hlfir.destroy %[[VAL_139]]
183 ! CHECK: }
184 ! CHECK: }
185 ! CHECK: hlfir.yield %[[VAL_129]] : !hlfir.expr<100x!fir.logical<4>>
186 ! CHECK: } do {
187 ! CHECK: hlfir.region_assign {
188 ! CHECK: hlfir.designate
189 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
190 ! CHECK: } to {
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
194 ! CHECK: }
195 ! CHECK: hlfir.designate
196 ! CHECK: hlfir.yield %{{.*}} : !fir.box<!fir.array<?xf32>>
197 ! CHECK: }
198 ! CHECK: }
199 ! CHECK: }
200 ! CHECK: }
201 ! CHECK: return
202 ! CHECK: }