1 /* { dg-require-effective-target size32plus } */
2 /* { dg-additional-options "-O2 -fopenmp -fdump-tree-vect-details" } */
3 /* { dg-additional-options "-msse2" { target sse2_runtime } } */
4 /* { dg-additional-options "-mavx" { target avx_runtime } } */
5 /* { dg-final { scan-tree-dump-times "vectorized \[2-6] loops" 2 "vect" { target sse2_runtime } } } */
7 extern void abort (void);
8 int r
, a
[1024], b
[1024];
9 unsigned short r2
, b2
[1024];
10 unsigned char r3
, b3
[1024];
12 __attribute__((noipa
)) void
13 foo (int *a
, int *b
, unsigned short *b2
, unsigned char *b3
)
15 #pragma omp for simd reduction (inscan, +:r, r2, r3)
16 for (int i
= 0; i
< 1024; i
++)
23 #pragma omp scan exclusive(r, r2, r3)
24 { r
+= a
[i
]; r2
+= a
[i
]; r3
+= a
[i
]; }
28 __attribute__((noipa
)) int
29 bar (unsigned short *s2p
, unsigned char *s3p
)
32 unsigned short s2
= 0;
35 #pragma omp for simd reduction (inscan, +:s, s2, s3)
36 for (int i
= 0; i
< 1024; i
++)
38 { b
[i
] = s
; b2
[i
] = s2
; b3
[i
] = s3
; }
39 #pragma omp scan exclusive(s, s2, s3)
51 __attribute__((noipa
)) void
52 baz (int *a
, int *b
, unsigned short *b2
, unsigned char *b3
)
54 #pragma omp parallel for simd reduction (inscan, +:r, r2, r3) if (simd: 0)
55 for (int i
= 0; i
< 1024; i
++)
62 #pragma omp scan exclusive(r, r2, r3)
71 __attribute__((noipa
)) int
72 qux (unsigned short *s2p
, unsigned char *s3p
)
75 unsigned short s2
= 0;
77 #pragma omp parallel for simd simdlen (1) reduction (inscan, +:s, s2, s3)
78 for (int i
= 0; i
< 1024; i
++)
80 { b
[i
] = s
; b2
[i
] = s2
; b3
[i
] = s3
; }
81 #pragma omp scan exclusive(s, s2, s3)
82 { s
+= 2 * a
[i
]; s2
+= 2 * a
[i
]; s3
+= 2 * a
[i
]; }
95 for (int i
= 0; i
< 1024; ++i
)
105 if (r
!= 1024 * 1023 / 2
106 || r2
!= (unsigned short) r
107 || r3
!= (unsigned char) r
)
109 for (int i
= 0; i
< 1024; ++i
)
112 || b2
[i
] != (unsigned short) s
113 || b3
[i
] != (unsigned char) s
)
123 if (bar (&s2
, &s3
) != 1024 * 1023)
125 if (s2
!= (unsigned short) (1024 * 1023)
126 || s3
!= (unsigned char) (1024 * 1023))
129 for (int i
= 0; i
< 1024; ++i
)
132 || b2
[i
] != (unsigned short) s
133 || b3
[i
] != (unsigned char) s
)
147 if (r
!= 1024 * 1023 / 2
148 || r2
!= (unsigned short) r
149 || r3
!= (unsigned char) r
)
152 for (int i
= 0; i
< 1024; ++i
)
155 || b2
[i
] != (unsigned short) s
156 || b3
[i
] != (unsigned char) s
)
168 if (qux (&s2
, &s3
) != 1024 * 1023)
170 if (s2
!= (unsigned short) (1024 * 1023)
171 || s3
!= (unsigned char) (1024 * 1023))
174 for (int i
= 0; i
< 1024; ++i
)
177 || b2
[i
] != (unsigned short) s
178 || b3
[i
] != (unsigned char) s
)