6760a5b185176e781afb3dded2e09793b3cf7ba6
[gcc.git] / gcc / testsuite / g++.dg / tree-ssa / ivopts-3.C
1 // { dg-do compile }
2 // { dg-options "-O2 -fdump-tree-ivopts-details" }
3
4 class MinimalVec3
5 {
6 protected:
7 double coords[3];
8
9 public:
10
11 MinimalVec3( ) {
12 for ( int i = 0; i < 3; ++i )
13 coords[i] = 0.;
14 }
15
16 inline const double& operator[] ( int I ) const {
17 return coords[I];
18 }
19 };
20
21 class MinimalVector
22 {
23 protected:
24 double *_pData;
25 double stuff;
26
27 public:
28 explicit MinimalVector ( int length ) {
29 _pData = new double[length];
30 for (int i = 0; i < length; ++i) _pData[i] = 0.;
31 }
32
33 inline double& operator[] ( int I ) {
34 return _pData[I];
35 }
36
37 inline const double& operator[] ( int I ) const {
38 return _pData[I];
39 }
40 };
41
42
43 int main ( int , char** ) {
44 int w = ( 1 << 7 )+1;
45 int wsqr = w*w;
46 int wcub = w*w*w;
47
48 MinimalVec3 * rows[9];
49 for ( int i = 0; i < 9; ++i ) {
50 rows[i] = new MinimalVec3[wcub];
51 }
52
53 MinimalVector img ( wcub ), res ( wcub );
54
55 for ( int c = 0; c < 1000; ++c ) {
56
57 for ( int i = 1; i < w-1; ++i )
58 for ( int j = 0; j < 3; ++j ) {
59
60 for ( int k = 1; k < w - 1; ++k )
61 for ( int l = 0; l < 3; ++l ) {
62
63 for ( int m = 1; m < w - 1; ++m )
64 for ( int n = 0; n < 3; ++n )
65 res[i*wsqr + k*w + m] += img[( i + j - 1 ) *wsqr + ( k + l - 1 ) *w + m + n - 1] * rows[j*3 + l][i*wsqr + k*w + m][n];
66
67 }
68 }
69 }
70 return 0;
71 }
72
73 // Verify that on x86_64 and i?86 we unroll the innsermost loop and
74 // use three IVs for the then innermost loop
75
76 // { dg-final { scan-tree-dump "Selected IV set for loop \[0-9\]* at \[^ \]*:63, 127 avg niters, 3 IVs" "ivopts" { target x86_64-*-* i?86-*-* } } }
77 // { dg-final { scan-tree-dump-not "Selected IV set for loop \[0-9\]* at \[^ \]*:64" "ivopts" { target x86_64-*-* i?86-*-* } } }