Skip to content

Commit 33eabe3

Browse files
committed
[Flang][Lower] NFC: Replace SmallVector with more suitable alternatives
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 7252d22 commit 33eabe3

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
@@ -620,7 +620,7 @@ class TypeInfo {
620620
}
621621

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

625625
// Is the type inside a box?
626626
bool isBox() const { return inBox; }
@@ -842,8 +842,8 @@ bool ClauseProcessor::processLink(
842842
mlir::omp::MapInfoOp
843843
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
844844
mlir::Value baseAddr, mlir::Value varPtrPtr, std::string name,
845-
mlir::SmallVector<mlir::Value> bounds,
846-
mlir::SmallVector<mlir::Value> members, uint64_t mapType,
845+
mlir::ArrayRef<mlir::Value> bounds,
846+
mlir::ArrayRef<mlir::Value> members, uint64_t mapType,
847847
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
848848
bool isVal) {
849849
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();
@@ -816,11 +814,12 @@ genTaskGroupOp(Fortran::lower::AbstractConverter &converter,
816814
// clause. Support for such list items in a use_device_ptr clause
817815
// is deprecated."
818816
static void promoteNonCPtrUseDevicePtrArgsToUseDeviceAddr(
819-
llvm::SmallVector<mlir::Value> &devicePtrOperands,
820-
llvm::SmallVector<mlir::Value> &deviceAddrOperands,
821-
llvm::SmallVector<mlir::Type> &useDeviceTypes,
822-
llvm::SmallVector<mlir::Location> &useDeviceLocs,
823-
llvm::SmallVector<const Fortran::semantics::Symbol *> &useDeviceSymbols) {
817+
llvm::SmallVectorImpl<mlir::Value> &devicePtrOperands,
818+
llvm::SmallVectorImpl<mlir::Value> &deviceAddrOperands,
819+
llvm::SmallVectorImpl<mlir::Type> &useDeviceTypes,
820+
llvm::SmallVectorImpl<mlir::Location> &useDeviceLocs,
821+
llvm::SmallVectorImpl<const Fortran::semantics::Symbol *>
822+
&useDeviceSymbols) {
824823
auto moveElementToBack = [](size_t idx, auto &vector) {
825824
auto *iter = std::next(vector.begin(), idx);
826825
vector.push_back(*iter);
@@ -957,15 +956,15 @@ genEnterExitUpdateDataOp(Fortran::lower::AbstractConverter &converter,
957956

958957
// This functions creates a block for the body of the targetOp's region. It adds
959958
// all the symbols present in mapSymbols as block arguments to this block.
960-
static void genBodyOfTargetOp(
961-
Fortran::lower::AbstractConverter &converter,
962-
Fortran::semantics::SemanticsContext &semaCtx,
963-
Fortran::lower::pft::Evaluation &eval, bool genNested,
964-
mlir::omp::TargetOp &targetOp,
965-
const llvm::SmallVector<mlir::Type> &mapSymTypes,
966-
const llvm::SmallVector<mlir::Location> &mapSymLocs,
967-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &mapSymbols,
968-
const mlir::Location &currentLocation) {
959+
static void
960+
genBodyOfTargetOp(Fortran::lower::AbstractConverter &converter,
961+
Fortran::semantics::SemanticsContext &semaCtx,
962+
Fortran::lower::pft::Evaluation &eval, bool genNested,
963+
mlir::omp::TargetOp &targetOp,
964+
llvm::ArrayRef<mlir::Type> mapSymTypes,
965+
llvm::ArrayRef<mlir::Location> mapSymLocs,
966+
llvm::ArrayRef<const Fortran::semantics::Symbol *> mapSymbols,
967+
const mlir::Location &currentLocation) {
969968
assert(mapSymTypes.size() == mapSymLocs.size());
970969

971970
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
@@ -1498,7 +1497,7 @@ static void convertLoopBounds(Fortran::lower::AbstractConverter &converter,
14981497
static llvm::SmallVector<const Fortran::semantics::Symbol *>
14991498
genLoopVars(mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
15001499
mlir::Location &loc,
1501-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &args) {
1500+
llvm::ArrayRef<const Fortran::semantics::Symbol *> args) {
15021501
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
15031502
auto &region = op->getRegion(0);
15041503

@@ -1519,16 +1518,16 @@ genLoopVars(mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
15191518
}
15201519
firOpBuilder.setInsertionPointAfter(storeOp);
15211520

1522-
return args;
1521+
return llvm::SmallVector<const Fortran::semantics::Symbol *>(args);
15231522
}
15241523

15251524
static llvm::SmallVector<const Fortran::semantics::Symbol *>
15261525
genLoopAndReductionVars(
15271526
mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
15281527
mlir::Location &loc,
1529-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &loopArgs,
1530-
const llvm::SmallVector<const Fortran::semantics::Symbol *> &reductionArgs,
1531-
llvm::SmallVector<mlir::Type> &reductionTypes) {
1528+
llvm::ArrayRef<const Fortran::semantics::Symbol *> loopArgs,
1529+
llvm::ArrayRef<const Fortran::semantics::Symbol *> reductionArgs,
1530+
llvm::SmallVectorImpl<mlir::Type> &reductionTypes) {
15321531
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
15331532

15341533
llvm::SmallVector<mlir::Type> blockArgTypes;
@@ -1571,7 +1570,7 @@ genLoopAndReductionVars(
15711570
converter.bindSymbol(*arg, prv);
15721571
}
15731572

1574-
return loopArgs;
1573+
return llvm::SmallVector<const Fortran::semantics::Symbol *>(loopArgs);
15751574
}
15761575

15771576
static void

flang/lib/Lower/OpenMP/Utils.h

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

0 commit comments

Comments
 (0)