[Bug middle-end/53844] [4.6/4.7 Regression] GCC generates suboptimal code for unused members of classes in some cases on multiple targets.

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Wed Jul 4 13:47:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53844

--- Comment #10 from rguenther at suse dot de <rguenther at suse dot de> 2012-07-04 13:47:09 UTC ---
On Wed, 4 Jul 2012, ed at edrosten dot com wrote:

> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53844
> 
> Edward Rosten <ed at edrosten dot com> changed:
> 
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>           Component|tree-optimization           |middle-end
> 
> --- Comment #8 from Edward Rosten <ed at edrosten dot com> 2012-07-04 13:36:28 UTC ---
> (In reply to comment #7)
> > Fixed on trunk sofar, watching for fallout.
> 
> I pulled the latest change from SVN and tried it on the test code, with
> success.
> 
> I'm using the shortened test function:
> 
> 
> void test(const Vector<>& in, Vector<>& out, int i)
> {
>     out = in*1*1*1*1;
> }
> 
> If I change the test function to:
> 
> 
> void test(const Vector<>& in, Vector<>& out, int i)
> {
>     const Vector<ScalarMulExpr<ScalarMulExpr<ScalarMulExpr<ScalarMulExpr<VBase>
> > > > >& v = in*1*1*1*1;
>     out = v;
> }

I can at least see that you are using no longer live variables:

<bb 2>:
  D.2391 ={v} {CLOBBER};
  D.2396 ={v} {CLOBBER};

<bb 3>:
  # i_36 = PHI <i_35(3), 0(2)>
  D.2928_28 = MEM[(struct VBase *)out_3(D)].my_data;
  D.2929_30 = (long unsigned int) i_36;
  D.2930_31 = D.2929_30 * 8;
  D.2927_32 = D.2928_28 + D.2930_31;
  D.2948_44 = MEM[(const struct ScalarMulExpr *)&D.2391].vec;

here D.2391 is already dead.  So possibly you are returning references
to temporaries somewhere.



More information about the Gcc-bugs mailing list