diff options
author | Sergio Afonso <safonsof@amd.com> | 2024-03-19 13:24:23 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-19 13:24:23 +0000 |
commit | bf39f3bb45a02431ea54fb9a59a9216641914751 (patch) | |
tree | 904cae6579ea568694f9a07020f6e2ea8df1057b | |
parent | 4b10d1fdd31f46a9cdf3e7a196f9934d766a922f (diff) |
Revert "[Flang][OpenMP][Lower] NFC: Move clause processing helpers into the C…"upstream/revert-85258-nfc-clauseprocessor-helpers
This reverts commit 2f2f16f32bb2a6c250b19adbc229d9dc3b38640c.
-rw-r--r-- | flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 31 | ||||
-rw-r--r-- | flang/lib/Lower/OpenMP/ClauseProcessor.h | 15 | ||||
-rw-r--r-- | flang/lib/Lower/OpenMP/OpenMP.cpp | 72 | ||||
-rw-r--r-- | flang/lib/Lower/OpenMP/Utils.cpp | 19 | ||||
-rw-r--r-- | flang/lib/Lower/OpenMP/Utils.h | 3 |
5 files changed, 74 insertions, 66 deletions
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp index 81919f2a4896..13347c8cf7b6 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp @@ -208,25 +208,6 @@ addUseDeviceClause(Fortran::lower::AbstractConverter &converter, useDeviceSymbols.push_back(object.id()); } -static void convertLoopBounds(Fortran::lower::AbstractConverter &converter, - mlir::Location loc, - llvm::SmallVectorImpl<mlir::Value> &lowerBound, - llvm::SmallVectorImpl<mlir::Value> &upperBound, - llvm::SmallVectorImpl<mlir::Value> &step, - std::size_t loopVarTypeSize) { - fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); - // The types of lower bound, upper bound, and step are converted into the - // type of the loop variable if necessary. - mlir::Type loopVarType = getLoopVarType(converter, loopVarTypeSize); - for (unsigned it = 0; it < (unsigned)lowerBound.size(); it++) { - lowerBound[it] = - firOpBuilder.createConvert(loc, loopVarType, lowerBound[it]); - upperBound[it] = - firOpBuilder.createConvert(loc, loopVarType, upperBound[it]); - step[it] = firOpBuilder.createConvert(loc, loopVarType, step[it]); - } -} - //===----------------------------------------------------------------------===// // ClauseProcessor unique clauses //===----------------------------------------------------------------------===// @@ -236,7 +217,8 @@ bool ClauseProcessor::processCollapse( llvm::SmallVectorImpl<mlir::Value> &lowerBound, llvm::SmallVectorImpl<mlir::Value> &upperBound, llvm::SmallVectorImpl<mlir::Value> &step, - llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> &iv) const { + llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> &iv, + std::size_t &loopVarTypeSize) const { bool found = false; fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); @@ -254,7 +236,7 @@ bool ClauseProcessor::processCollapse( found = true; } - std::size_t loopVarTypeSize = 0; + loopVarTypeSize = 0; do { Fortran::lower::pft::Evaluation *doLoop = &doConstructEval->getFirstNestedEvaluation(); @@ -285,9 +267,6 @@ bool ClauseProcessor::processCollapse( &*std::next(doConstructEval->getNestedEvaluations().begin()); } while (collapseValue > 0); - convertLoopBounds(converter, currentLocation, lowerBound, upperBound, step, - loopVarTypeSize); - return found; } @@ -928,7 +907,6 @@ bool ClauseProcessor::processMap( bool ClauseProcessor::processReduction( mlir::Location currentLocation, llvm::SmallVectorImpl<mlir::Value> &reductionVars, - llvm::SmallVectorImpl<mlir::Type> &reductionTypes, llvm::SmallVectorImpl<mlir::Attribute> &reductionDeclSymbols, llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> *reductionSymbols) const { @@ -938,9 +916,6 @@ bool ClauseProcessor::processReduction( ReductionProcessor rp; rp.addReductionDecl(currentLocation, converter, clause, reductionVars, reductionDeclSymbols, reductionSymbols); - reductionTypes.reserve(reductionVars.size()); - llvm::transform(reductionVars, std::back_inserter(reductionTypes), - [](mlir::Value v) { return v.getType(); }); }); } diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h index 3f50909fe73a..3f6adcce8ae8 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.h +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h @@ -56,12 +56,14 @@ public: clauses(makeList(clauses, semaCtx)) {} // 'Unique' clauses: They can appear at most once in the clause list. - bool processCollapse( - mlir::Location currentLocation, Fortran::lower::pft::Evaluation &eval, - llvm::SmallVectorImpl<mlir::Value> &lowerBound, - llvm::SmallVectorImpl<mlir::Value> &upperBound, - llvm::SmallVectorImpl<mlir::Value> &step, - llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> &iv) const; + bool + processCollapse(mlir::Location currentLocation, + Fortran::lower::pft::Evaluation &eval, + llvm::SmallVectorImpl<mlir::Value> &lowerBound, + llvm::SmallVectorImpl<mlir::Value> &upperBound, + llvm::SmallVectorImpl<mlir::Value> &step, + llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> &iv, + std::size_t &loopVarTypeSize) const; bool processDefault() const; bool processDevice(Fortran::lower::StatementContext &stmtCtx, mlir::Value &result) const; @@ -124,7 +126,6 @@ public: bool processReduction(mlir::Location currentLocation, llvm::SmallVectorImpl<mlir::Value> &reductionVars, - llvm::SmallVectorImpl<mlir::Type> &reductionTypes, llvm::SmallVectorImpl<mlir::Attribute> &reductionDeclSymbols, llvm::SmallVectorImpl<const Fortran::semantics::Symbol *> *reductionSymbols = nullptr) const; diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index dbdb6f1a453b..eaaa8fcd165a 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -214,6 +214,24 @@ static void threadPrivatizeVars(Fortran::lower::AbstractConverter &converter, firOpBuilder.restoreInsertionPoint(insPt); } +static mlir::Type getLoopVarType(Fortran::lower::AbstractConverter &converter, + std::size_t loopVarTypeSize) { + // OpenMP runtime requires 32-bit or 64-bit loop variables. + loopVarTypeSize = loopVarTypeSize * 8; + if (loopVarTypeSize < 32) { + loopVarTypeSize = 32; + } else if (loopVarTypeSize > 64) { + loopVarTypeSize = 64; + mlir::emitWarning(converter.getCurrentLocation(), + "OpenMP loop iteration variable cannot have more than 64 " + "bits size and will be narrowed into 64 bits."); + } + assert((loopVarTypeSize == 32 || loopVarTypeSize == 64) && + "OpenMP loop iteration variable size must be transformed into 32-bit " + "or 64-bit"); + return converter.getFirOpBuilder().getIntegerType(loopVarTypeSize); +} + static mlir::Operation * createAndSetPrivatizedLoopVar(Fortran::lower::AbstractConverter &converter, mlir::Location loc, mlir::Value indexVal, @@ -550,7 +568,6 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, mlir::omp::ClauseProcBindKindAttr procBindKindAttr; llvm::SmallVector<mlir::Value> allocateOperands, allocatorOperands, reductionVars; - llvm::SmallVector<mlir::Type> reductionTypes; llvm::SmallVector<mlir::Attribute> reductionDeclSymbols; llvm::SmallVector<const Fortran::semantics::Symbol *> reductionSymbols; @@ -561,8 +578,13 @@ genParallelOp(Fortran::lower::AbstractConverter &converter, cp.processDefault(); cp.processAllocate(allocatorOperands, allocateOperands); if (!outerCombined) - cp.processReduction(currentLocation, reductionVars, reductionTypes, - reductionDeclSymbols, &reductionSymbols); + cp.processReduction(currentLocation, reductionVars, reductionDeclSymbols, + &reductionSymbols); + + llvm::SmallVector<mlir::Type> reductionTypes; + reductionTypes.reserve(reductionVars.size()); + llvm::transform(reductionVars, std::back_inserter(reductionTypes), + [](mlir::Value v) { return v.getType(); }); auto reductionCallback = [&](mlir::Operation *op) { llvm::SmallVector<mlir::Location> locs(reductionVars.size(), @@ -1446,6 +1468,25 @@ genOMP(Fortran::lower::AbstractConverter &converter, standaloneConstruct.u); } +static void convertLoopBounds(Fortran::lower::AbstractConverter &converter, + mlir::Location loc, + llvm::SmallVectorImpl<mlir::Value> &lowerBound, + llvm::SmallVectorImpl<mlir::Value> &upperBound, + llvm::SmallVectorImpl<mlir::Value> &step, + std::size_t loopVarTypeSize) { + fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); + // The types of lower bound, upper bound, and step are converted into the + // type of the loop variable if necessary. + mlir::Type loopVarType = getLoopVarType(converter, loopVarTypeSize); + for (unsigned it = 0; it < (unsigned)lowerBound.size(); it++) { + lowerBound[it] = + firOpBuilder.createConvert(loc, loopVarType, lowerBound[it]); + upperBound[it] = + firOpBuilder.createConvert(loc, loopVarType, upperBound[it]); + step[it] = firOpBuilder.createConvert(loc, loopVarType, step[it]); + } +} + static llvm::SmallVector<const Fortran::semantics::Symbol *> genLoopVars(mlir::Operation *op, Fortran::lower::AbstractConverter &converter, mlir::Location &loc, @@ -1541,15 +1582,16 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter, llvm::SmallVector<mlir::Value> lowerBound, upperBound, step, reductionVars; llvm::SmallVector<mlir::Value> alignedVars, nontemporalVars; llvm::SmallVector<const Fortran::semantics::Symbol *> iv; - llvm::SmallVector<mlir::Type> reductionTypes; llvm::SmallVector<mlir::Attribute> reductionDeclSymbols; mlir::omp::ClauseOrderKindAttr orderClauseOperand; mlir::IntegerAttr simdlenClauseOperand, safelenClauseOperand; + std::size_t loopVarTypeSize; ClauseProcessor cp(converter, semaCtx, loopOpClauseList); - cp.processCollapse(loc, eval, lowerBound, upperBound, step, iv); + cp.processCollapse(loc, eval, lowerBound, upperBound, step, iv, + loopVarTypeSize); cp.processScheduleChunk(stmtCtx, scheduleChunkClauseOperand); - cp.processReduction(loc, reductionVars, reductionTypes, reductionDeclSymbols); + cp.processReduction(loc, reductionVars, reductionDeclSymbols); cp.processIf(clause::If::DirectiveNameModifier::Simd, ifClauseOperand); cp.processSimdlen(simdlenClauseOperand); cp.processSafelen(safelenClauseOperand); @@ -1559,6 +1601,9 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter, Fortran::parser::OmpClause::Nontemporal, Fortran::parser::OmpClause::Order>(loc, ompDirective); + convertLoopBounds(converter, loc, lowerBound, upperBound, step, + loopVarTypeSize); + mlir::TypeRange resultType; auto simdLoopOp = firOpBuilder.create<mlir::omp::SimdLoopOp>( loc, resultType, lowerBound, upperBound, step, alignedVars, @@ -1596,7 +1641,6 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, llvm::SmallVector<mlir::Value> lowerBound, upperBound, step, reductionVars; llvm::SmallVector<mlir::Value> linearVars, linearStepVars; llvm::SmallVector<const Fortran::semantics::Symbol *> iv; - llvm::SmallVector<mlir::Type> reductionTypes; llvm::SmallVector<mlir::Attribute> reductionDeclSymbols; llvm::SmallVector<const Fortran::semantics::Symbol *> reductionSymbols; mlir::omp::ClauseOrderKindAttr orderClauseOperand; @@ -1604,15 +1648,20 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, mlir::UnitAttr nowaitClauseOperand, byrefOperand, scheduleSimdClauseOperand; mlir::IntegerAttr orderedClauseOperand; mlir::omp::ScheduleModifierAttr scheduleModClauseOperand; + std::size_t loopVarTypeSize; ClauseProcessor cp(converter, semaCtx, beginClauseList); - cp.processCollapse(loc, eval, lowerBound, upperBound, step, iv); + cp.processCollapse(loc, eval, lowerBound, upperBound, step, iv, + loopVarTypeSize); cp.processScheduleChunk(stmtCtx, scheduleChunkClauseOperand); - cp.processReduction(loc, reductionVars, reductionTypes, reductionDeclSymbols, + cp.processReduction(loc, reductionVars, reductionDeclSymbols, &reductionSymbols); cp.processTODO<Fortran::parser::OmpClause::Linear, Fortran::parser::OmpClause::Order>(loc, ompDirective); + convertLoopBounds(converter, loc, lowerBound, upperBound, step, + loopVarTypeSize); + if (ReductionProcessor::doReductionByRef(reductionVars)) byrefOperand = firOpBuilder.getUnitAttr(); @@ -1653,6 +1702,11 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter, auto *nestedEval = getCollapsedLoopEval( eval, Fortran::lower::getCollapseValue(beginClauseList)); + llvm::SmallVector<mlir::Type> reductionTypes; + reductionTypes.reserve(reductionVars.size()); + llvm::transform(reductionVars, std::back_inserter(reductionTypes), + [](mlir::Value v) { return v.getType(); }); + auto ivCallback = [&](mlir::Operation *op) { return genLoopAndReductionVars(op, converter, loc, iv, reductionSymbols, reductionTypes); diff --git a/flang/lib/Lower/OpenMP/Utils.cpp b/flang/lib/Lower/OpenMP/Utils.cpp index b9c0660aa4da..fa4a51e33848 100644 --- a/flang/lib/Lower/OpenMP/Utils.cpp +++ b/flang/lib/Lower/OpenMP/Utils.cpp @@ -15,7 +15,6 @@ #include <flang/Lower/AbstractConverter.h> #include <flang/Lower/ConvertType.h> -#include <flang/Optimizer/Builder/FIRBuilder.h> #include <flang/Parser/parse-tree.h> #include <flang/Parser/tools.h> #include <flang/Semantics/tools.h> @@ -71,24 +70,6 @@ void genObjectList2(const Fortran::parser::OmpObjectList &objectList, } } -mlir::Type getLoopVarType(Fortran::lower::AbstractConverter &converter, - std::size_t loopVarTypeSize) { - // OpenMP runtime requires 32-bit or 64-bit loop variables. - loopVarTypeSize = loopVarTypeSize * 8; - if (loopVarTypeSize < 32) { - loopVarTypeSize = 32; - } else if (loopVarTypeSize > 64) { - loopVarTypeSize = 64; - mlir::emitWarning(converter.getCurrentLocation(), - "OpenMP loop iteration variable cannot have more than 64 " - "bits size and will be narrowed into 64 bits."); - } - assert((loopVarTypeSize == 32 || loopVarTypeSize == 64) && - "OpenMP loop iteration variable size must be transformed into 32-bit " - "or 64-bit"); - return converter.getFirOpBuilder().getIntegerType(loopVarTypeSize); -} - void gatherFuncAndVarSyms( const ObjectList &objects, mlir::omp::DeclareTargetCaptureClause clause, llvm::SmallVectorImpl<DeclareTargetCapturePair> &symbolAndClause) { diff --git a/flang/lib/Lower/OpenMP/Utils.h b/flang/lib/Lower/OpenMP/Utils.h index 4074bf73987d..3ab0823a4621 100644 --- a/flang/lib/Lower/OpenMP/Utils.h +++ b/flang/lib/Lower/OpenMP/Utils.h @@ -51,9 +51,6 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc, mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy, bool isVal = false); -mlir::Type getLoopVarType(Fortran::lower::AbstractConverter &converter, - std::size_t loopVarTypeSize); - void gatherFuncAndVarSyms( const ObjectList &objects, mlir::omp::DeclareTargetCaptureClause clause, llvm::SmallVectorImpl<DeclareTargetCapturePair> &symbolAndClause); |