Skip to content

Commit 10f7801

Browse files
authored
[flang] Move genCommonBlockMember from OpenMP to ConvertVariable, NFC (#74488)
The function `genCommonBlockMember` is not specific to OpenMP, and it could very well be a common utility. Move it to ConvertVariable.cpp where it logically belongs.
1 parent 02c218c commit 10f7801

File tree

3 files changed

+45
-46
lines changed

3 files changed

+45
-46
lines changed

flang/include/flang/Lower/ConvertVariable.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "flang/Lower/Support/Utils.h"
2121
#include "flang/Optimizer/Dialect/FIRAttr.h"
22+
#include "flang/Semantics/symbol.h"
2223
#include "mlir/IR/Value.h"
2324
#include "llvm/ADT/DenseMap.h"
2425

@@ -29,7 +30,12 @@ class GlobalOp;
2930
class FortranVariableFlagsAttr;
3031
} // namespace fir
3132

32-
namespace Fortran ::lower {
33+
namespace Fortran {
34+
namespace semantics {
35+
class Scope;
36+
} // namespace semantics
37+
38+
namespace lower {
3339
class AbstractConverter;
3440
class CallerInterface;
3541
class StatementContext;
@@ -66,6 +72,14 @@ void defineCommonBlocks(
6672
const std::vector<std::pair<semantics::SymbolRef, std::size_t>>
6773
&commonBlocks);
6874

75+
/// The COMMON block is a global structure. \p commonValue is the base address
76+
/// of the COMMON block. As the offset from the symbol \p sym, generate the
77+
/// COMMON block member value (commonValue + offset) for the symbol.
78+
mlir::Value genCommonBlockMember(AbstractConverter &converter,
79+
mlir::Location loc,
80+
const Fortran::semantics::Symbol &sym,
81+
mlir::Value commonValue);
82+
6983
/// Lower a symbol attributes given an optional storage \p and add it to the
7084
/// provided symbol map. If \preAlloc is not provided, a temporary storage will
7185
/// be allocated. This is a low level function that should only be used if
@@ -138,5 +152,6 @@ void genDeclareSymbol(Fortran::lower::AbstractConverter &converter,
138152
/// Cray pointer symbol. Assert if the pointer symbol cannot be found.
139153
Fortran::semantics::SymbolRef getCrayPointer(Fortran::semantics::SymbolRef sym);
140154

141-
} // namespace Fortran::lower
155+
} // namespace lower
156+
} // namespace Fortran
142157
#endif // FORTRAN_LOWER_CONVERT_VARIABLE_H

flang/lib/Lower/ConvertVariable.cpp

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,28 @@ void Fortran::lower::defineCommonBlocks(
13311331
finalizeCommonBlockDefinition(loc, converter, global, cmnBlkMems);
13321332
}
13331333

1334+
mlir::Value Fortran::lower::genCommonBlockMember(
1335+
Fortran::lower::AbstractConverter &converter, mlir::Location loc,
1336+
const Fortran::semantics::Symbol &sym, mlir::Value commonValue) {
1337+
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
1338+
1339+
std::size_t byteOffset = sym.GetUltimate().offset();
1340+
mlir::IntegerType i8Ty = builder.getIntegerType(8);
1341+
mlir::Type i8Ptr = builder.getRefType(i8Ty);
1342+
mlir::Type seqTy = builder.getRefType(builder.getVarLenSeqTy(i8Ty));
1343+
mlir::Value base = builder.createConvert(loc, seqTy, commonValue);
1344+
1345+
mlir::Value offs =
1346+
builder.createIntegerConstant(loc, builder.getIndexType(), byteOffset);
1347+
mlir::Value varAddr = builder.create<fir::CoordinateOp>(
1348+
loc, i8Ptr, base, mlir::ValueRange{offs});
1349+
mlir::Type symType = converter.genType(sym);
1350+
1351+
return Fortran::semantics::FindEquivalenceSet(sym) != nullptr
1352+
? castAliasToPointer(builder, loc, symType, varAddr)
1353+
: builder.createConvert(loc, builder.getRefType(symType), varAddr);
1354+
}
1355+
13341356
/// The COMMON block is a global structure. `var` will be at some offset
13351357
/// within the COMMON block. Adds the address of `var` (COMMON + offset) to
13361358
/// the symbol map.
@@ -1353,21 +1375,8 @@ static void instantiateCommon(Fortran::lower::AbstractConverter &converter,
13531375

13541376
symMap.addSymbol(common, commonAddr);
13551377
}
1356-
std::size_t byteOffset = varSym.GetUltimate().offset();
1357-
mlir::IntegerType i8Ty = builder.getIntegerType(8);
1358-
mlir::Type i8Ptr = builder.getRefType(i8Ty);
1359-
mlir::Type seqTy = builder.getRefType(builder.getVarLenSeqTy(i8Ty));
1360-
mlir::Value base = builder.createConvert(loc, seqTy, commonAddr);
1361-
mlir::Value offs =
1362-
builder.createIntegerConstant(loc, builder.getIndexType(), byteOffset);
1363-
auto varAddr = builder.create<fir::CoordinateOp>(loc, i8Ptr, base,
1364-
mlir::ValueRange{offs});
1365-
mlir::Type symType = converter.genType(var.getSymbol());
1366-
mlir::Value local;
1367-
if (Fortran::semantics::FindEquivalenceSet(var.getSymbol()) != nullptr)
1368-
local = castAliasToPointer(builder, loc, symType, varAddr);
1369-
else
1370-
local = builder.createConvert(loc, builder.getRefType(symType), varAddr);
1378+
1379+
mlir::Value local = genCommonBlockMember(converter, loc, varSym, commonAddr);
13711380
Fortran::lower::StatementContext stmtCtx;
13721381
mapSymbolAttributes(converter, var, symMap, stmtCtx, local);
13731382
}

flang/lib/Lower/OpenMP.cpp

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,31 +1959,6 @@ static mlir::Operation *getCompareFromReductionOp(mlir::Operation *reductionOp,
19591959
return nullptr;
19601960
}
19611961

1962-
/// The COMMON block is a global structure. \p commonValue is the base address
1963-
/// of the COMMON block. As the offset from the symbol \p sym, generate the
1964-
/// COMMON block member value (commonValue + offset) for the symbol.
1965-
/// FIXME: Share the code with `instantiateCommon` in ConvertVariable.cpp.
1966-
static mlir::Value
1967-
genCommonBlockMember(Fortran::lower::AbstractConverter &converter,
1968-
const Fortran::semantics::Symbol &sym,
1969-
mlir::Value commonValue) {
1970-
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1971-
mlir::Location currentLocation = converter.getCurrentLocation();
1972-
mlir::IntegerType i8Ty = firOpBuilder.getIntegerType(8);
1973-
mlir::Type i8Ptr = firOpBuilder.getRefType(i8Ty);
1974-
mlir::Type seqTy = firOpBuilder.getRefType(firOpBuilder.getVarLenSeqTy(i8Ty));
1975-
mlir::Value base =
1976-
firOpBuilder.createConvert(currentLocation, seqTy, commonValue);
1977-
std::size_t byteOffset = sym.GetUltimate().offset();
1978-
mlir::Value offs = firOpBuilder.createIntegerConstant(
1979-
currentLocation, firOpBuilder.getIndexType(), byteOffset);
1980-
mlir::Value varAddr = firOpBuilder.create<fir::CoordinateOp>(
1981-
currentLocation, i8Ptr, base, mlir::ValueRange{offs});
1982-
mlir::Type symType = converter.genType(sym);
1983-
return firOpBuilder.createConvert(currentLocation,
1984-
firOpBuilder.getRefType(symType), varAddr);
1985-
}
1986-
19871962
// Get the extended value for \p val by extracting additional variable
19881963
// information from \p base.
19891964
static fir::ExtendedValue getExtendedValue(fir::ExtendedValue base,
@@ -2049,8 +2024,8 @@ static void threadPrivatizeVars(Fortran::lower::AbstractConverter &converter,
20492024
converter.bindSymbol(*common, commonThreadprivateValue);
20502025
commonSyms.insert(common);
20512026
}
2052-
symThreadprivateValue =
2053-
genCommonBlockMember(converter, *sym, commonThreadprivateValue);
2027+
symThreadprivateValue = Fortran::lower::genCommonBlockMember(
2028+
converter, currentLocation, *sym, commonThreadprivateValue);
20542029
} else {
20552030
symThreadprivateValue = genThreadprivateOp(*sym);
20562031
}
@@ -3554,8 +3529,8 @@ void Fortran::lower::genThreadprivateOp(
35543529
currentLocation, commonValue.getType(), commonValue);
35553530
converter.bindSymbol(*common, commonThreadprivateValue);
35563531
// Generate the threadprivate value for the common block member.
3557-
symThreadprivateValue =
3558-
genCommonBlockMember(converter, sym, commonThreadprivateValue);
3532+
symThreadprivateValue = genCommonBlockMember(converter, currentLocation,
3533+
sym, commonThreadprivateValue);
35593534
} else if (!var.isGlobal()) {
35603535
// Non-global variable which can be in threadprivate directive must be one
35613536
// variable in main program, and it has implicit SAVE attribute. Take it as

0 commit comments

Comments
 (0)