-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[flang][OpenMP] Decompose compound constructs, do recursive lowering #90098
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
4cf41a6
[flang][OpenMP] Implement getOpenMPVersion helper function, NFC
kparzysz 45d5017
[flang][OpenMP] Implement getIterationVariableSymbol helper function,…
kparzysz 8f1ce58
[flang][OpenMP] Pass symTable to all genXYZ functions, NFC
kparzysz 6f7697e
[flang][OpenMP] Decompose compound construccts, do recursive lowering
kparzysz 60201bb
Add LLVM license header, fix include guard
kparzysz d5635d6
Split the directive decomposer into its own file
kparzysz 38ea99f
Expand tuple member into class with TupleTrait
kparzysz f7b776f
Merge branch 'main' into users/kparzysz/spr/d09-recurse
kparzysz 579967e
Switch to getOpenMPVersionAttribute, remove old functions
kparzysz 0019742
Merge branch 'main' into users/kparzysz/spr/d09-recurse
kparzysz 8b8f7f6
Merge branch 'main' into users/kparzysz/spr/d09-recurse
kparzysz 100bc63
Merge branch 'main' into users/kparzysz/spr/d09-recurse
kparzysz 6e46269
Add tests, update tests, add clause merging
kparzysz 3748f49
clang-format
kparzysz 54b637d
Address review comments
kparzysz 64d9ec5
Merge branch 'main' into users/kparzysz/spr/d09-recurse
kparzysz 682ce7f
Add comment to `buildConstructQueue`
kparzysz 3b6542c
xxx
kparzysz d754010
Remove potential non-determinism, try to preserve clause/symbol order
kparzysz 0c4e35c
Add tile and unroll
kparzysz File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
//===-- Decomposer.cpp -- Compound directive decomposition ----------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "Decomposer.h" | ||
|
||
#include "Clauses.h" | ||
#include "Utils.h" | ||
#include "flang/Lower/PFTBuilder.h" | ||
#include "flang/Semantics/semantics.h" | ||
#include "flang/Tools/CrossToolHelpers.h" | ||
#include "mlir/IR/BuiltinOps.h" | ||
#include "llvm/ADT/ArrayRef.h" | ||
#include "llvm/ADT/STLExtras.h" | ||
#include "llvm/ADT/SmallVector.h" | ||
#include "llvm/Frontend/OpenMP/ClauseT.h" | ||
#include "llvm/Frontend/OpenMP/ConstructCompositionT.h" | ||
#include "llvm/Frontend/OpenMP/ConstructDecompositionT.h" | ||
#include "llvm/Frontend/OpenMP/OMP.h" | ||
#include "llvm/Support/raw_ostream.h" | ||
|
||
#include <optional> | ||
#include <utility> | ||
#include <variant> | ||
|
||
using namespace Fortran; | ||
|
||
namespace { | ||
using namespace Fortran::lower::omp; | ||
|
||
struct ConstructDecomposition { | ||
ConstructDecomposition(mlir::ModuleOp modOp, | ||
semantics::SemanticsContext &semaCtx, | ||
lower::pft::Evaluation &ev, | ||
llvm::omp::Directive compound, | ||
const List<Clause> &clauses) | ||
: semaCtx(semaCtx), mod(modOp), eval(ev) { | ||
tomp::ConstructDecompositionT decompose(getOpenMPVersionAttribute(modOp), | ||
*this, compound, | ||
llvm::ArrayRef(clauses)); | ||
output = std::move(decompose.output); | ||
} | ||
|
||
// Given an object, return its base object if one exists. | ||
std::optional<Object> getBaseObject(const Object &object) { | ||
return lower::omp::getBaseObject(object, semaCtx); | ||
} | ||
|
||
// Return the iteration variable of the associated loop if any. | ||
std::optional<Object> getLoopIterVar() { | ||
if (semantics::Symbol *symbol = getIterationVariableSymbol(eval)) | ||
return Object{symbol, /*designator=*/{}}; | ||
return std::nullopt; | ||
} | ||
|
||
semantics::SemanticsContext &semaCtx; | ||
mlir::ModuleOp mod; | ||
lower::pft::Evaluation &eval; | ||
List<UnitConstruct> output; | ||
}; | ||
} // namespace | ||
|
||
static UnitConstruct mergeConstructs(uint32_t version, | ||
llvm::ArrayRef<UnitConstruct> units) { | ||
tomp::ConstructCompositionT compose(version, units); | ||
return compose.merged; | ||
} | ||
|
||
namespace Fortran::lower::omp { | ||
LLVM_DUMP_METHOD llvm::raw_ostream &operator<<(llvm::raw_ostream &os, | ||
const UnitConstruct &uc) { | ||
os << llvm::omp::getOpenMPDirectiveName(uc.id); | ||
for (auto [index, clause] : llvm::enumerate(uc.clauses)) { | ||
os << (index == 0 ? '\t' : ' '); | ||
os << llvm::omp::getOpenMPClauseName(clause.id); | ||
} | ||
return os; | ||
} | ||
|
||
ConstructQueue buildConstructQueue( | ||
mlir::ModuleOp modOp, Fortran::semantics::SemanticsContext &semaCtx, | ||
Fortran::lower::pft::Evaluation &eval, const parser::CharBlock &source, | ||
llvm::omp::Directive compound, const List<Clause> &clauses) { | ||
|
||
List<UnitConstruct> constructs; | ||
|
||
ConstructDecomposition decompose(modOp, semaCtx, eval, compound, clauses); | ||
assert(!decompose.output.empty() && "Construct decomposition failed"); | ||
|
||
llvm::SmallVector<llvm::omp::Directive> loweringUnits; | ||
std::ignore = | ||
skatrak marked this conversation as resolved.
Show resolved
Hide resolved
|
||
llvm::omp::getLeafOrCompositeConstructs(compound, loweringUnits); | ||
uint32_t version = getOpenMPVersionAttribute(modOp); | ||
|
||
int leafIndex = 0; | ||
for (llvm::omp::Directive dir_id : loweringUnits) { | ||
llvm::ArrayRef<llvm::omp::Directive> leafsOrSelf = | ||
llvm::omp::getLeafConstructsOrSelf(dir_id); | ||
size_t numLeafs = leafsOrSelf.size(); | ||
|
||
llvm::ArrayRef<UnitConstruct> toMerge{&decompose.output[leafIndex], | ||
numLeafs}; | ||
auto &uc = constructs.emplace_back(mergeConstructs(version, toMerge)); | ||
|
||
if (!transferLocations(clauses, uc.clauses)) { | ||
// If some clauses are left without source information, use the | ||
// directive's source. | ||
for (auto &clause : uc.clauses) { | ||
if (clause.source.empty()) | ||
clause.source = source; | ||
} | ||
} | ||
leafIndex += numLeafs; | ||
} | ||
|
||
return constructs; | ||
} | ||
} // namespace Fortran::lower::omp |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
//===-- Decomposer.h -- Compound directive decomposition ------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#ifndef FORTRAN_LOWER_OPENMP_DECOMPOSER_H | ||
#define FORTRAN_LOWER_OPENMP_DECOMPOSER_H | ||
|
||
#include "Clauses.h" | ||
#include "mlir/IR/BuiltinOps.h" | ||
#include "llvm/Frontend/OpenMP/ConstructCompositionT.h" | ||
#include "llvm/Frontend/OpenMP/ConstructDecompositionT.h" | ||
#include "llvm/Frontend/OpenMP/OMP.h" | ||
#include "llvm/Support/Compiler.h" | ||
|
||
namespace llvm { | ||
class raw_ostream; | ||
} | ||
|
||
namespace Fortran { | ||
namespace semantics { | ||
class SemanticsContext; | ||
} | ||
namespace lower::pft { | ||
struct Evaluation; | ||
} | ||
} // namespace Fortran | ||
|
||
namespace Fortran::lower::omp { | ||
using UnitConstruct = tomp::DirectiveWithClauses<lower::omp::Clause>; | ||
using ConstructQueue = List<UnitConstruct>; | ||
|
||
LLVM_DUMP_METHOD llvm::raw_ostream &operator<<(llvm::raw_ostream &os, | ||
const UnitConstruct &uc); | ||
|
||
// Given a potentially compound construct with a list of clauses that | ||
// apply to it, break it up into individual sub-constructs each with | ||
// the subset of applicable clauses (plus implicit clauses, if any). | ||
// From that create a work queue where each work item corresponds to | ||
// the sub-construct with its clauses. | ||
ConstructQueue buildConstructQueue(mlir::ModuleOp modOp, | ||
semantics::SemanticsContext &semaCtx, | ||
lower::pft::Evaluation &eval, | ||
const parser::CharBlock &source, | ||
llvm::omp::Directive compound, | ||
const List<Clause> &clauses); | ||
} // namespace Fortran::lower::omp | ||
|
||
#endif // FORTRAN_LOWER_OPENMP_DECOMPOSER_H |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Why not just
SmallVector
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ConstructQueue
is defined withList
. We useList
for lists of clauses, so it's just for consistency.