[gnu.g++.bug] optimization missed

grunwald@flute.cs.uiuc.edu (Dirk Grunwald) (07/26/89)

g++-1.35.1+, sun3/os4, -m68881

G++ doesn't notice that the variable `stride' is an induction variable
in the following code; stride is a private member variable. It is not
modified anywhere but at the beginning of the loop.  It should qualify
as an induction variable, but I don't think it's being considered for
this.

//--------------- C++ header to handle arrays like fortran.
class Matrix {				// by dave nichols
private:
    int *index;
    double *data;
    int stride;
public:
    Matrix( int n1, int n2, int *indx, double *dat);
    double& operator()( int i, int j );
};

static inline double&
Matrix::operator()( int i, int j ) {
    return ( data[i + j * stride ] );
}

static inline
Matrix::Matrix( int n1, int n2, int *indx, double *dat) {
    index = indx;
    data = dat;
//    for( int i =0; i<n2; i++ ) {
//	index[i] = i*n1;
//    }
    stride = n1;
}

#include <stdio.h>
#include <math.h>
#include <generic.h>

#define MATRIX(name,n1,n2)\
    int name2(name,index)[n1];\
	double name2(name,data)[n1*n2]; \
	    Matrix name(n1, n2, name2(name,index), name2(name,data));

main () {
    int	i, j, k;

    static const int n=200;
    MATRIX(x,n,n);

    double	total=0.;

    for( i=0; i<n; i++ )
	for( j=0; j<n; j++ )
	    x(i,j) = sqrt(1.+(i+1)+(j+1));
    for( i=0; i<n; i++ )
	for( j=0; j<n; j++ )
	    for( k=0; k<n; k++ )
		total = total + x(i,k) * x(k,j);
    printf("total=%f\n    1576677724. if double precision\n",
	   (double) total );
}
//   7.0sec	1575556480. 	DEC 3100  (f77 -O3)
//  13.1sec	1575559552	DEC 3100  (C++ -O2)
//
--
Dirk Grunwald -- Univ. of Illinois 		  (grunwald@flute.cs.uiuc.edu)