http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55118
Bug #: 55118 Summary: Missed forward propagation of addresses Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto AssignedTo: unassig...@gcc.gnu.org ReportedBy: hubi...@gcc.gnu.org When compiling tramp3d we end up overestimating function bodies because many of array accesses and C++ casts are split into multiple instructions. I.e.: _3 = &expr_1(D)->left_m; freq:1.00 size: 1 time: 1 Will be eliminated by inlining Accounting size:1.00, time:1.00 on new predicate:(op0 changed) && (not inlined) _5 = LeafFunctor<Field<UniformRectilinearMesh<MeshTraits<3, double, UniformRectilinearTag, CartesianTag, 3> >, double, BrickView>, EvalLeaf<3> >::apply (_3, f_4(D)); freq:1.00 size: 4 time: 13 here left_m is IMO the first field of the structure so _3 will compile to no code and should have size 1. But I do not see why it is not an function argument. Other common pattern is _5 = &MEM[(const struct Domain *)&D.660972].D.123571.domain_m[i_4].D.118841; freq:3.00 size: 1 time: 1 Accounting size:1.00, time:3.00 on predicate:(true) _6 = &MEM[(struct Domain *)_1(D)].D.123571.domain_m[i_4].D.118841; freq:3.00 size: 1 time: 1 Accounting size:1.00, time:3.00 on predicate:(true) _7 = MEM[(const Element_t[2] &)_5]; freq:3.00 size: 1 time: 1 Accounting size:1.00, time:3.00 on predicate:(true) where _5 can be folded into _7 computation. it is easy to search for "= &" occurences in the dump and most of them are foldable. Honza