Skip to content

Commit d1b69c9

Browse files
committed
Use shared helper function to find the sizes clause.
1 parent a687d97 commit d1b69c9

File tree

1 file changed

+25
-40
lines changed

1 file changed

+25
-40
lines changed

flang/lib/Lower/OpenMP/Utils.cpp

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -599,15 +599,13 @@ static void convertLoopBounds(lower::AbstractConverter &converter,
599599
}
600600
}
601601

602-
/// Populates the sizes vector with values if the given OpenMPConstruct
603-
/// contains a loop construct with an inner tiling construct.
604-
void collectTileSizesFromOpenMPConstruct(
602+
// Helper function that finds the sizes clause in a inner OMPD_tile directive
603+
// and passes the sizes clause to the callback function if found.
604+
static void processTileSizesFromOpenMPConstruct(
605605
const parser::OpenMPConstruct *ompCons,
606-
llvm::SmallVectorImpl<int64_t> &tileSizes,
607-
Fortran::semantics::SemanticsContext &semaCtx) {
606+
std::function<void(const parser::OmpClause::Sizes *)> processFun) {
608607
if (!ompCons)
609608
return;
610-
611609
if (auto *ompLoop{std::get_if<parser::OpenMPLoopConstruct>(&ompCons->u)}) {
612610
const auto &nestedOptional =
613611
std::get<std::optional<parser::NestedConstruct>>(ompLoop->t);
@@ -624,16 +622,13 @@ void collectTileSizesFromOpenMPConstruct(
624622
std::get<parser::OmpLoopDirective>(innerBegin.t).v;
625623

626624
if (innerDirective == llvm::omp::Directive::OMPD_tile) {
627-
// Get the size values from parse tree and convert to a vector
625+
// Get the size values from parse tree and convert to a vector.
628626
const auto &innerClauseList{
629627
std::get<parser::OmpClauseList>(innerBegin.t)};
630628
for (const auto &clause : innerClauseList.v) {
631629
if (const auto tclause{
632630
std::get_if<parser::OmpClause::Sizes>(&clause.u)}) {
633-
for (auto &tval : tclause->v) {
634-
if (const auto v{EvaluateInt64(semaCtx, tval)})
635-
tileSizes.push_back(*v);
636-
}
631+
processFun(tclause);
637632
break;
638633
}
639634
}
@@ -642,6 +637,20 @@ void collectTileSizesFromOpenMPConstruct(
642637
}
643638
}
644639

640+
/// Populates the sizes vector with values if the given OpenMPConstruct
641+
/// contains a loop construct with an inner tiling construct.
642+
void collectTileSizesFromOpenMPConstruct(
643+
const parser::OpenMPConstruct *ompCons,
644+
llvm::SmallVectorImpl<int64_t> &tileSizes,
645+
Fortran::semantics::SemanticsContext &semaCtx) {
646+
processTileSizesFromOpenMPConstruct(
647+
ompCons, [&](const parser::OmpClause::Sizes *tclause) {
648+
for (auto &tval : tclause->v)
649+
if (const auto v{EvaluateInt64(semaCtx, tval)})
650+
tileSizes.push_back(*v);
651+
});
652+
}
653+
645654
int64_t collectLoopRelatedInfo(
646655
lower::AbstractConverter &converter, mlir::Location currentLocation,
647656
lower::pft::Evaluation &eval, const omp::List<omp::Clause> &clauses,
@@ -663,37 +672,13 @@ int64_t collectLoopRelatedInfo(
663672
numCollapse = collapseValue;
664673
}
665674

666-
// Collect sizes from tile directive if present
675+
// Collect sizes from tile directive if present.
667676
std::int64_t sizesLengthValue = 0l;
668677
if (auto *ompCons{eval.getIf<parser::OpenMPConstruct>()}) {
669-
if (auto *ompLoop{std::get_if<parser::OpenMPLoopConstruct>(&ompCons->u)}) {
670-
const auto &nestedOptional =
671-
std::get<std::optional<parser::NestedConstruct>>(ompLoop->t);
672-
assert(nestedOptional.has_value() &&
673-
"Expected a DoConstruct or OpenMPLoopConstruct");
674-
const auto *innerConstruct =
675-
std::get_if<common::Indirection<parser::OpenMPLoopConstruct>>(
676-
&(nestedOptional.value()));
677-
if (innerConstruct) {
678-
const auto &innerLoopDirective = innerConstruct->value();
679-
const auto &innerBegin =
680-
std::get<parser::OmpBeginLoopDirective>(innerLoopDirective.t);
681-
const auto &innerDirective =
682-
std::get<parser::OmpLoopDirective>(innerBegin.t).v;
683-
684-
if (innerDirective == llvm::omp::Directive::OMPD_tile) {
685-
// Get the size values from parse tree and convert to a vector
686-
const auto &innerClauseList{
687-
std::get<parser::OmpClauseList>(innerBegin.t)};
688-
for (const auto &clause : innerClauseList.v)
689-
if (const auto tclause{
690-
std::get_if<parser::OmpClause::Sizes>(&clause.u)}) {
691-
sizesLengthValue = tclause->v.size();
692-
break;
693-
}
694-
}
695-
}
696-
}
678+
processTileSizesFromOpenMPConstruct(
679+
ompCons, [&](const parser::OmpClause::Sizes *tclause) {
680+
sizesLengthValue = tclause->v.size();
681+
});
697682
}
698683

699684
collapseValue = std::max(collapseValue, sizesLengthValue);

0 commit comments

Comments
 (0)