1/* { dg-require-effective-target vect_float } */
2
3#include <stdarg.h>
4#include "tree-vect.h"
5
6#define N 256
7
8float pa[N] __attribute__ ((__aligned__(16)));
9float pb[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57};
10float pc[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
11
12/* Check handling of unaligned accesses when the misalignment is
13   known at compile time and different accesses have the same
14   misalignment (e.g. peeling to align one access will align all
15   accesses with the same misalignment.  Also, the number of
16   peeled iterations is known in this case, and the vectorizer
17   can use this information (generate prolog and epilog loops
18   with known number of iterations, and only if needed).  */
19
20int
21main1 ()
22{
23  int i;
24
25  for (i = 0; i < 5; i++)
26    {
27      pa[i+1] = pb[i+1] * pc[i+1];
28    }
29
30  /* check results:  */
31  for (i = 0; i < 5; i++)
32    {
33      if (pa[i+1] != (pb[i+1] * pc[i+1]))
34	abort ();
35    }
36
37  return 0;
38}
39
40int
41main2 ()
42{
43  int i;
44
45  for (i = 0; i < 6; i++)
46    {
47      pa[i+1] = pb[i+1] * pc[i+1];
48    }
49
50  /* check results:  */
51  for (i = 0; i < 6; i++)
52    {
53      if (pa[i+1] != (pb[i+1] * pc[i+1]))
54	abort ();
55    }
56
57  return 0;
58}
59
60int
61main3 (int n)
62{
63  int i;
64
65  for (i = 0; i < n; i++)
66    {
67      pa[i+1] = pb[i+1] * pc[i+1];
68    }
69
70  /* check results:  */
71  for (i = 0; i < n; i++)
72    {
73      if (pa[i+1] != (pb[i+1] * pc[i+1]))
74	abort ();
75    }
76
77  return 0;
78}
79
80int main (void)
81{
82  int i;
83
84  check_vect ();
85
86  main1 ();
87  main2 ();
88  main3 (N-1);
89
90  return 0;
91}
92
93/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" } } */
94/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
95/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 3 "vect" } } */
96/* { dg-final { cleanup-tree-dump "vect" } } */
97