Do not cost the permute node that are part of SLP load-lanes
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / scan-16.C
blob3fb6135c343c29dd1e031ec4f231b438a817e7b1
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 "C" void abort ();
9 struct S {
10   inline S ();
11   inline ~S ();
12   inline S (const S &);
13   inline S & operator= (const S &);
14   int s;
17 S::S () : s (0)
21 S::~S ()
25 S::S (const S &x)
27   s = x.s;
30 S &
31 S::operator= (const S &x)
33   s = x.s;
34   return *this;
37 static inline void
38 ini (S &x)
40   x.s = 0;
43 S r, a[1024], b[1024];
45 #pragma omp declare reduction (+: S: omp_out.s += omp_in.s)
46 #pragma omp declare reduction (plus: S: omp_out.s += omp_in.s) initializer (ini (omp_priv))
48 __attribute__((noipa)) void
49 foo (S *a, S *b, S &r)
51   #pragma omp for simd simdlen (1) reduction (inscan, +:r)
52   for (int i = 0; i < 1024; i++)
53     {
54       b[i] = r;
55       #pragma omp scan exclusive(r)
56       r.s += a[i].s;
57     }
60 __attribute__((noipa)) S
61 bar (void)
63   S s;
64   #pragma omp parallel
65   #pragma omp for simd if (0) reduction (inscan, plus:s)
66   for (int i = 0; i < 1024; i++)
67     {
68       b[i] = s;
69       #pragma omp scan exclusive(s)
70       s.s += 2 * a[i].s;
71     }
72   return s;
75 __attribute__((noipa)) void
76 baz (S *a, S *b, S &r)
78   #pragma omp parallel for simd reduction (inscan, +:r)
79   for (int i = 0; i < 1024; i++)
80     {
81       b[i] = r;
82       #pragma omp scan exclusive(r)
83       r.s += a[i].s;
84     }
87 __attribute__((noipa)) S
88 qux (void)
90   S s;
91   #pragma omp parallel for simd reduction (inscan, plus:s)
92   for (int i = 0; i < 1024; i++)
93     {
94       b[i] = s;
95       #pragma omp scan exclusive(s)
96       s.s += 2 * a[i].s;
97     }
98   return s;
102 main ()
104   S s;
105   for (int i = 0; i < 1024; ++i)
106     {
107       a[i].s = i;
108       b[i].s = -1;
109       asm ("" : "+g" (i));
110     }
111   #pragma omp parallel
112   foo (a, b, r);
113   if (r.s != 1024 * 1023 / 2)
114     abort ();
115   for (int i = 0; i < 1024; ++i)
116     {
117       if (b[i].s != s.s)
118         abort ();
119       else
120         b[i].s = 25;
121       s.s += i;
122     }
123   if (bar ().s != 1024 * 1023)
124     abort ();
125   s.s = 0;
126   for (int i = 0; i < 1024; ++i)
127     {
128       if (b[i].s != s.s)
129         abort ();
130       s.s += 2 * i;
131     }
132   r.s = 0;
133   baz (a, b, r);
134   if (r.s != 1024 * 1023 / 2)
135     abort ();
136   s.s = 0;
137   for (int i = 0; i < 1024; ++i)
138     {
139       if (b[i].s != s.s)
140         abort ();
141       else
142         b[i].s = 25;
143       s.s += i;
144     }
145   if (qux ().s != 1024 * 1023)
146     abort ();
147   s.s = 0;
148   for (int i = 0; i < 1024; ++i)
149     {
150       if (b[i].s != s.s)
151         abort ();
152       s.s += 2 * i;
153     }