------- Additional Comments From pinskia at gcc dot gnu dot org 2004-12-24 20:36 ------- Reduced testcase: const int LMAX = 4; const int LMAX41 = 4*LMAX+1; const int LMAX12 = (LMAX+1)*(LMAX+2)/2; template<int n> inline double accu1( const double* p1, const double* p2 ) { double d = *p1 * *p2; return d + accu1<n-1>( ++p1, ++p2 ); } template <> inline double accu1<0>( const double* p1, const double* p2 ) { return p1[0] * p2[0]; } template <int ny, int nz> inline double accu2( const double* py, const double* pz, const double* h ) { const double d = accu1<nz>( pz, h ) * *py; if( ny == 0 ) return d; return d + accu2<(ny ? ny-1 : -1), (ny ? nz : -1 )>( ++py, pz, ++h ); } template<> inline double accu2<-1, -1>( const double* , const double* , const double* ) { return 0.0; } template <int ny, int nz> inline double accu( const double* py, const double* pz, const double* h ) { if( ny == 0 ) return accu1<nz>( pz, h ); else if( nz == 0 ) return accu1<ny>( py, h ); else if( nz >= ny ) return accu2<ny, nz>( py, pz, h ); else return accu2<nz, ny>( pz, py, h ); } template <> inline double accu<0,0>( const double* , const double* , const double* h ) { return *h; } #define SWYZ( Y, Z ) ((Y+Z) * (Y+Z+1) / 2+Z) #define CASA( Y, Z ) case SWYZ( Y, Z ): \ *ap1 = accu<Y, Z>( py, pz, dxb ); \ if( z1 == 0 ) break; \ ++ap1; \ z1--; py += LMAX41; pz -= LMAX41; #define CAS( Y, Z ) case SWYZ( Y, Z ): *ap1 = accu<Y, Z>( py, pz, dxb ); break #define CAS1( Y ) CASA( Y, 1 ); CAS( Y+1, 0 ); #define CAS2( Y ) CASA( Y, 2 ); CAS1( Y+1 ); #define CAS3( Y ) CASA( Y, 3 ); CAS2( Y+1 ); #define CAS4( Y ) CASA( Y, 4 ); CAS3( Y+1 );
double f(const double *py, const double *pz, double *dxb, double *ap1, int mh_z1234, unsigned int z1) { switch( mh_z1234 ) { CAS( 0, 0 ); CAS1(0); CAS2(0); CAS3(0); CAS4(0); } } When we do -O3 or -O2, we don't inline accu1<1> into accu1<2> at all, why????????? -- What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed|2004-10-06 18:40:54 |2004-12-24 20:36:17 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17863