(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
pr48616.c
       1  /* PR tree-optimization/48616 */
       2  /* { dg-do run } */
       3  /* { dg-options "-O2 -ftree-vectorize" } */
       4  /* { dg-additional-options "-fno-common" { target hppa*-*-hpux* } } */
       5  /* { dg-skip-if "no alignment > 2" { "pdp11-*-*" } } */
       6  
       7  extern void abort (void);
       8  int a[4] __attribute__((aligned (32)));
       9  int b[4] __attribute__((aligned (32)));
      10  int c[4] __attribute__((aligned (32)));
      11  int d[4] __attribute__((aligned (32)));
      12  int e[4] __attribute__((aligned (32)));
      13  
      14  __attribute__((noinline, noclone))
      15  int
      16  foo (int x)
      17  {
      18    asm ("" : "+r" (x));
      19    return x;
      20  }
      21  
      22  __attribute__((noinline, noclone))
      23  void
      24  fn1 (int i)
      25  {
      26    a[0] = b[0] << c[0];
      27    a[1] = b[1] << c[1];
      28    a[2] = b[2] << c[2];
      29    a[3] = b[3] << c[3];
      30    if (i)
      31      {
      32        d[0] = e[0] >> c[0];
      33        d[1] = e[1] >> c[1];
      34        d[2] = e[2] >> c[2];
      35        d[3] = e[3] >> c[3];
      36      }
      37  }
      38  
      39  __attribute__((noinline, noclone))
      40  void
      41  fn2 (int i)
      42  {
      43    a[0] = b[0] << 1;
      44    a[1] = b[1] << 2;
      45    a[2] = b[2] << 3;
      46    a[3] = b[3] << 4;
      47    if (i)
      48      {
      49        d[0] = e[0] >> 1;
      50        d[1] = e[1] >> 2;
      51        d[2] = e[2] >> 3;
      52        d[3] = e[3] >> 4;
      53      }
      54  }
      55  
      56  __attribute__((noinline, noclone))
      57  void
      58  fn3 (int i, int j)
      59  {
      60    int x = foo (j);
      61    a[0] = b[0] << x;
      62    a[1] = b[1] << x;
      63    a[2] = b[2] << x;
      64    a[3] = b[3] << x;
      65    if (i)
      66      {
      67        d[0] = e[0] >> x;
      68        d[1] = e[1] >> x;
      69        d[2] = e[2] >> x;
      70        d[3] = e[3] >> x;
      71      }
      72  }
      73  
      74  __attribute__((noinline, noclone))
      75  void
      76  fn4 (int i)
      77  {
      78    a[0] = b[0] << 1;
      79    a[1] = b[1] << 1;
      80    a[2] = b[2] << 1;
      81    a[3] = b[3] << 1;
      82    if (i)
      83      {
      84        d[0] = e[0] >> 1;
      85        d[1] = e[1] >> 1;
      86        d[2] = e[2] >> 1;
      87        d[3] = e[3] >> 1;
      88      }
      89  }
      90  
      91  int
      92  main ()
      93  {
      94    int i;
      95    int *t;
      96    for (i = 0; i < 4; i++)
      97      {
      98        b[i] = 32;
      99        c[i] = i + 1;
     100        e[i] = 32;
     101      }
     102    asm volatile ("" : : "r" (b) : "memory");
     103    asm volatile ("" : : "r" (c) : "memory");
     104    asm volatile ("" : "=r" (t) : "0" (d) : "memory");
     105    fn1 (t != 0);
     106    for (i = 0; i < 4; i++)
     107      {
     108        if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
     109  	abort ();
     110        a[i] = 0;
     111        d[i] = 0;
     112      }
     113    fn2 (t != 0);
     114    for (i = 0; i < 4; i++)
     115      {
     116        if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
     117  	abort ();
     118        a[i] = 0;
     119        d[i] = 0;
     120      }
     121    fn3 (t != 0, t != 0);
     122    for (i = 0; i < 4; i++)
     123      {
     124        if (a[i] != (32 << 1) || d[i] != (32 >> 1))
     125  	abort ();
     126        a[i] = 0;
     127        d[i] = 0;
     128      }
     129    fn4 (t != 0);
     130    for (i = 0; i < 4; i++)
     131      {
     132        if (a[i] != (32 << 1) || d[i] != (32 >> 1))
     133  	abort ();
     134      }
     135    return 0;
     136  }