Skip to content

Commit d671ebe

Browse files
authored
[Flang][Lower] NFC: Replace SmallVector with more suitable alternatives (#85227)
In this patch some uses of `llvm::SmallVector` in Flang's lowering to MLIR are replaced by other types (i.e. `llvm::ArrayRef` and `llvm::SmallVectorImpl`) which are intended for these uses. This generally prevents relying on always passing small vectors with a particular number of elements in the stack.
1 parent d0829fb commit d671ebe

File tree

3 files changed

+34
-35
lines changed

3 files changed

+34
-35
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ class TypeInfo {
577577
}
578578

579579
// Returns the shape of array types.
580-
const llvm::SmallVector<int64_t> &getShape() const { return shape; }
580+
llvm::ArrayRef<int64_t> getShape() const { return shape; }
581581

582582
// Is the type inside a box?
583583
bool isBox() const { return inBox; }
@@ -788,8 +788,8 @@ bool ClauseProcessor::processLink(
788788
mlir::omp::MapInfoOp
789789
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
790790
mlir::Value baseAddr, mlir::Value varPtrPtr, std::string name,
791-
mlir::SmallVector<mlir::Value> bounds,
792-
mlir::SmallVector<mlir::Value> members, uint64_t mapType,
791+
llvm::ArrayRef<mlir::Value> bounds,
792+
llvm::ArrayRef<mlir::Value> members, uint64_t mapType,
793793
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
794794
bool isVal) {
795795
if (auto boxTy = baseAddr.getType().dyn_cast<fir::BaseBoxType>()) {

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,9 @@ struct OpWithBodyGenInfo {
287287
return *this;
288288
}
289289

290-
OpWithBodyGenInfo &
291-
setReductions(llvm::SmallVector<const Fortran::semantics::Symbol *> *value1,
292-
llvm::SmallVector<mlir::Type> *value2) {
290+
OpWithBodyGenInfo &setReductions(
291+
llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> *value1,
292+
llvm::SmallVectorImpl<mlir::Type> *value2) {
293293
reductionSymbols = value1;
294294
reductionTypes = value2;
295295
return *this;
@@ -317,10 +317,10 @@ struct OpWithBodyGenInfo {
317317
/// [in] if provided, processes the construct's data-sharing attributes.
318318
DataSharingProcessor *dsp = nullptr;
319319
/// [in] if provided, list of reduction symbols
320-
llvm::SmallVector<const Fortran::semantics::Symbol *> *reductionSymbols =
320+
llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> *reductionSymbols =
321321
nullptr;
322322
/// [in] if provided, list of reduction types
323-
llvm::SmallVector<mlir::Type> *reductionTypes = nullptr;
323+
llvm::SmallVectorImpl<mlir::Type> *reductionTypes = nullptr;
324324
/// [in] if provided, emits the op's region entry. Otherwise, an emtpy block
325325
/// is created in the region.
326326
GenOMPRegionEntryCBFn genRegionEntryCB = nullptr;
@@ -465,11 +465,9 @@ static void genBodyOfTargetDataOp(
465465
Fortran::lower::AbstractConverter &converter,
466466
Fortran::semantics::SemanticsContext &semaCtx,
467467
Fortran::lower::pft::Evaluation &eval, bool genNested,
468-
mlir::omp::DataOp &dataOp,
469-
const llvm::SmallVector<mlir::Type> &useDeviceTypes,
470-
const llvm::SmallVector<mlir::Location> &useDeviceLocs,
471-
const llvm::SmallVector<const Fortran::semantics::Symbol *>
472-
&useDeviceSymbols,
468+
mlir::omp::DataOp &dataOp, llvm::ArrayRef<mlir::Type> useDeviceTypes,
469+
llvm::ArrayRef<mlir::Location> useDeviceLocs,
470+
llvm::ArrayRef<const Fortran::semantics::Symbol *> useDeviceSymbols,
473471
const mlir::Location &currentLocation) {
474472
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
475473
mlir::Region &region = dataOp.getRegion();
@@ -814,11 +812,12 @@ genTaskGroupOp(Fortran::lower::AbstractConverter &converter,
814812
// clause. Support for such list items in a use_device_ptr clause
815813
// is deprecated."
816814
static void promoteNonCPtrUseDevicePtrArgsToUseDeviceAddr(
817-
llvm::SmallVector<mlir::Value> &devicePtrOperands,
818-
llvm::SmallVector<mlir::Value> &deviceAddrOperands,
819-
llvm::SmallVector<mlir::Type> &useDeviceTypes,
820-
llvm::SmallVector<mlir::Location> &useDeviceLocs,
821-
llvm::SmallVector<const Fortran::semantics::Symbol *> &useDeviceSymbols) {
815+
llvm::SmallVectorImpl<mlir::Value> &devicePtrOperands,
816+
llvm::SmallVectorImpl<mlir::Value> &deviceAddrOperands,
817+
llvm::SmallVectorImpl<mlir::Type> &useDeviceTypes,
818+
llvm::SmallVectorImpl<mlir::Location> &useDeviceLocs,
819+
llvm::SmallVectorImpl<const Fortran::semantics::Symbol *>
820+
&useDeviceSymbols) {
822821
auto moveElementToBack = [](size_t idx, auto &vector) {
823822
auto *iter = std::next(vector.begin(), idx);
824823
vector.push_back(*iter);
@@ -951,15 +950,15 @@ genEnterExitUpdateDataOp(Fortran::lower::AbstractConverter &converter,
951950

952951
// This functions creates a block for the body of the targetOp's region. It adds
953952
// all the symbols present in mapSymbols as block arguments to this block.
954-
static void genBodyOfTargetOp(
955-
Fortran::lower::AbstractConverter &converter,
956-
Fortran::semantics::SemanticsContext &semaCtx,
957-
Fortran::lower::pft::Evaluation &eval, bool genNested,
958-
mlir::omp::TargetOp &targetOp,
959-
const llvm::SmallVector<mlir::Type> &mapSymTypes,
960-
const llvm::SmallVector<mlir::Location> &mapSymLocs,
961-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &mapSymbols,
962-
const mlir::Location &currentLocation) {
953+
static void
954+
genBodyOfTargetOp(Fortran::lower::AbstractConverter &converter,
955+
Fortran::semantics::SemanticsContext &semaCtx,
956+
Fortran::lower::pft::Evaluation &eval, bool genNested,
957+
mlir::omp::TargetOp &targetOp,
958+
llvm::ArrayRef<mlir::Type> mapSymTypes,
959+
llvm::ArrayRef<mlir::Location> mapSymLocs,
960+
llvm::ArrayRef<const Fortran::semantics::Symbol *> mapSymbols,
961+
const mlir::Location &currentLocation) {
963962
assert(mapSymTypes.size() == mapSymLocs.size());
964963

965964
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
@@ -1491,7 +1490,7 @@ static void convertLoopBounds(Fortran::lower::AbstractConverter &converter,
14911490
static llvm::SmallVector<const Fortran::semantics::Symbol *>
14921491
genLoopVars(mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
14931492
mlir::Location &loc,
1494-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &args) {
1493+
llvm::ArrayRef<const Fortran::semantics::Symbol *> args) {
14951494
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
14961495
auto &region = op->getRegion(0);
14971496

@@ -1512,16 +1511,16 @@ genLoopVars(mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
15121511
}
15131512
firOpBuilder.setInsertionPointAfter(storeOp);
15141513

1515-
return args;
1514+
return llvm::SmallVector<const Fortran::semantics::Symbol *>(args);
15161515
}
15171516

15181517
static llvm::SmallVector<const Fortran::semantics::Symbol *>
15191518
genLoopAndReductionVars(
15201519
mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
15211520
mlir::Location &loc,
1522-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &loopArgs,
1523-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &reductionArgs,
1524-
llvm::SmallVector<mlir::Type> &reductionTypes) {
1521+
llvm::ArrayRef<const Fortran::semantics::Symbol *> loopArgs,
1522+
llvm::ArrayRef<const Fortran::semantics::Symbol *> reductionArgs,
1523+
llvm::SmallVectorImpl<mlir::Type> &reductionTypes) {
15251524
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
15261525

15271526
llvm::SmallVector<mlir::Type> blockArgTypes;
@@ -1564,7 +1563,7 @@ genLoopAndReductionVars(
15641563
converter.bindSymbol(*arg, prv);
15651564
}
15661565

1567-
return loopArgs;
1566+
return llvm::SmallVector<const Fortran::semantics::Symbol *>(loopArgs);
15681567
}
15691568

15701569
static void

flang/lib/Lower/OpenMP/Utils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ using DeclareTargetCapturePair =
4646
mlir::omp::MapInfoOp
4747
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
4848
mlir::Value baseAddr, mlir::Value varPtrPtr, std::string name,
49-
mlir::SmallVector<mlir::Value> bounds,
50-
mlir::SmallVector<mlir::Value> members, uint64_t mapType,
49+
mlir::ArrayRef<mlir::Value> bounds,
50+
mlir::ArrayRef<mlir::Value> members, uint64_t mapType,
5151
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
5252
bool isVal = false);
5353

0 commit comments

Comments
 (0)