1 | //===- ReductionTest.cpp -- Reduction runtime builder unit tests ----------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "flang/Optimizer/Builder/Runtime/Reduction.h" |
10 | #include "RuntimeCallTestBase.h" |
11 | #include "gtest/gtest.h" |
12 | |
13 | TEST_F(RuntimeCallTest, genAllTest) { |
14 | mlir::Location loc = firBuilder->getUnknownLoc(); |
15 | mlir::Value undef = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
16 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
17 | mlir::Value all = fir::runtime::genAll(*firBuilder, loc, undef, dim); |
18 | checkCallOp(all.getDefiningOp(), "_FortranAAll" , 2); |
19 | } |
20 | |
21 | TEST_F(RuntimeCallTest, genAllDescriptorTest) { |
22 | mlir::Location loc = firBuilder->getUnknownLoc(); |
23 | mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
24 | mlir::Value mask = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
25 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
26 | fir::runtime::genAllDescriptor(*firBuilder, loc, result, mask, dim); |
27 | checkCallOpFromResultBox(result, "_FortranAAllDim" , 3); |
28 | } |
29 | |
30 | TEST_F(RuntimeCallTest, genAnyTest) { |
31 | mlir::Location loc = firBuilder->getUnknownLoc(); |
32 | mlir::Value undef = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
33 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
34 | mlir::Value any = fir::runtime::genAny(*firBuilder, loc, undef, dim); |
35 | checkCallOp(any.getDefiningOp(), "_FortranAAny" , 2); |
36 | } |
37 | |
38 | TEST_F(RuntimeCallTest, genAnyDescriptorTest) { |
39 | mlir::Location loc = firBuilder->getUnknownLoc(); |
40 | mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
41 | mlir::Value mask = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
42 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
43 | fir::runtime::genAnyDescriptor(*firBuilder, loc, result, mask, dim); |
44 | checkCallOpFromResultBox(result, "_FortranAAnyDim" , 3); |
45 | } |
46 | |
47 | TEST_F(RuntimeCallTest, genCountTest) { |
48 | mlir::Location loc = firBuilder->getUnknownLoc(); |
49 | mlir::Value undef = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
50 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
51 | mlir::Value count = fir::runtime::genCount(*firBuilder, loc, undef, dim); |
52 | checkCallOp(count.getDefiningOp(), "_FortranACount" , 2); |
53 | } |
54 | |
55 | TEST_F(RuntimeCallTest, genCountDimTest) { |
56 | mlir::Location loc = firBuilder->getUnknownLoc(); |
57 | mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
58 | mlir::Value mask = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
59 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
60 | mlir::Value kind = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
61 | fir::runtime::genCountDim(*firBuilder, loc, result, mask, dim, kind); |
62 | checkCallOpFromResultBox(result, "_FortranACountDim" , 4); |
63 | } |
64 | |
65 | void testGenMaxVal( |
66 | fir::FirOpBuilder &builder, mlir::Type eleTy, llvm::StringRef fctName) { |
67 | mlir::Location loc = builder.getUnknownLoc(); |
68 | mlir::Type seqTy = |
69 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), eleTy); |
70 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
71 | mlir::Value undef = builder.create<fir::UndefOp>(loc, refSeqTy); |
72 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
73 | mlir::Value max = fir::runtime::genMaxval(builder, loc, undef, mask); |
74 | checkCallOp(max.getDefiningOp(), fctName, 3); |
75 | } |
76 | |
77 | TEST_F(RuntimeCallTest, genMaxValTest) { |
78 | testGenMaxVal(*firBuilder, f32Ty, "_FortranAMaxvalReal4" ); |
79 | testGenMaxVal(*firBuilder, f64Ty, "_FortranAMaxvalReal8" ); |
80 | testGenMaxVal(*firBuilder, f80Ty, "_FortranAMaxvalReal10" ); |
81 | testGenMaxVal(*firBuilder, f128Ty, "_FortranAMaxvalReal16" ); |
82 | |
83 | testGenMaxVal(*firBuilder, i8Ty, "_FortranAMaxvalInteger1" ); |
84 | testGenMaxVal(*firBuilder, i16Ty, "_FortranAMaxvalInteger2" ); |
85 | testGenMaxVal(*firBuilder, i32Ty, "_FortranAMaxvalInteger4" ); |
86 | testGenMaxVal(*firBuilder, i64Ty, "_FortranAMaxvalInteger8" ); |
87 | testGenMaxVal(*firBuilder, i128Ty, "_FortranAMaxvalInteger16" ); |
88 | } |
89 | |
90 | void testGenMinVal( |
91 | fir::FirOpBuilder &builder, mlir::Type eleTy, llvm::StringRef fctName) { |
92 | mlir::Location loc = builder.getUnknownLoc(); |
93 | mlir::Type seqTy = |
94 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), eleTy); |
95 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
96 | mlir::Value undef = builder.create<fir::UndefOp>(loc, refSeqTy); |
97 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
98 | mlir::Value min = fir::runtime::genMinval(builder, loc, undef, mask); |
99 | checkCallOp(min.getDefiningOp(), fctName, 3); |
100 | } |
101 | |
102 | TEST_F(RuntimeCallTest, genMinValTest) { |
103 | testGenMinVal(*firBuilder, f32Ty, "_FortranAMinvalReal4" ); |
104 | testGenMinVal(*firBuilder, f64Ty, "_FortranAMinvalReal8" ); |
105 | testGenMinVal(*firBuilder, f80Ty, "_FortranAMinvalReal10" ); |
106 | testGenMinVal(*firBuilder, f128Ty, "_FortranAMinvalReal16" ); |
107 | |
108 | testGenMinVal(*firBuilder, i8Ty, "_FortranAMinvalInteger1" ); |
109 | testGenMinVal(*firBuilder, i16Ty, "_FortranAMinvalInteger2" ); |
110 | testGenMinVal(*firBuilder, i32Ty, "_FortranAMinvalInteger4" ); |
111 | testGenMinVal(*firBuilder, i64Ty, "_FortranAMinvalInteger8" ); |
112 | testGenMinVal(*firBuilder, i128Ty, "_FortranAMinvalInteger16" ); |
113 | } |
114 | |
115 | TEST_F(RuntimeCallTest, genParityTest) { |
116 | mlir::Location loc = firBuilder->getUnknownLoc(); |
117 | mlir::Value undef = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
118 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
119 | mlir::Value parity = fir::runtime::genParity(*firBuilder, loc, undef, dim); |
120 | checkCallOp(parity.getDefiningOp(), "_FortranAParity" , 2); |
121 | } |
122 | |
123 | TEST_F(RuntimeCallTest, genParityDescriptorTest) { |
124 | mlir::Location loc = firBuilder->getUnknownLoc(); |
125 | mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
126 | mlir::Value mask = firBuilder->create<fir::UndefOp>(loc, seqTy10); |
127 | mlir::Value dim = firBuilder->createIntegerConstant(loc, i32Ty, 1); |
128 | fir::runtime::genParityDescriptor(*firBuilder, loc, result, mask, dim); |
129 | checkCallOpFromResultBox(result, "_FortranAParityDim" , 3); |
130 | } |
131 | |
132 | void testGenSum( |
133 | fir::FirOpBuilder &builder, mlir::Type eleTy, llvm::StringRef fctName) { |
134 | mlir::Location loc = builder.getUnknownLoc(); |
135 | mlir::Type seqTy = |
136 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), eleTy); |
137 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
138 | mlir::Value undef = builder.create<fir::UndefOp>(loc, refSeqTy); |
139 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
140 | mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy); |
141 | mlir::Value sum = fir::runtime::genSum(builder, loc, undef, mask, result); |
142 | if (fir::isa_complex(eleTy)) |
143 | checkCallOpFromResultBox(result, fctName, 4); |
144 | else |
145 | checkCallOp(sum.getDefiningOp(), fctName, 3); |
146 | } |
147 | |
148 | TEST_F(RuntimeCallTest, genSumTest) { |
149 | testGenSum(*firBuilder, f32Ty, "_FortranASumReal4" ); |
150 | testGenSum(*firBuilder, f64Ty, "_FortranASumReal8" ); |
151 | testGenSum(*firBuilder, f80Ty, "_FortranASumReal10" ); |
152 | testGenSum(*firBuilder, f128Ty, "_FortranASumReal16" ); |
153 | testGenSum(*firBuilder, i8Ty, "_FortranASumInteger1" ); |
154 | testGenSum(*firBuilder, i16Ty, "_FortranASumInteger2" ); |
155 | testGenSum(*firBuilder, i32Ty, "_FortranASumInteger4" ); |
156 | testGenSum(*firBuilder, i64Ty, "_FortranASumInteger8" ); |
157 | testGenSum(*firBuilder, i128Ty, "_FortranASumInteger16" ); |
158 | testGenSum(*firBuilder, c4Ty, "_FortranACppSumComplex4" ); |
159 | testGenSum(*firBuilder, c8Ty, "_FortranACppSumComplex8" ); |
160 | testGenSum(*firBuilder, c10Ty, "_FortranACppSumComplex10" ); |
161 | testGenSum(*firBuilder, c16Ty, "_FortranACppSumComplex16" ); |
162 | } |
163 | |
164 | void testGenProduct( |
165 | fir::FirOpBuilder &builder, mlir::Type eleTy, llvm::StringRef fctName) { |
166 | mlir::Location loc = builder.getUnknownLoc(); |
167 | mlir::Type seqTy = |
168 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), eleTy); |
169 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
170 | mlir::Value undef = builder.create<fir::UndefOp>(loc, refSeqTy); |
171 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
172 | mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy); |
173 | mlir::Value prod = |
174 | fir::runtime::genProduct(builder, loc, undef, mask, result); |
175 | if (fir::isa_complex(eleTy)) |
176 | checkCallOpFromResultBox(result, fctName, 4); |
177 | else |
178 | checkCallOp(prod.getDefiningOp(), fctName, 3); |
179 | } |
180 | |
181 | TEST_F(RuntimeCallTest, genProduct) { |
182 | testGenProduct(*firBuilder, f32Ty, "_FortranAProductReal4" ); |
183 | testGenProduct(*firBuilder, f64Ty, "_FortranAProductReal8" ); |
184 | testGenProduct(*firBuilder, f80Ty, "_FortranAProductReal10" ); |
185 | testGenProduct(*firBuilder, f128Ty, "_FortranAProductReal16" ); |
186 | testGenProduct(*firBuilder, i8Ty, "_FortranAProductInteger1" ); |
187 | testGenProduct(*firBuilder, i16Ty, "_FortranAProductInteger2" ); |
188 | testGenProduct(*firBuilder, i32Ty, "_FortranAProductInteger4" ); |
189 | testGenProduct(*firBuilder, i64Ty, "_FortranAProductInteger8" ); |
190 | testGenProduct(*firBuilder, i128Ty, "_FortranAProductInteger16" ); |
191 | testGenProduct(*firBuilder, c4Ty, "_FortranACppProductComplex4" ); |
192 | testGenProduct(*firBuilder, c8Ty, "_FortranACppProductComplex8" ); |
193 | testGenProduct(*firBuilder, c10Ty, "_FortranACppProductComplex10" ); |
194 | testGenProduct(*firBuilder, c16Ty, "_FortranACppProductComplex16" ); |
195 | } |
196 | |
197 | void testGenDotProduct( |
198 | fir::FirOpBuilder &builder, mlir::Type eleTy, llvm::StringRef fctName) { |
199 | mlir::Location loc = builder.getUnknownLoc(); |
200 | mlir::Type seqTy = |
201 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), eleTy); |
202 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
203 | mlir::Value a = builder.create<fir::UndefOp>(loc, refSeqTy); |
204 | mlir::Value b = builder.create<fir::UndefOp>(loc, refSeqTy); |
205 | mlir::Value result = |
206 | builder.create<fir::UndefOp>(loc, fir::ReferenceType::get(eleTy)); |
207 | mlir::Value prod = fir::runtime::genDotProduct(builder, loc, a, b, result); |
208 | if (fir::isa_complex(eleTy)) |
209 | checkCallOpFromResultBox(result, fctName, 3); |
210 | else |
211 | checkCallOp(prod.getDefiningOp(), fctName, 2); |
212 | } |
213 | |
214 | TEST_F(RuntimeCallTest, genDotProduct) { |
215 | testGenDotProduct(*firBuilder, f32Ty, "_FortranADotProductReal4" ); |
216 | testGenDotProduct(*firBuilder, f64Ty, "_FortranADotProductReal8" ); |
217 | testGenDotProduct(*firBuilder, f80Ty, "_FortranADotProductReal10" ); |
218 | testGenDotProduct(*firBuilder, f128Ty, "_FortranADotProductReal16" ); |
219 | testGenDotProduct(*firBuilder, i8Ty, "_FortranADotProductInteger1" ); |
220 | testGenDotProduct(*firBuilder, i16Ty, "_FortranADotProductInteger2" ); |
221 | testGenDotProduct(*firBuilder, i32Ty, "_FortranADotProductInteger4" ); |
222 | testGenDotProduct(*firBuilder, i64Ty, "_FortranADotProductInteger8" ); |
223 | testGenDotProduct(*firBuilder, i128Ty, "_FortranADotProductInteger16" ); |
224 | testGenDotProduct(*firBuilder, c4Ty, "_FortranACppDotProductComplex4" ); |
225 | testGenDotProduct(*firBuilder, c8Ty, "_FortranACppDotProductComplex8" ); |
226 | testGenDotProduct(*firBuilder, c10Ty, "_FortranACppDotProductComplex10" ); |
227 | testGenDotProduct(*firBuilder, c16Ty, "_FortranACppDotProductComplex16" ); |
228 | } |
229 | |
230 | void checkGenMxxloc(fir::FirOpBuilder &builder, mlir::Type eleTy, |
231 | void (*genFct)(fir::FirOpBuilder &, mlir::Location, mlir::Value, |
232 | mlir::Value, mlir::Value, mlir::Value, mlir::Value), |
233 | llvm::StringRef fctName, unsigned nbArgs) { |
234 | mlir::Location loc = builder.getUnknownLoc(); |
235 | mlir::Type i32Ty = builder.getI32Type(); |
236 | mlir::Type seqTy = |
237 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), eleTy); |
238 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
239 | mlir::Value a = builder.create<fir::UndefOp>(loc, refSeqTy); |
240 | mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy); |
241 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
242 | mlir::Value kind = builder.createIntegerConstant(loc, i32Ty, 1); |
243 | mlir::Value back = builder.createIntegerConstant(loc, i32Ty, 1); |
244 | genFct(builder, loc, result, a, mask, kind, back); |
245 | checkCallOpFromResultBox(result, fctName, nbArgs); |
246 | } |
247 | |
248 | TEST_F(RuntimeCallTest, genMaxlocTest) { |
249 | checkGenMxxloc(*firBuilder, char1Ty, fir::runtime::genMaxloc, |
250 | "_FortranAMaxlocCharacter" , 5); |
251 | checkGenMxxloc(*firBuilder, char2Ty, fir::runtime::genMaxloc, |
252 | "_FortranAMaxlocCharacter" , 5); |
253 | checkGenMxxloc(*firBuilder, char4Ty, fir::runtime::genMaxloc, |
254 | "_FortranAMaxlocCharacter" , 5); |
255 | checkGenMxxloc( |
256 | *firBuilder, i8Ty, fir::runtime::genMaxloc, "_FortranAMaxlocInteger1" , 5); |
257 | checkGenMxxloc(*firBuilder, i16Ty, fir::runtime::genMaxloc, |
258 | "_FortranAMaxlocInteger2" , 5); |
259 | checkGenMxxloc(*firBuilder, i32Ty, fir::runtime::genMaxloc, |
260 | "_FortranAMaxlocInteger4" , 5); |
261 | checkGenMxxloc(*firBuilder, i64Ty, fir::runtime::genMaxloc, |
262 | "_FortranAMaxlocInteger8" , 5); |
263 | checkGenMxxloc(*firBuilder, i128Ty, fir::runtime::genMaxloc, |
264 | "_FortranAMaxlocInteger16" , 5); |
265 | checkGenMxxloc( |
266 | *firBuilder, f32Ty, fir::runtime::genMaxloc, "_FortranAMaxlocReal4" , 5); |
267 | checkGenMxxloc( |
268 | *firBuilder, f64Ty, fir::runtime::genMaxloc, "_FortranAMaxlocReal8" , 5); |
269 | checkGenMxxloc( |
270 | *firBuilder, f80Ty, fir::runtime::genMaxloc, "_FortranAMaxlocReal10" , 5); |
271 | checkGenMxxloc( |
272 | *firBuilder, f128Ty, fir::runtime::genMaxloc, "_FortranAMaxlocReal16" , 5); |
273 | } |
274 | |
275 | TEST_F(RuntimeCallTest, genMinlocTest) { |
276 | checkGenMxxloc(*firBuilder, char1Ty, fir::runtime::genMinloc, |
277 | "_FortranAMinlocCharacter" , 5); |
278 | checkGenMxxloc(*firBuilder, char2Ty, fir::runtime::genMinloc, |
279 | "_FortranAMinlocCharacter" , 5); |
280 | checkGenMxxloc(*firBuilder, char4Ty, fir::runtime::genMinloc, |
281 | "_FortranAMinlocCharacter" , 5); |
282 | checkGenMxxloc( |
283 | *firBuilder, i8Ty, fir::runtime::genMinloc, "_FortranAMinlocInteger1" , 5); |
284 | checkGenMxxloc(*firBuilder, i16Ty, fir::runtime::genMinloc, |
285 | "_FortranAMinlocInteger2" , 5); |
286 | checkGenMxxloc(*firBuilder, i32Ty, fir::runtime::genMinloc, |
287 | "_FortranAMinlocInteger4" , 5); |
288 | checkGenMxxloc(*firBuilder, i64Ty, fir::runtime::genMinloc, |
289 | "_FortranAMinlocInteger8" , 5); |
290 | checkGenMxxloc(*firBuilder, i128Ty, fir::runtime::genMinloc, |
291 | "_FortranAMinlocInteger16" , 5); |
292 | checkGenMxxloc( |
293 | *firBuilder, f32Ty, fir::runtime::genMinloc, "_FortranAMinlocReal4" , 5); |
294 | checkGenMxxloc( |
295 | *firBuilder, f64Ty, fir::runtime::genMinloc, "_FortranAMinlocReal8" , 5); |
296 | checkGenMxxloc( |
297 | *firBuilder, f80Ty, fir::runtime::genMinloc, "_FortranAMinlocReal10" , 5); |
298 | checkGenMxxloc( |
299 | *firBuilder, f128Ty, fir::runtime::genMinloc, "_FortranAMinlocReal16" , 5); |
300 | } |
301 | |
302 | void checkGenMxxlocDim(fir::FirOpBuilder &builder, |
303 | void (*genFct)(fir::FirOpBuilder &, mlir::Location, mlir::Value, |
304 | mlir::Value, mlir::Value, mlir::Value, mlir::Value, mlir::Value), |
305 | llvm::StringRef fctName, unsigned nbArgs) { |
306 | mlir::Location loc = builder.getUnknownLoc(); |
307 | auto i32Ty = builder.getI32Type(); |
308 | mlir::Type seqTy = |
309 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty); |
310 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
311 | mlir::Value a = builder.create<fir::UndefOp>(loc, refSeqTy); |
312 | mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy); |
313 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
314 | mlir::Value kind = builder.createIntegerConstant(loc, i32Ty, 1); |
315 | mlir::Value dim = builder.createIntegerConstant(loc, i32Ty, 1); |
316 | mlir::Value back = builder.createIntegerConstant(loc, i32Ty, 1); |
317 | genFct(builder, loc, result, a, dim, mask, kind, back); |
318 | checkCallOpFromResultBox(result, fctName, nbArgs); |
319 | } |
320 | |
321 | TEST_F(RuntimeCallTest, genMaxlocDimTest) { |
322 | checkGenMxxlocDim( |
323 | *firBuilder, fir::runtime::genMaxlocDim, "_FortranAMaxlocDim" , 6); |
324 | } |
325 | |
326 | TEST_F(RuntimeCallTest, genMinlocDimTest) { |
327 | checkGenMxxlocDim( |
328 | *firBuilder, fir::runtime::genMinlocDim, "_FortranAMinlocDim" , 6); |
329 | } |
330 | |
331 | void checkGenMxxvalChar(fir::FirOpBuilder &builder, |
332 | void (*genFct)(fir::FirOpBuilder &, mlir::Location, mlir::Value, |
333 | mlir::Value, mlir::Value), |
334 | llvm::StringRef fctName, unsigned nbArgs) { |
335 | mlir::Location loc = builder.getUnknownLoc(); |
336 | auto i32Ty = builder.getI32Type(); |
337 | mlir::Type seqTy = |
338 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty); |
339 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
340 | mlir::Value a = builder.create<fir::UndefOp>(loc, refSeqTy); |
341 | mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy); |
342 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
343 | genFct(builder, loc, result, a, mask); |
344 | checkCallOpFromResultBox(result, fctName, nbArgs); |
345 | } |
346 | |
347 | TEST_F(RuntimeCallTest, genMaxvalCharTest) { |
348 | checkGenMxxvalChar( |
349 | *firBuilder, fir::runtime::genMaxvalChar, "_FortranAMaxvalCharacter" , 3); |
350 | } |
351 | |
352 | TEST_F(RuntimeCallTest, genMinvalCharTest) { |
353 | checkGenMxxvalChar( |
354 | *firBuilder, fir::runtime::genMinvalChar, "_FortranAMinvalCharacter" , 3); |
355 | } |
356 | |
357 | void checkGen4argsDim(fir::FirOpBuilder &builder, |
358 | void (*genFct)(fir::FirOpBuilder &, mlir::Location, mlir::Value, |
359 | mlir::Value, mlir::Value, mlir::Value), |
360 | llvm::StringRef fctName, unsigned nbArgs) { |
361 | mlir::Location loc = builder.getUnknownLoc(); |
362 | auto i32Ty = builder.getI32Type(); |
363 | mlir::Type seqTy = |
364 | fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty); |
365 | mlir::Type refSeqTy = fir::ReferenceType::get(seqTy); |
366 | mlir::Value a = builder.create<fir::UndefOp>(loc, refSeqTy); |
367 | mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy); |
368 | mlir::Value mask = builder.create<fir::UndefOp>(loc, seqTy); |
369 | mlir::Value dim = builder.createIntegerConstant(loc, i32Ty, 1); |
370 | genFct(builder, loc, result, a, dim, mask); |
371 | checkCallOpFromResultBox(result, fctName, nbArgs); |
372 | } |
373 | |
374 | TEST_F(RuntimeCallTest, genMaxvalDimTest) { |
375 | checkGen4argsDim( |
376 | *firBuilder, fir::runtime::genMaxvalDim, "_FortranAMaxvalDim" , 4); |
377 | } |
378 | |
379 | TEST_F(RuntimeCallTest, genMinvalDimTest) { |
380 | checkGen4argsDim( |
381 | *firBuilder, fir::runtime::genMinvalDim, "_FortranAMinvalDim" , 4); |
382 | } |
383 | |
384 | TEST_F(RuntimeCallTest, genProductDimTest) { |
385 | checkGen4argsDim( |
386 | *firBuilder, fir::runtime::genProductDim, "_FortranAProductDim" , 4); |
387 | } |
388 | |
389 | TEST_F(RuntimeCallTest, genSumDimTest) { |
390 | checkGen4argsDim(*firBuilder, fir::runtime::genSumDim, "_FortranASumDim" , 4); |
391 | } |
392 | |