Skip to content

Commit 410e02a

Browse files
authored
Sync back some runtime builder after upstreaming (#1327)
1 parent 8158d45 commit 410e02a

File tree

7 files changed

+50
-89
lines changed

7 files changed

+50
-89
lines changed

flang/include/flang/Optimizer/Builder/Runtime/Character.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ class FirOpBuilder;
1818

1919
namespace fir::runtime {
2020

21-
/// Generate a call to the ADJUSTL runtime.
21+
/// Generate a call to the `ADJUSTL` runtime.
2222
/// This calls the simple runtime entry point that then calls into the more
2323
/// complex runtime cases handling left or right adjustments.
2424
///
2525
/// \p resultBox must be an unallocated allocatable used for the temporary
26-
/// result. \p StringBox must be a fir.box describing the adjustl string
26+
/// result. \p StringBox must be a `fir.box` describing the `ADJUSTL` string
2727
/// argument. Note that the \p genAdjust() helper is called to do the majority
2828
/// of the lowering work.
2929
void genAdjustL(fir::FirOpBuilder &builder, mlir::Location loc,
3030
mlir::Value resultBox, mlir::Value stringBox);
3131

32-
/// Generate a call to the ADJUSTR runtime.
32+
/// Generate a call to the `ADJUSTR` runtime.
3333
/// This calls the simple runtime entry point that then calls into the more
3434
/// complex runtime cases handling left or right adjustments.
3535
///
@@ -40,16 +40,6 @@ void genAdjustL(fir::FirOpBuilder &builder, mlir::Location loc,
4040
void genAdjustR(fir::FirOpBuilder &builder, mlir::Location loc,
4141
mlir::Value resultBox, mlir::Value stringBox);
4242

43-
/// Generate a call to the ADJUST[L|R] runtime.
44-
///
45-
/// \p resultBox must be an unallocated allocatable used for the temporary
46-
/// result. \p StringBox must be a fir.box describing the adjustr string
47-
/// argument. The \p adjustFunc should be a mlir::FuncOp for the appropriate
48-
/// runtime entry function.
49-
void genAdjust(fir::FirOpBuilder &builder, mlir::Location loc,
50-
mlir::Value resultBox, mlir::Value stringBox,
51-
mlir::FuncOp &adjustFunc);
52-
5343
/// Generate call to a character comparison for two ssa-values of type
5444
/// `boxchar`.
5545
mlir::Value genCharCompare(fir::FirOpBuilder &builder, mlir::Location loc,

flang/include/flang/Optimizer/Builder/Runtime/Derived.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,5 @@ void genDerivedTypeInitialize(fir::FirOpBuilder &builder, mlir::Location loc,
3030
void genDerivedTypeDestroy(fir::FirOpBuilder &builder, mlir::Location loc,
3131
mlir::Value box);
3232

33-
/// Generate call to derived type assignment runtime routine to
34-
/// assign \p sourceBox to \p destinationBox.
35-
void genDerivedTypeAssign(fir::FirOpBuilder &builder, mlir::Location loc,
36-
mlir::Value destinationBox, mlir::Value sourceBox);
37-
3833
} // namespace fir::runtime
3934
#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_DERIVED_H

flang/lib/Optimizer/Builder/Runtime/Character.cpp

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@ template <typename FN>
2424
static void genCharacterSearch(FN func, fir::FirOpBuilder &builder,
2525
mlir::Location loc, mlir::Value resultBox,
2626
mlir::Value string1Box, mlir::Value string2Box,
27-
mlir::Value backBox, mlir::Value kind);
27+
mlir::Value backBox, mlir::Value kind) {
28+
29+
auto fTy = func.getType();
30+
auto sourceFile = fir::factory::locationToFilename(builder, loc);
31+
auto sourceLine =
32+
fir::factory::locationToLineNo(builder, loc, fTy.getInput(6));
33+
34+
auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox,
35+
string1Box, string2Box, backBox,
36+
kind, sourceFile, sourceLine);
37+
builder.create<fir::CallOp>(loc, func, args);
38+
}
2839

2940
/// Helper function to recover the KIND from the FIR type.
3041
static int discoverKind(mlir::Type ty) {
@@ -45,31 +56,37 @@ static int discoverKind(mlir::Type ty) {
4556
// Lower character operations
4657
//===----------------------------------------------------------------------===//
4758

59+
/// Generate a call to the `ADJUST[L|R]` runtime.
60+
///
61+
/// \p resultBox must be an unallocated allocatable used for the temporary
62+
/// result. \p StringBox must be a fir.box describing the adjustr string
63+
/// argument. The \p adjustFunc should be a mlir::FuncOp for the appropriate
64+
/// runtime entry function.
65+
static void genAdjust(fir::FirOpBuilder &builder, mlir::Location loc,
66+
mlir::Value resultBox, mlir::Value stringBox,
67+
mlir::FuncOp &adjustFunc) {
68+
69+
auto fTy = adjustFunc.getType();
70+
auto sourceLine =
71+
fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
72+
auto sourceFile = fir::factory::locationToFilename(builder, loc);
73+
auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox,
74+
stringBox, sourceFile, sourceLine);
75+
builder.create<fir::CallOp>(loc, adjustFunc, args);
76+
}
77+
4878
void fir::runtime::genAdjustL(fir::FirOpBuilder &builder, mlir::Location loc,
4979
mlir::Value resultBox, mlir::Value stringBox) {
5080
auto adjustFunc =
5181
fir::runtime::getRuntimeFunc<mkRTKey(Adjustl)>(loc, builder);
52-
fir::runtime::genAdjust(builder, loc, resultBox, stringBox, adjustFunc);
82+
genAdjust(builder, loc, resultBox, stringBox, adjustFunc);
5383
}
5484

5585
void fir::runtime::genAdjustR(fir::FirOpBuilder &builder, mlir::Location loc,
5686
mlir::Value resultBox, mlir::Value stringBox) {
5787
auto adjustFunc =
5888
fir::runtime::getRuntimeFunc<mkRTKey(Adjustr)>(loc, builder);
59-
fir::runtime::genAdjust(builder, loc, resultBox, stringBox, adjustFunc);
60-
}
61-
62-
void fir::runtime::genAdjust(fir::FirOpBuilder &builder, mlir::Location loc,
63-
mlir::Value resultBox, mlir::Value stringBox,
64-
mlir::FuncOp &adjustFunc) {
65-
66-
auto fTy = adjustFunc.getType();
67-
auto sourceLine =
68-
fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
69-
auto sourceFile = fir::factory::locationToFilename(builder, loc);
70-
auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox,
71-
stringBox, sourceFile, sourceLine);
72-
builder.create<fir::CallOp>(loc, adjustFunc, args);
89+
genAdjust(builder, loc, resultBox, stringBox, adjustFunc);
7390
}
7491

7592
mlir::Value
@@ -112,7 +129,8 @@ mlir::Value fir::runtime::genCharCompare(fir::FirOpBuilder &builder,
112129
auto allocateIfNotInMemory = [&](mlir::Value base) -> mlir::Value {
113130
if (fir::isa_ref_type(base.getType()))
114131
return base;
115-
auto mem = builder.create<fir::AllocaOp>(loc, base.getType(), /*pinned=*/false);
132+
auto mem =
133+
builder.create<fir::AllocaOp>(loc, base.getType(), /*pinned=*/false);
116134
builder.create<fir::StoreOp>(loc, base, mem);
117135
return mem;
118136
};
@@ -187,9 +205,6 @@ void fir::runtime::genTrim(fir::FirOpBuilder &builder, mlir::Location loc,
187205
builder.create<fir::CallOp>(loc, trimFunc, args);
188206
}
189207

190-
/// Generate call to scan runtime routine.
191-
/// This calls the descriptor based runtime call implementation of the scan
192-
/// intrinsic.
193208
void fir::runtime::genScanDescriptor(fir::FirOpBuilder &builder,
194209
mlir::Location loc, mlir::Value resultBox,
195210
mlir::Value stringBox, mlir::Value setBox,
@@ -199,9 +214,6 @@ void fir::runtime::genScanDescriptor(fir::FirOpBuilder &builder,
199214
kind);
200215
}
201216

202-
/// Generate call to scan runtime routine that is specialized on
203-
/// \param kind.
204-
/// The \param kind represents the kind of the elements in the strings.
205217
mlir::Value fir::runtime::genScan(fir::FirOpBuilder &builder,
206218
mlir::Location loc, int kind,
207219
mlir::Value stringBase, mlir::Value stringLen,
@@ -228,9 +240,6 @@ mlir::Value fir::runtime::genScan(fir::FirOpBuilder &builder,
228240
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
229241
}
230242

231-
/// Generate call to verify runtime routine.
232-
/// This calls the descriptor based runtime call implementation of the
233-
/// verify intrinsic.
234243
void fir::runtime::genVerifyDescriptor(fir::FirOpBuilder &builder,
235244
mlir::Location loc,
236245
mlir::Value resultBox,
@@ -242,9 +251,6 @@ void fir::runtime::genVerifyDescriptor(fir::FirOpBuilder &builder,
242251
kind);
243252
}
244253

245-
/// Generate call to verify runtime routine that is specialized on
246-
/// \param kind.
247-
/// The \param kind represents the kind of the elements in the strings.
248254
mlir::Value fir::runtime::genVerify(fir::FirOpBuilder &builder,
249255
mlir::Location loc, int kind,
250256
mlir::Value stringBase,
@@ -270,23 +276,3 @@ mlir::Value fir::runtime::genVerify(fir::FirOpBuilder &builder,
270276
stringLen, setBase, setLen, back);
271277
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
272278
}
273-
274-
/// Generate calls to string handling intrinsics such as index, scan, and
275-
/// verify. These are the descriptor based implementations that take four
276-
/// arguments (string1, string2, back, kind).
277-
template <typename FN>
278-
static void genCharacterSearch(FN func, fir::FirOpBuilder &builder,
279-
mlir::Location loc, mlir::Value resultBox,
280-
mlir::Value string1Box, mlir::Value string2Box,
281-
mlir::Value backBox, mlir::Value kind) {
282-
283-
auto fTy = func.getType();
284-
auto sourceFile = fir::factory::locationToFilename(builder, loc);
285-
auto sourceLine =
286-
fir::factory::locationToLineNo(builder, loc, fTy.getInput(6));
287-
288-
auto args = fir::runtime::createArguments(builder, loc, fTy, resultBox,
289-
string1Box, string2Box, backBox,
290-
kind, sourceFile, sourceLine);
291-
builder.create<fir::CallOp>(loc, func, args);
292-
}

flang/lib/Optimizer/Builder/Runtime/Derived.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,3 @@ void fir::runtime::genDerivedTypeDestroy(fir::FirOpBuilder &builder,
3333
auto args = fir::runtime::createArguments(builder, loc, fTy, box);
3434
builder.create<fir::CallOp>(loc, func, args);
3535
}
36-
37-
void fir::runtime::genDerivedTypeAssign(fir::FirOpBuilder &builder,
38-
mlir::Location loc,
39-
mlir::Value destinationBox,
40-
mlir::Value sourceBox) {
41-
auto func = fir::runtime::getRuntimeFunc<mkRTKey(Assign)>(loc, builder);
42-
auto fTy = func.getType();
43-
auto sourceFile = fir::factory::locationToFilename(builder, loc);
44-
auto sourceLine =
45-
fir::factory::locationToLineNo(builder, loc, fTy.getInput(3));
46-
auto args = fir::runtime::createArguments(builder, loc, fTy, destinationBox,
47-
sourceBox, sourceFile, sourceLine);
48-
builder.create<fir::CallOp>(loc, func, args);
49-
}

flang/lib/Optimizer/Builder/Runtime/Numeric.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "flang/Optimizer/Builder/Runtime/Numeric.h"
10-
#include "flang/Lower/Todo.h"
1110
#include "flang/Optimizer/Builder/BoxValue.h"
1211
#include "flang/Optimizer/Builder/Character.h"
1312
#include "flang/Optimizer/Builder/FIRBuilder.h"
@@ -234,7 +233,7 @@ mlir::Value fir::runtime::genExponent(fir::FirOpBuilder &builder,
234233
else if (resultType.isInteger(64))
235234
func = fir::runtime::getRuntimeFunc<ForcedExponent16_8>(loc, builder);
236235
} else
237-
TODO(loc, "unsupported real kind in Exponent lowering");
236+
fir::emitFatalError(loc, "unsupported real kind in Exponent lowering");
238237

239238
auto funcTy = func.getType();
240239
llvm::SmallVector<mlir::Value> args = {
@@ -258,7 +257,7 @@ mlir::Value fir::runtime::genFraction(fir::FirOpBuilder &builder,
258257
else if (fltTy.isF128())
259258
func = fir::runtime::getRuntimeFunc<ForcedFraction16>(loc, builder);
260259
else
261-
TODO(loc, "unsupported real kind in Fraction lowering");
260+
fir::emitFatalError(loc, "unsupported real kind in Fraction lowering");
262261

263262
auto funcTy = func.getType();
264263
llvm::SmallVector<mlir::Value> args = {
@@ -317,7 +316,7 @@ mlir::Value fir::runtime::genRRSpacing(fir::FirOpBuilder &builder,
317316
else if (fltTy.isF128())
318317
func = fir::runtime::getRuntimeFunc<ForcedRRSpacing16>(loc, builder);
319318
else
320-
TODO(loc, "unsupported real kind in RRSpacing lowering");
319+
fir::emitFatalError(loc, "unsupported real kind in RRSpacing lowering");
321320

322321
auto funcTy = func.getType();
323322
llvm::SmallVector<mlir::Value> args = {
@@ -366,7 +365,7 @@ mlir::Value fir::runtime::genSetExponent(fir::FirOpBuilder &builder,
366365
else if (fltTy.isF128())
367366
func = fir::runtime::getRuntimeFunc<ForcedSetExponent16>(loc, builder);
368367
else
369-
TODO(loc, "unsupported real kind in Fraction lowering");
368+
fir::emitFatalError(loc, "unsupported real kind in Fraction lowering");
370369

371370
auto funcTy = func.getType();
372371
auto args = fir::runtime::createArguments(builder, loc, funcTy, x, i);
@@ -389,7 +388,7 @@ mlir::Value fir::runtime::genSpacing(fir::FirOpBuilder &builder,
389388
else if (fltTy.isF128())
390389
func = fir::runtime::getRuntimeFunc<ForcedSpacing16>(loc, builder);
391390
else
392-
TODO(loc, "unsupported real kind in Spacing lowering");
391+
fir::emitFatalError(loc, "unsupported real kind in Spacing lowering");
393392

394393
auto funcTy = func.getType();
395394
llvm::SmallVector<mlir::Value> args = {

flang/unittests/Optimizer/Builder/Runtime/RuntimeCallTestBase.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct RuntimeCallTest : public testing::Test {
5050
c16Ty = fir::ComplexType::get(firBuilder->getContext(), 16);
5151

5252
seqTy10 = fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
53+
boxTy = fir::BoxType::get(mlir::NoneType::get(firBuilder->getContext()));
5354
}
5455

5556
mlir::MLIRContext context;
@@ -71,13 +72,14 @@ struct RuntimeCallTest : public testing::Test {
7172
mlir::Type c10Ty;
7273
mlir::Type c16Ty;
7374
mlir::Type seqTy10;
75+
mlir::Type boxTy;
7476
};
7577

7678
/// Check that the \p op is a `fir::CallOp` operation and its name matches
7779
/// \p fctName and the number of arguments is equal to \p nbArgs.
7880
/// Most runtime calls have two additional location arguments added. These are
7981
/// added in this check when \p addLocArgs is true.
80-
static void checkCallOp(mlir::Operation *op, llvm::StringRef fctName,
82+
static inline void checkCallOp(mlir::Operation *op, llvm::StringRef fctName,
8183
unsigned nbArgs, bool addLocArgs = true) {
8284
EXPECT_TRUE(mlir::isa<fir::CallOp>(*op));
8385
auto callOp = mlir::dyn_cast<fir::CallOp>(*op);
@@ -107,7 +109,7 @@ static void checkCallOp(mlir::Operation *op, llvm::StringRef fctName,
107109
/// %arg = fir.convert %result : (i32) -> i16
108110
/// %0 = fir.call @foo(%arg) : (i16) -> i1
109111
/// ```
110-
static void checkCallOpFromResultBox(mlir::Value result,
112+
static inline void checkCallOpFromResultBox(mlir::Value result,
111113
llvm::StringRef fctName, unsigned nbArgs, bool addLocArgs = true) {
112114
EXPECT_TRUE(result.hasOneUse());
113115
const auto &u = result.user_begin();

flang/unittests/Optimizer/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ add_flang_unittest(FlangOptimizerTests
1414
Builder/DoLoopHelperTest.cpp
1515
Builder/FIRBuilderTest.cpp
1616
Builder/Runtime/AssignTest.cpp
17+
Builder/Runtime/CharacterTest.cpp
18+
Builder/Runtime/DerivedTest.cpp
19+
Builder/Runtime/NumericTest.cpp
1720
Builder/Runtime/RaggedTest.cpp
1821
Builder/Runtime/ReductionTest.cpp
1922
Builder/Runtime/TransformationalTest.cpp

0 commit comments

Comments
 (0)