1 /* { dg-require-effective-target vect_int } */
2 
3 #include <stdarg.h>
4 #include "tree-vect.h"
5 
6 #define N 512
7 
8 /* These multiplications should be vectorizable with additions when
9    no vector shift is available.  */
10 
11 __attribute__ ((noinline)) void
foo(int * arr)12 foo (int *arr)
13 {
14   for (int i = 0; i < N; i++)
15     arr[i] *= 2;
16 }
17 
18 __attribute__ ((noinline)) void
foo2(int * arr)19 foo2 (int *arr)
20 {
21   for (int i = 0; i < N; i++)
22     arr[i] *= 4;
23 }
24 
25 int
main(void)26 main (void)
27 {
28   check_vect ();
29   int data[N];
30   int i;
31 
32   for (i = 0; i < N; i++)
33     {
34       data[i] = i;
35       __asm__ volatile ("");
36     }
37 
38   foo (data);
39   for (i = 0; i < N; i++)
40     {
41       if (data[i] / 2 != i)
42       __builtin_abort ();
43       __asm__ volatile ("");
44     }
45 
46   for (i = 0; i < N; i++)
47     {
48       data[i] = i;
49       __asm__ volatile ("");
50     }
51 
52   foo2 (data);
53   for (i = 0; i < N; i++)
54     {
55       if (data[i] / 4 != i)
56       __builtin_abort ();
57       __asm__ volatile ("");
58     }
59 
60   return 0;
61 }
62 
63 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */
64