Skip to content

Commit 0007d7e

Browse files
authored
[flang] Reduce recursion in common::visit (#85483)
This patch yields small speed-ups in compiler build and execution times, but more importantly, reduces the stack depth needed in a build environment where tail call optimization does not appear to occur.
1 parent ea72c08 commit 0007d7e

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

flang/include/flang/Common/visit.h

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,6 @@
1717
//
1818
// Define FLANG_USE_STD_VISIT to avoid this code and make common::visit() an
1919
// alias for ::std::visit().
20-
//
21-
//
22-
// With GCC 9.3.0 on a Haswell x86 Ubuntu system, doing out-of-tree builds:
23-
// Before:
24-
// build:
25-
// 6948.53user 212.48system 27:32.92elapsed 433%CPU
26-
// (0avgtext+0avgdata 6429568maxresident)k
27-
// 36181912inputs+8943720outputs (3613684major+97908699minor)pagefaults 0swaps
28-
// execution of tests:
29-
// 205.99user 26.05system 1:08.87elapsed 336%CPU
30-
// (0avgtext+0avgdata 2671452maxresident)k
31-
// 244432inputs+355464outputs (422major+8746468minor)pagefaults 0swaps
32-
// After:
33-
// build:
34-
// 6651.91user 182.57system 25:15.73elapsed 450%CPU
35-
// (0avgtext+0avgdata 6209296maxresident)k
36-
// 17413480inputs+6376360outputs (1567210major+93068230minor)pagefaults 0swaps
37-
// execution of tests:
38-
// 201.42user 25.91system 1:04.68elapsed 351%CPU
39-
// (0avgtext+0avgdata 2661424maxresident)k
40-
// 238840inputs+295912outputs (428major+8489300minor)pagefaults 0swaps
4120

4221
#ifndef FORTRAN_COMMON_VISIT_H_
4322
#define FORTRAN_COMMON_VISIT_H_
@@ -52,7 +31,22 @@ template <std::size_t LOW, std::size_t HIGH, typename RESULT, typename VISITOR,
5231
typename... VARIANT>
5332
inline RESULT Log2VisitHelper(
5433
VISITOR &&visitor, std::size_t which, VARIANT &&...u) {
55-
if constexpr (LOW == HIGH) {
34+
if constexpr (LOW + 7 >= HIGH) {
35+
switch (which - LOW) {
36+
#define VISIT_CASE_N(N) \
37+
case N: \
38+
if constexpr (LOW + N <= HIGH) { \
39+
return visitor(std::get<(LOW + N)>(std::forward<VARIANT>(u))...); \
40+
}
41+
VISIT_CASE_N(1)
42+
VISIT_CASE_N(2)
43+
VISIT_CASE_N(3)
44+
VISIT_CASE_N(4)
45+
VISIT_CASE_N(5)
46+
VISIT_CASE_N(6)
47+
VISIT_CASE_N(7)
48+
#undef VISIT_CASE_N
49+
}
5650
return visitor(std::get<LOW>(std::forward<VARIANT>(u))...);
5751
} else {
5852
static constexpr std::size_t mid{(HIGH + LOW) / 2};

0 commit comments

Comments
 (0)