@@ -81,24 +81,24 @@ class VectorSubscriptBoxBuilder {
81
81
mlir::Type gen (const Fortran::evaluate::Substring &substring) {
82
82
// StaticDataObject::Pointer bases are constants and cannot be
83
83
// subscripted, so the base must be a DataRef here.
84
- auto baseElementType =
84
+ mlir::Type baseElementType =
85
85
gen (std::get<Fortran::evaluate::DataRef>(substring.parent ()));
86
- auto &builder = converter.getFirOpBuilder ();
87
- auto idxTy = builder.getIndexType ();
88
- auto lb = genScalarValue (substring.lower ());
86
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
87
+ mlir::Type idxTy = builder.getIndexType ();
88
+ mlir::Value lb = genScalarValue (substring.lower ());
89
89
substringBounds.emplace_back (builder.createConvert (loc, idxTy, lb));
90
90
if (const auto &ubExpr = substring.upper ()) {
91
- auto ub = genScalarValue (*ubExpr);
91
+ mlir::Value ub = genScalarValue (*ubExpr);
92
92
substringBounds.emplace_back (builder.createConvert (loc, idxTy, ub));
93
93
}
94
94
return baseElementType;
95
95
}
96
96
97
97
mlir::Type gen (const Fortran::evaluate::ComplexPart &complexPart) {
98
98
auto complexType = gen (complexPart.complex ());
99
- auto &builder = converter.getFirOpBuilder ();
100
- auto i32Ty = builder.getI32Type (); // llvm's GEP requires i32
101
- auto offset = builder.createIntegerConstant (
99
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
100
+ mlir::Type i32Ty = builder.getI32Type (); // llvm's GEP requires i32
101
+ mlir::Value offset = builder.createIntegerConstant (
102
102
loc, i32Ty,
103
103
complexPart.part () == Fortran::evaluate::ComplexPart::Part::RE ? 0 : 1 );
104
104
componentPath.emplace_back (offset);
@@ -107,19 +107,19 @@ class VectorSubscriptBoxBuilder {
107
107
108
108
mlir::Type gen (const Fortran::evaluate::Component &component) {
109
109
auto recTy = gen (component.base ()).cast <fir::RecordType>();
110
- const auto &componentSymbol = component.GetLastSymbol ();
110
+ const Fortran::semantics::Symbol &componentSymbol = component.GetLastSymbol ();
111
111
// Parent components will not be found here, they are not part
112
112
// of the FIR type and cannot be used in the path yet.
113
113
if (componentSymbol.test (Fortran::semantics::Symbol::Flag::ParentComp))
114
114
TODO (loc, " Reference to parent component" );
115
- auto fldTy = fir::FieldType::get (&converter.getMLIRContext ());
116
- auto componentName = toStringRef (componentSymbol.name ());
115
+ mlir::Type fldTy = fir::FieldType::get (&converter.getMLIRContext ());
116
+ llvm::StringRef componentName = toStringRef (componentSymbol.name ());
117
117
// Parameters threading in field_index is not yet very clear. We only
118
118
// have the ones of the ranked array ref at hand, but it looks like
119
119
// the fir.field_index expects the one of the direct base.
120
120
if (recTy.getNumLenParams () != 0 )
121
121
TODO (loc, " threading length parameters in field index op" );
122
- auto &builder = converter.getFirOpBuilder ();
122
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
123
123
componentPath.emplace_back (builder.create <fir::FieldIndexOp>(
124
124
loc, fldTy, componentName, recTy, /* typeParams*/ llvm::None));
125
125
return fir::unwrapSequenceType (recTy.getType (componentName));
@@ -142,8 +142,8 @@ class VectorSubscriptBoxBuilder {
142
142
// This is a scalar ArrayRef (only scalar indexes), collect the indexes and
143
143
// visit the base that must contain another arrayRef with the vector
144
144
// subscript.
145
- auto elementType = gen (namedEntityToDataRef (arrayRef.base ()));
146
- for (const auto &subscript : arrayRef.subscript ()) {
145
+ mlir::Type elementType = gen (namedEntityToDataRef (arrayRef.base ()));
146
+ for (const Fortran::evaluate::Subscript &subscript : arrayRef.subscript ()) {
147
147
const auto &expr =
148
148
std::get<Fortran::evaluate::IndirectSubscriptIntegerExpr>(
149
149
subscript.u );
@@ -158,12 +158,13 @@ class VectorSubscriptBoxBuilder {
158
158
mlir::Type genRankedArrayRefSubscriptAndBase (
159
159
const Fortran::evaluate::ArrayRef &arrayRef) {
160
160
// Lower the save the base
161
- auto baseExpr = namedEntityToExpr (arrayRef.base ());
161
+ Fortran::evaluate::Expr<Fortran::evaluate::SomeType> baseExpr
162
+ = namedEntityToExpr (arrayRef.base ());
162
163
loweredBase = converter.genExprAddr (baseExpr, stmtCtx);
163
164
// Lower and save the subscripts
164
- auto &builder = converter.getFirOpBuilder ();
165
- auto idxTy = builder.getIndexType ();
166
- auto one = builder.createIntegerConstant (loc, idxTy, 1 );
165
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
166
+ mlir::Type idxTy = builder.getIndexType ();
167
+ mlir::Value one = builder.createIntegerConstant (loc, idxTy, 1 );
167
168
for (const auto &subscript : llvm::enumerate (arrayRef.subscript ())) {
168
169
std::visit (
169
170
Fortran::common::visitors{
@@ -178,7 +179,7 @@ class VectorSubscriptBoxBuilder {
178
179
// temp array value.
179
180
auto vector = converter.genExprAddr (
180
181
ignoreEvConvert (expr.value ()), stmtCtx);
181
- auto size =
182
+ mlir::Value size =
182
183
fir::factory::readExtent (builder, loc, vector, /* dim=*/ 0 );
183
184
size = builder.createConvert (loc, idxTy, size);
184
185
loweredSubscripts.emplace_back (
@@ -199,7 +200,7 @@ class VectorSubscriptBoxBuilder {
199
200
subscript.index ());
200
201
lb = builder.createConvert (loc, idxTy, lb);
201
202
ub = builder.createConvert (loc, idxTy, ub);
202
- auto stride = genScalarValue (triplet.stride ());
203
+ mlir::Value stride = genScalarValue (triplet.stride ());
203
204
stride = builder.createConvert (loc, idxTy, stride);
204
205
loweredSubscripts.emplace_back (LoweredTriplet{lb, ub, stride});
205
206
},
@@ -257,8 +258,8 @@ mlir::Value Fortran::lower::VectorSubscriptBox::loopOverElementsBase(
257
258
fir::FirOpBuilder &builder, mlir::Location loc,
258
259
const Generator &elementalGenerator,
259
260
[[maybe_unused]] mlir::Value initialCondition) {
260
- auto shape = builder.createShape (loc, loweredBase);
261
- auto slice = createSlice (builder, loc);
261
+ mlir::Value shape = builder.createShape (loc, loweredBase);
262
+ mlir::Value slice = createSlice (builder, loc);
262
263
263
264
// Create loop nest for triplets and vector subscripts in column
264
265
// major order.
@@ -286,7 +287,8 @@ mlir::Value Fortran::lower::VectorSubscriptBox::loopOverElementsBase(
286
287
assert (outerLoop && !inductionVariables.empty () &&
287
288
" at least one loop should be created" );
288
289
289
- auto elem = getElementAt (builder, loc, shape, slice, inductionVariables);
290
+ fir::ExtendedValue elem =
291
+ getElementAt (builder, loc, shape, slice, inductionVariables);
290
292
291
293
if constexpr (std::is_same_v<LoopType, fir::IterWhileOp>) {
292
294
auto res = elementalGenerator (elem);
@@ -320,11 +322,11 @@ mlir::Value Fortran::lower::VectorSubscriptBox::loopOverElementsWhile(
320
322
mlir::Value
321
323
Fortran::lower::VectorSubscriptBox::createSlice (fir::FirOpBuilder &builder,
322
324
mlir::Location loc) {
323
- auto idxTy = builder.getIndexType ();
325
+ mlir::Type idxTy = builder.getIndexType ();
324
326
llvm::SmallVector<mlir::Value> triples;
325
- auto one = builder.createIntegerConstant (loc, idxTy, 1 );
327
+ mlir::Value one = builder.createIntegerConstant (loc, idxTy, 1 );
326
328
auto undef = builder.create <fir::UndefOp>(loc, idxTy);
327
- for (const auto &subscript : loweredSubscripts)
329
+ for (const LoweredSubscript &subscript : loweredSubscripts)
328
330
std::visit (Fortran::common::visitors{
329
331
[&](const LoweredTriplet &triplet) {
330
332
triples.emplace_back (triplet.lb );
@@ -349,20 +351,20 @@ Fortran::lower::VectorSubscriptBox::createSlice(fir::FirOpBuilder &builder,
349
351
llvm::SmallVector<std::tuple<mlir::Value, mlir::Value, mlir::Value>>
350
352
Fortran::lower::VectorSubscriptBox::genLoopBounds (fir::FirOpBuilder &builder,
351
353
mlir::Location loc) {
352
- auto idxTy = builder.getIndexType ();
353
- auto one = builder.createIntegerConstant (loc, idxTy, 1 );
354
- auto zero = builder.createIntegerConstant (loc, idxTy, 0 );
354
+ mlir::Type idxTy = builder.getIndexType ();
355
+ mlir::Value one = builder.createIntegerConstant (loc, idxTy, 1 );
356
+ mlir::Value zero = builder.createIntegerConstant (loc, idxTy, 0 );
355
357
llvm::SmallVector<std::tuple<mlir::Value, mlir::Value, mlir::Value>> bounds;
356
- auto dimension = loweredSubscripts.size ();
357
- for (const auto &subscript : llvm::reverse (loweredSubscripts)) {
358
+ size_t dimension = loweredSubscripts.size ();
359
+ for (const LoweredSubscript &subscript : llvm::reverse (loweredSubscripts)) {
358
360
--dimension;
359
361
if (std::holds_alternative<mlir::Value>(subscript))
360
362
continue ;
361
363
mlir::Value lb, ub, step;
362
364
if (const auto *triplet = std::get_if<LoweredTriplet>(&subscript)) {
363
- auto extent = builder.genExtentFromTriplet (loc, triplet->lb , triplet-> ub ,
364
- triplet->stride , idxTy);
365
- auto baseLb = fir::factory::readLowerBound (builder, loc, loweredBase,
365
+ mlir::Value extent = builder.genExtentFromTriplet (loc, triplet->lb ,
366
+ triplet-> ub , triplet->stride , idxTy);
367
+ mlir::Value baseLb = fir::factory::readLowerBound (builder, loc, loweredBase,
366
368
dimension, one);
367
369
baseLb = builder.createConvert (loc, idxTy, baseLb);
368
370
lb = baseLb;
@@ -384,20 +386,20 @@ fir::ExtendedValue Fortran::lower::VectorSubscriptBox::getElementAt(
384
386
fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value shape,
385
387
mlir::Value slice, mlir::ValueRange inductionVariables) {
386
388
// / Generate the indexes for the array_coor inside the loops.
387
- auto idxTy = builder.getIndexType ();
389
+ mlir::Type idxTy = builder.getIndexType ();
388
390
llvm::SmallVector<mlir::Value> indexes;
389
- auto inductionIdx = inductionVariables.size () - 1 ;
390
- for (const auto &subscript : loweredSubscripts)
391
+ size_t inductionIdx = inductionVariables.size () - 1 ;
392
+ for (const LoweredSubscript &subscript : loweredSubscripts)
391
393
std::visit (Fortran::common::visitors{
392
394
[&](const LoweredTriplet &triplet) {
393
395
indexes.emplace_back (inductionVariables[inductionIdx--]);
394
396
},
395
397
[&](const LoweredVectorSubscript &vector) {
396
- auto vecIndex = inductionVariables[inductionIdx--];
397
- auto vecBase = fir::getBase (vector.vector );
398
- auto vecEleTy = fir::unwrapSequenceType (
398
+ mlir::Value vecIndex = inductionVariables[inductionIdx--];
399
+ mlir::Value vecBase = fir::getBase (vector.vector );
400
+ mlir::Type vecEleTy = fir::unwrapSequenceType (
399
401
fir::unwrapPassByRefType (vecBase.getType ()));
400
- auto refTy = builder.getRefType (vecEleTy);
402
+ mlir::Type refTy = builder.getRefType (vecEleTy);
401
403
auto vecEltRef = builder.create <fir::CoordinateOp>(
402
404
loc, refTy, vecBase, vecIndex);
403
405
auto vecElt =
@@ -410,14 +412,14 @@ fir::ExtendedValue Fortran::lower::VectorSubscriptBox::getElementAt(
410
412
},
411
413
},
412
414
subscript);
413
- auto refTy = builder.getRefType (getElementType ());
415
+ mlir::Type refTy = builder.getRefType (getElementType ());
414
416
auto elementAddr = builder.create <fir::ArrayCoorOp>(
415
417
loc, refTy, fir::getBase (loweredBase), shape, slice, indexes,
416
418
fir::getTypeParams (loweredBase));
417
- auto element = fir::factory::arraySectionElementToExtendedValue (
419
+ fir::ExtendedValue element = fir::factory::arraySectionElementToExtendedValue (
418
420
builder, loc, loweredBase, elementAddr, slice);
419
421
if (!substringBounds.empty ()) {
420
- auto *charBox = element.getCharBox ();
422
+ const fir::CharBoxValue *charBox = element.getCharBox ();
421
423
assert (charBox && " substring requires CharBox base" );
422
424
fir::factory::CharacterExprHelper helper{builder, loc};
423
425
return helper.createSubstring (*charBox, substringBounds);
0 commit comments