1 /* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */
2 /* { dg-options "-O2 -fprefetch-loop-arrays -march=amdfam10 --param min-insn-to-prefetch-ratio=5 -fdump-tree-aprefetch-details" } */
3 
4 /* These are common idioms for writing variable-length arrays at the end
5    of structures.  We should not deduce anything about the number of iterations
6    of the loops from them.  */
7 
8 struct tail0
9 {
10   int xxx;
11   int yyy[0];
12 };
13 
loop0(int n,struct tail0 * x)14 int loop0 (int n, struct tail0 *x)
15 {
16   int i, s = 0;
17 
18   for (i = 0; i < n; i++)
19     s += x->yyy[i];
20 
21   return s;
22 }
23 
24 struct tail1
25 {
26   int xxx;
27   int yyy[1];
28 };
loop1(int n,struct tail1 * x)29 int loop1 (int n, struct tail1 *x)
30 {
31   int i, s = 0;
32 
33   for (i = 0; i < n; i++)
34     s += x->yyy[i];
35 
36   return s;
37 }
38 
39 /* It is unlikely that this should be a tail array.  We may deduce that most
40    likely, the loop iterates about 5 times, and the array is not worth prefetching.  */
41 
42 struct tail5
43 {
44   int xxx;
45   int yyy[5];
46 };
loop5(int n,struct tail5 * x)47 int loop5 (int n, struct tail5 *x)
48 {
49   int i, s = 0;
50 
51   for (i = 0; i < n; i++)
52     s += x->yyy[i];
53 
54   return s;
55 }
56 
57 /* Until we are able to track likely upper bounds, we can't really work out that
58    small trailing arrays should not be prefetched.  */
59 /* { dg-final { scan-tree-dump-times "Issued prefetch" 2 "aprefetch"  } } */
60 /* { dg-final { scan-tree-dump-times "Not prefetching" 1 "aprefetch"  } } */
61