[flang] Add & use a better visit() (take 2)
Adds flang/include/flang/Common/log2-visit.h, which defines a Fortran::common::visit() template function that is a drop-in replacement for std::visit(). Modifies most use sites in the front-end and runtime to use common::visit(). The C++ standard mandates that std::visit() have O(1) execution time, which forces implementations to build dispatch tables. This new common::visit() is O(log2 N) in the number of alternatives in a variant<>, but that N tends to be small and so this change produces a fairly significant improvement in compiler build memory requirements, a 5-10% improvement in compiler build time, and a small improvement in compiler execution time. Building with -DFLANG_USE_STD_VISIT causes common::visit() to be an alias for std::visit(). Calls to common::visit() with multiple variant arguments are referred to std::visit(), pending further work. This change is enabled only for GCC builds with GCC >= 9; an earlier attempt (D122441) ran into bugs in some versions of clang and was reverted rather than simply disabled; and it is not well tested with MSVC. In non-GCC and older GCC builds, common::visit() is simply an alias for std::visit().
This commit is contained in:
@@ -117,7 +117,7 @@ template <typename T> bool PointerAssignmentChecker::Check(const T &) {
|
||||
|
||||
template <typename T>
|
||||
bool PointerAssignmentChecker::Check(const evaluate::Expr<T> &x) {
|
||||
return std::visit([&](const auto &x) { return Check(x); }, x.u);
|
||||
return common::visit([&](const auto &x) { return Check(x); }, x.u);
|
||||
}
|
||||
|
||||
bool PointerAssignmentChecker::Check(const SomeExpr &rhs) {
|
||||
@@ -128,7 +128,7 @@ bool PointerAssignmentChecker::Check(const SomeExpr &rhs) {
|
||||
Say("A coindexed object may not be a pointer target"_err_en_US);
|
||||
return false;
|
||||
} else {
|
||||
return std::visit([&](const auto &x) { return Check(x); }, rhs.u);
|
||||
return common::visit([&](const auto &x) { return Check(x); }, rhs.u);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,7 +322,7 @@ static bool CheckPointerBounds(
|
||||
const SomeExpr &lhs{assignment.lhs};
|
||||
const SomeExpr &rhs{assignment.rhs};
|
||||
bool isBoundsRemapping{false};
|
||||
std::size_t numBounds{std::visit(
|
||||
std::size_t numBounds{common::visit(
|
||||
common::visitors{
|
||||
[&](const evaluate::Assignment::BoundsSpec &bounds) {
|
||||
return bounds.size();
|
||||
|
||||
Reference in New Issue
Block a user