summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/pr48616.c
blob: 6cad235c4b4fd9672174fd1d77f14494c4445387 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* PR tree-optimization/48616 */
/* { dg-do run } */
/* { dg-options "-O2 -ftree-vectorize" } */
/* { dg-options "-O2 -ftree-vectorize -fno-common" { target alpha*-dec-osf* hppa*-*-hpux* } } */

extern void abort (void);
int a[4] __attribute__((aligned (32)));
int b[4] __attribute__((aligned (32)));
int c[4] __attribute__((aligned (32)));
int d[4] __attribute__((aligned (32)));
int e[4] __attribute__((aligned (32)));

__attribute__((noinline, noclone))
int
foo (int x)
{
  asm ("" : "+r" (x));
  return x;
}

__attribute__((noinline, noclone))
void
fn1 (int i)
{
  a[0] = b[0] << c[0];
  a[1] = b[1] << c[1];
  a[2] = b[2] << c[2];
  a[3] = b[3] << c[3];
  if (i)
    {
      d[0] = e[0] >> c[0];
      d[1] = e[1] >> c[1];
      d[2] = e[2] >> c[2];
      d[3] = e[3] >> c[3];
    }
}

__attribute__((noinline, noclone))
void
fn2 (int i)
{
  a[0] = b[0] << 1;
  a[1] = b[1] << 2;
  a[2] = b[2] << 3;
  a[3] = b[3] << 4;
  if (i)
    {
      d[0] = e[0] >> 1;
      d[1] = e[1] >> 2;
      d[2] = e[2] >> 3;
      d[3] = e[3] >> 4;
    }
}

__attribute__((noinline, noclone))
void
fn3 (int i, int j)
{
  int x = foo (j);
  a[0] = b[0] << x;
  a[1] = b[1] << x;
  a[2] = b[2] << x;
  a[3] = b[3] << x;
  if (i)
    {
      d[0] = e[0] >> x;
      d[1] = e[1] >> x;
      d[2] = e[2] >> x;
      d[3] = e[3] >> x;
    }
}

__attribute__((noinline, noclone))
void
fn4 (int i)
{
  a[0] = b[0] << 1;
  a[1] = b[1] << 1;
  a[2] = b[2] << 1;
  a[3] = b[3] << 1;
  if (i)
    {
      d[0] = e[0] >> 1;
      d[1] = e[1] >> 1;
      d[2] = e[2] >> 1;
      d[3] = e[3] >> 1;
    }
}

int
main ()
{
  int i;
  int *t;
  for (i = 0; i < 4; i++)
    {
      b[i] = 32;
      c[i] = i + 1;
      e[i] = 32;
    }
  asm volatile ("" : : "r" (b) : "memory");
  asm volatile ("" : : "r" (c) : "memory");
  asm volatile ("" : "=r" (t) : "0" (d) : "memory");
  fn1 (t != 0);
  for (i = 0; i < 4; i++)
    {
      if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
	abort ();
      a[i] = 0;
      d[i] = 0;
    }
  fn2 (t != 0);
  for (i = 0; i < 4; i++)
    {
      if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
	abort ();
      a[i] = 0;
      d[i] = 0;
    }
  fn3 (t != 0, t != 0);
  for (i = 0; i < 4; i++)
    {
      if (a[i] != (32 << 1) || d[i] != (32 >> 1))
	abort ();
      a[i] = 0;
      d[i] = 0;
    }
  fn4 (t != 0);
  for (i = 0; i < 4; i++)
    {
      if (a[i] != (32 << 1) || d[i] != (32 >> 1))
	abort ();
    }
  return 0;
}