Skip to content

Commit 61c5c59

Browse files
committed
[flang][NFC] add convertToX functions to HLFIRTools
These will be useful for sharing code with intrinsic argument processing when lowering hlfir transformational intrinsic operations to FIR in the BufferizeHLFIR pass. Differential Revision: https://reviews.llvm.org/D143503
1 parent 5ae99be commit 61c5c59

File tree

3 files changed

+85
-40
lines changed

3 files changed

+85
-40
lines changed

flang/include/flang/Optimizer/Builder/HLFIRTools.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,17 @@ hlfir::YieldElementOp inlineElementalOp(mlir::Location loc,
349349
hlfir::ElementalOp elemental,
350350
mlir::ValueRange oneBasedIndices);
351351

352+
std::pair<fir::ExtendedValue, std::optional<hlfir::CleanupFunction>>
353+
convertToValue(mlir::Location loc, fir::FirOpBuilder &builder,
354+
const hlfir::Entity &entity);
355+
356+
std::pair<fir::ExtendedValue, std::optional<hlfir::CleanupFunction>>
357+
convertToAddress(mlir::Location loc, fir::FirOpBuilder &builder,
358+
const hlfir::Entity &entity, mlir::Type targetType);
359+
360+
std::pair<fir::BoxValue, std::optional<hlfir::CleanupFunction>>
361+
convertToBox(mlir::Location loc, fir::FirOpBuilder &builder,
362+
const hlfir::Entity &entity, mlir::Type targetType);
352363
} // namespace hlfir
353364

354365
#endif // FORTRAN_OPTIMIZER_BUILDER_HLFIRTOOLS_H

flang/lib/Lower/ConvertExprToHLFIR.cpp

Lines changed: 13 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,25 +1256,15 @@ hlfir::EntityWithAttributes Fortran::lower::convertExprToHLFIR(
12561256
return HlfirBuilder(loc, converter, symMap, stmtCtx).gen(expr);
12571257
}
12581258

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-
12681259
fir::BoxValue Fortran::lower::convertToBox(
12691260
mlir::Location loc, Fortran::lower::AbstractConverter &converter,
12701261
hlfir::Entity entity, Fortran::lower::StatementContext &stmtCtx,
12711262
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;
12781268
}
12791269
fir::BoxValue Fortran::lower::convertExprToBox(
12801270
mlir::Location loc, Fortran::lower::AbstractConverter &converter,
@@ -1291,11 +1281,10 @@ fir::ExtendedValue Fortran::lower::convertToAddress(
12911281
hlfir::Entity entity, Fortran::lower::StatementContext &stmtCtx,
12921282
mlir::Type fortranType) {
12931283
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);
12991288
return exv;
13001289
}
13011290

@@ -1313,26 +1302,10 @@ fir::ExtendedValue Fortran::lower::convertToValue(
13131302
mlir::Location loc, Fortran::lower::AbstractConverter &converter,
13141303
hlfir::Entity entity, Fortran::lower::StatementContext &stmtCtx) {
13151304
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;
13361309
}
13371310

13381311
fir::ExtendedValue Fortran::lower::convertExprToValue(

flang/lib/Optimizer/Builder/HLFIRTools.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,3 +818,64 @@ hlfir::translateToExtendedValue(mlir::Location loc, fir::FirOpBuilder &builder,
818818
}
819819
return {{static_cast<mlir::Value>(entity)}, {}};
820820
}
821+
822+
std::pair<fir::ExtendedValue, std::optional<hlfir::CleanupFunction>>
823+
hlfir::convertToValue(mlir::Location loc, fir::FirOpBuilder &builder,
824+
const hlfir::Entity &entity) {
825+
auto [exv, cleanup] = translateToExtendedValue(loc, builder, entity);
826+
// Load scalar references to integer, logical, real, or complex value
827+
// to an mlir value, dereference allocatable and pointers, and get rid
828+
// of fir.box that are not needed or create a copy into contiguous memory.
829+
exv = exv.match(
830+
[&](const fir::UnboxedValue &box) -> fir::ExtendedValue {
831+
if (mlir::Type elementType = fir::dyn_cast_ptrEleTy(box.getType()))
832+
if (fir::isa_trivial(elementType))
833+
return builder.create<fir::LoadOp>(loc, box);
834+
return box;
835+
},
836+
[&](const fir::CharBoxValue &box) -> fir::ExtendedValue { return box; },
837+
[&](const fir::ArrayBoxValue &box) -> fir::ExtendedValue { return box; },
838+
[&](const fir::CharArrayBoxValue &box) -> fir::ExtendedValue {
839+
return box;
840+
},
841+
[&](const auto &) -> fir::ExtendedValue {
842+
TODO(loc, "lower descriptor designator to HLFIR value");
843+
});
844+
return {exv, cleanup};
845+
}
846+
847+
static fir::ExtendedValue placeTrivialInMemory(mlir::Location loc,
848+
fir::FirOpBuilder &builder,
849+
mlir::Value val,
850+
mlir::Type targetType) {
851+
auto temp = builder.createTemporary(loc, targetType);
852+
if (targetType != val.getType())
853+
builder.createStoreWithConvert(loc, val, temp);
854+
else
855+
builder.create<fir::StoreOp>(loc, val, temp);
856+
return temp;
857+
}
858+
859+
std::pair<fir::BoxValue, std::optional<hlfir::CleanupFunction>>
860+
hlfir::convertToBox(mlir::Location loc, fir::FirOpBuilder &builder,
861+
const hlfir::Entity &entity, mlir::Type targetType) {
862+
auto [exv, cleanup] = translateToExtendedValue(loc, builder, entity);
863+
mlir::Value base = fir::getBase(exv);
864+
if (fir::isa_trivial(base.getType()))
865+
exv = placeTrivialInMemory(loc, builder, base, targetType);
866+
fir::BoxValue box = fir::factory::createBoxValue(builder, loc, exv);
867+
return {box, cleanup};
868+
}
869+
870+
std::pair<fir::ExtendedValue, std::optional<hlfir::CleanupFunction>>
871+
hlfir::convertToAddress(mlir::Location loc, fir::FirOpBuilder &builder,
872+
const hlfir::Entity &entity, mlir::Type targetType) {
873+
hlfir::Entity derefedEntity =
874+
hlfir::derefPointersAndAllocatables(loc, builder, entity);
875+
auto [exv, cleanup] =
876+
hlfir::translateToExtendedValue(loc, builder, derefedEntity);
877+
mlir::Value base = fir::getBase(exv);
878+
if (fir::isa_trivial(base.getType()))
879+
exv = placeTrivialInMemory(loc, builder, base, targetType);
880+
return {exv, cleanup};
881+
}

0 commit comments

Comments
 (0)