@@ -1256,25 +1256,15 @@ hlfir::EntityWithAttributes Fortran::lower::convertExprToHLFIR(
1256
1256
return HlfirBuilder (loc, converter, symMap, stmtCtx).gen (expr);
1257
1257
}
1258
1258
1259
- static fir::ExtendedValue placeTrivialInMemory (mlir::Location loc,
1260
- fir::FirOpBuilder &builder,
1261
- mlir::Value val,
1262
- mlir::Type fortranType) {
1263
- auto temp = builder.createTemporary (loc, fortranType);
1264
- builder.createStoreWithConvert (loc, val, temp);
1265
- return temp;
1266
- }
1267
-
1268
1259
fir::BoxValue Fortran::lower::convertToBox (
1269
1260
mlir::Location loc, Fortran::lower::AbstractConverter &converter,
1270
1261
hlfir::Entity entity, Fortran::lower::StatementContext &stmtCtx,
1271
1262
mlir::Type fortranType) {
1272
- auto exv = Fortran::lower::translateToExtendedValue (
1273
- loc, converter.getFirOpBuilder (), entity, stmtCtx);
1274
- if (fir::isa_trivial (fir::getBase (exv).getType ()))
1275
- exv = placeTrivialInMemory (loc, converter.getFirOpBuilder (),
1276
- fir::getBase (exv), fortranType);
1277
- return fir::factory::createBoxValue (converter.getFirOpBuilder (), loc, exv);
1263
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
1264
+ auto [exv, cleanup] = hlfir::convertToBox (loc, builder, entity, fortranType);
1265
+ if (cleanup)
1266
+ stmtCtx.attachCleanup (*cleanup);
1267
+ return exv;
1278
1268
}
1279
1269
fir::BoxValue Fortran::lower::convertExprToBox (
1280
1270
mlir::Location loc, Fortran::lower::AbstractConverter &converter,
@@ -1291,11 +1281,10 @@ fir::ExtendedValue Fortran::lower::convertToAddress(
1291
1281
hlfir::Entity entity, Fortran::lower::StatementContext &stmtCtx,
1292
1282
mlir::Type fortranType) {
1293
1283
fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
1294
- entity = hlfir::derefPointersAndAllocatables (loc, builder, entity);
1295
- fir::ExtendedValue exv =
1296
- Fortran::lower::translateToExtendedValue (loc, builder, entity, stmtCtx);
1297
- if (fir::isa_trivial (fir::getBase (exv).getType ()))
1298
- return placeTrivialInMemory (loc, builder, fir::getBase (exv), fortranType);
1284
+ auto [exv, cleanup] =
1285
+ hlfir::convertToAddress (loc, builder, entity, fortranType);
1286
+ if (cleanup)
1287
+ stmtCtx.attachCleanup (*cleanup);
1299
1288
return exv;
1300
1289
}
1301
1290
@@ -1313,26 +1302,10 @@ fir::ExtendedValue Fortran::lower::convertToValue(
1313
1302
mlir::Location loc, Fortran::lower::AbstractConverter &converter,
1314
1303
hlfir::Entity entity, Fortran::lower::StatementContext &stmtCtx) {
1315
1304
auto &builder = converter.getFirOpBuilder ();
1316
- fir::ExtendedValue exv =
1317
- Fortran::lower::translateToExtendedValue (loc, builder, entity, stmtCtx);
1318
- // Load scalar references to integer, logical, real, or complex value
1319
- // to an mlir value, dereference allocatable and pointers, and get rid
1320
- // of fir.box that are not needed or create a copy into contiguous memory.
1321
- return exv.match (
1322
- [&](const fir::UnboxedValue &box) -> fir::ExtendedValue {
1323
- if (mlir::Type elementType = fir::dyn_cast_ptrEleTy (box.getType ()))
1324
- if (fir::isa_trivial (elementType))
1325
- return builder.create <fir::LoadOp>(loc, box);
1326
- return box;
1327
- },
1328
- [&](const fir::CharBoxValue &box) -> fir::ExtendedValue { return box; },
1329
- [&](const fir::ArrayBoxValue &box) -> fir::ExtendedValue { return box; },
1330
- [&](const fir::CharArrayBoxValue &box) -> fir::ExtendedValue {
1331
- return box;
1332
- },
1333
- [&](const auto &) -> fir::ExtendedValue {
1334
- TODO (loc, " lower descriptor designator to HLFIR value" );
1335
- });
1305
+ auto [exv, cleanup] = hlfir::convertToValue (loc, builder, entity);
1306
+ if (cleanup)
1307
+ stmtCtx.attachCleanup (*cleanup);
1308
+ return exv;
1336
1309
}
1337
1310
1338
1311
fir::ExtendedValue Fortran::lower::convertExprToValue (
0 commit comments