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