[NFC][flang][OpenMP] Unify genSectionsOp's prototype to match other genXXXOp functions (#144013)
Unifies the prototype of `genSectionsOp` to match other ops generators. Doing so, we are able to call `genSectionsOp` directtly from `genOMPDispatch` instead of the special handling needed now to pass the section blocks. This is useful because now we can handle symbol mapping scopes easier for nested OpenMP directives. See https://github.com/llvm/llvm-project/pull/143706#issuecomment-2965344723 and the following discussion for more info.
This commit is contained in:
@@ -201,6 +201,8 @@ private:
|
||||
/// structures, but it will probably still require some further work to support
|
||||
/// reverse offloading.
|
||||
static llvm::SmallVector<HostEvalInfo, 0> hostEvalInfo;
|
||||
static llvm::SmallVector<const parser::OpenMPSectionsConstruct *, 0>
|
||||
sectionsStack;
|
||||
|
||||
/// Bind symbols to their corresponding entry block arguments.
|
||||
///
|
||||
@@ -2220,8 +2222,12 @@ static mlir::omp::SectionsOp
|
||||
genSectionsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
|
||||
semantics::SemanticsContext &semaCtx,
|
||||
lower::pft::Evaluation &eval, mlir::Location loc,
|
||||
const ConstructQueue &queue, ConstructQueue::const_iterator item,
|
||||
const parser::OmpSectionBlocks §ionBlocks) {
|
||||
const ConstructQueue &queue,
|
||||
ConstructQueue::const_iterator item) {
|
||||
assert(!sectionsStack.empty());
|
||||
const auto §ionBlocks =
|
||||
std::get<parser::OmpSectionBlocks>(sectionsStack.back()->t);
|
||||
sectionsStack.pop_back();
|
||||
mlir::omp::SectionsOperands clauseOps;
|
||||
llvm::SmallVector<const semantics::Symbol *> reductionSyms;
|
||||
genSectionsClauses(converter, semaCtx, item->clauses, loc, clauseOps,
|
||||
@@ -3458,10 +3464,7 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
|
||||
// Lowered in the enclosing genSectionsOp.
|
||||
break;
|
||||
case llvm::omp::Directive::OMPD_sections:
|
||||
// Called directly from genOMP([...], OpenMPSectionsConstruct) because it
|
||||
// has a different prototype.
|
||||
// This code path is still taken when iterating through the construct queue
|
||||
// in genBodyOfOp
|
||||
genSectionsOp(converter, symTable, semaCtx, eval, loc, queue, item);
|
||||
break;
|
||||
case llvm::omp::Directive::OMPD_simd:
|
||||
newOp =
|
||||
@@ -4137,8 +4140,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
|
||||
std::get<parser::OmpClauseList>(beginSectionsDirective.t), semaCtx);
|
||||
const auto &endSectionsDirective =
|
||||
std::get<parser::OmpEndSectionsDirective>(sectionsConstruct.t);
|
||||
const auto §ionBlocks =
|
||||
std::get<parser::OmpSectionBlocks>(sectionsConstruct.t);
|
||||
clauses.append(makeClauses(
|
||||
std::get<parser::OmpClauseList>(endSectionsDirective.t), semaCtx));
|
||||
mlir::Location currentLocation = converter.getCurrentLocation();
|
||||
@@ -4150,22 +4151,10 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
|
||||
ConstructQueue queue{
|
||||
buildConstructQueue(converter.getFirOpBuilder().getModule(), semaCtx,
|
||||
eval, source, directive, clauses)};
|
||||
ConstructQueue::iterator next = queue.begin();
|
||||
// Generate constructs that come first e.g. Parallel
|
||||
while (next != queue.end() &&
|
||||
next->id != llvm::omp::Directive::OMPD_sections) {
|
||||
genOMPDispatch(converter, symTable, semaCtx, eval, currentLocation, queue,
|
||||
next);
|
||||
next = std::next(next);
|
||||
}
|
||||
|
||||
// call genSectionsOp directly (not via genOMPDispatch) so that we can add the
|
||||
// sectionBlocks argument
|
||||
assert(next != queue.end());
|
||||
assert(next->id == llvm::omp::Directive::OMPD_sections);
|
||||
genSectionsOp(converter, symTable, semaCtx, eval, currentLocation, queue,
|
||||
next, sectionBlocks);
|
||||
assert(std::next(next) == queue.end());
|
||||
sectionsStack.push_back(§ionsConstruct);
|
||||
genOMPDispatch(converter, symTable, semaCtx, eval, currentLocation, queue,
|
||||
queue.begin());
|
||||
}
|
||||
|
||||
static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
|
||||
|
||||
Reference in New Issue
Block a user