[Bug c++/102228] New: lookup_anon_field is quadratic
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Sep 7 10:46:43 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102228
Bug ID: 102228
Summary: lookup_anon_field is quadratic
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: rguenth at gcc dot gnu.org
Target Milestone: ---
When lookup_anon_field is called from build_class_member_access_expr with
the intent to build OBJECT.MEMBER in a way including the anon aggregates
COMPONENT_REFs then when there is a chain of anon aggregates to cover
the path is built bottom-up, repeating the expensive recursive walk of
lookup_anon_filed depth-of-anon-aggr times.
So instead of building OBJECT.<anon1>.<anon2>....<anonn>.MEMBER by
recursing to build_class_member_access_expr first with OBJECT
and <anonn> as MEMBER lookup_anon_field should return the full path
it found.
The PR101555 testcase with -fsyntax-only spends 66% in lookup_anon_field:
Samples: 8K of event 'cycles', Event count (approx.): 9385924074
Overhead Samples Command Shared Object Symbol
66.28% 5415 cc1plus cc1plus [.] lookup_anon_field
10.04% 824 cc1plus cc1plus [.] get_class_binding_direct
5.01% 411 cc1plus cc1plus [.] fields_linear_search
with -Os it's still the biggest hitter at nearly 15% compile time.
More information about the Gcc-bugs
mailing list