Add a Visited set to avoid repeatedly processing the same base classes
in complex class hierarchies. This cut down the compile time of one
source file from >12min to ~1min.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
Adding another reviewer - @wmi can you take a look? This is a straightforward compile time fix.
clang/lib/CodeGen/CGVTables.cpp | ||
---|---|---|
1301–1302 | If a CXXRecordDecl is visited twice, the visibility returned in the second visit could be larger than necessary. Will it change the final result? If it will, can we cache the visibility result got in the first visit instead of returning the max value? |
clang/lib/CodeGen/CGVTables.cpp | ||
---|---|---|
1301–1302 | The recursive callsites compute the std::min of the current TypeVis and the one returned by the recursive call. So returning the max guarantees that there is no effect on the current TypeVis. Let me know if the comment can be clarified (that's what I meant by "so that it has no effect on the min visibility computed below ...". Note that the initial non-recursive invocation always has an empty Visited set. |
LGTM.
clang/lib/CodeGen/CGVTables.cpp | ||
---|---|---|
1301–1302 | I see. That makes sense! I didn't understand the location meant by "computed below by the recursive caller." Your explanation "initial non-recursive invocation always has an empty Visited set" helps a lot. It means the immediate result of GetVCallVisibilityLevel may change, but the result for the initial invocation of the recursive call won't be changed. |
clang/lib/CodeGen/CGVTables.cpp | ||
---|---|---|
1301–1302 | I've tried to clarify the comment accordingly |
clang/lib/CodeGen/CGVTables.cpp | ||
---|---|---|
1301–1302 | Thanks for making the comment more clear. |
If a CXXRecordDecl is visited twice, the visibility returned in the second visit could be larger than necessary. Will it change the final result? If it will, can we cache the visibility result got in the first visit instead of returning the max value?