libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / vect / vect-multi-peel-gaps.c
blob033c3587f1b20eb15379c5367af9583f858464f2
1 /* For some targets we end up vectorizing the below loop such that the `sp`
2 single integer is loaded into a 4 integer vector.
3 While the writes are all safe, without 2 scalar loops being peeled into the
4 epilogue we would read past the end of the 31 integer array. This happens
5 because we load a 4 integer chunk to only use the first integer and
6 increment by 2 integers at a time, hence the last load needs s[30-33] and
7 the penultimate load needs s[28-31].
8 This testcase ensures that we do not crash due to that behaviour. */
9 /* { dg-require-effective-target mmap } */
10 #include <sys/mman.h>
11 #include <stdio.h>
12 #include "tree-vect.h"
14 #define MMAP_SIZE 0x20000
15 #define ADDRESS 0x1122000000
17 #define MB_BLOCK_SIZE 16
18 #define VERT_PRED_16 0
19 #define HOR_PRED_16 1
20 #define DC_PRED_16 2
21 int *sptr;
22 extern void intrapred_luma_16x16();
23 unsigned short mprr_2[5][16][16];
24 void initialise_s(int *s) { }
25 int main() {
26 void *s_mapping;
27 void *end_s;
28 check_vect ();
29 s_mapping = mmap ((void *)ADDRESS, MMAP_SIZE, PROT_READ | PROT_WRITE,
30 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
31 if (s_mapping == MAP_FAILED)
33 perror ("mmap");
34 return 1;
36 end_s = (s_mapping + MMAP_SIZE);
37 sptr = (int*)(end_s - sizeof(int[31]));
38 intrapred_luma_16x16(sptr);
39 return 0;
42 void intrapred_luma_16x16(int * restrict sp) {
43 for (int j=0; j < MB_BLOCK_SIZE; j++)
45 mprr_2[VERT_PRED_16][j][0]=sp[j*2];
46 mprr_2[VERT_PRED_16][j][1]=sp[j*2];
47 mprr_2[VERT_PRED_16][j][2]=sp[j*2];
48 mprr_2[VERT_PRED_16][j][3]=sp[j*2];
49 mprr_2[VERT_PRED_16][j][4]=sp[j*2];
50 mprr_2[VERT_PRED_16][j][5]=sp[j*2];
51 mprr_2[VERT_PRED_16][j][6]=sp[j*2];
52 mprr_2[VERT_PRED_16][j][7]=sp[j*2];
53 mprr_2[VERT_PRED_16][j][8]=sp[j*2];
54 mprr_2[VERT_PRED_16][j][9]=sp[j*2];
55 mprr_2[VERT_PRED_16][j][10]=sp[j*2];
56 mprr_2[VERT_PRED_16][j][11]=sp[j*2];
57 mprr_2[VERT_PRED_16][j][12]=sp[j*2];
58 mprr_2[VERT_PRED_16][j][13]=sp[j*2];
59 mprr_2[VERT_PRED_16][j][14]=sp[j*2];
60 mprr_2[VERT_PRED_16][j][15]=sp[j*2];
63 /* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" {target { vect_int && vect_perm } } } } */