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

Reply via email to