aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/vect/slp-reduc-sad.c
blob: 5f7a3e09f60cec6c4559d5ddf648f6954febbd1a (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
/* { dg-require-effective-target vect_usad_char } */

#include "tree-vect.h"

typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;

extern int abs (int);
extern void abort (void);

int __attribute__((noinline,noclone))
foo (uint8_t *pix1, uint8_t *pix2, int i_stride_pix2)
{
  int i_sum = 5;
  for( int y = 0; y < 16; y++ )
    {
      i_sum += abs ( pix1[0] - pix2[0] );
      i_sum += abs ( pix1[1] - pix2[1] );
      i_sum += abs ( pix1[2] - pix2[2] );
      i_sum += abs ( pix1[3] - pix2[3] );
      i_sum += abs ( pix1[4] - pix2[4] );
      i_sum += abs ( pix1[5] - pix2[5] );
      i_sum += abs ( pix1[6] - pix2[6] );
      i_sum += abs ( pix1[7] - pix2[7] );
      i_sum += abs ( pix1[8] - pix2[8] );
      i_sum += abs ( pix1[9] - pix2[9] );
      i_sum += abs ( pix1[10] - pix2[10] );
      i_sum += abs ( pix1[11] - pix2[11] );
      i_sum += abs ( pix1[12] - pix2[12] );
      i_sum += abs ( pix1[13] - pix2[13] );
      i_sum += abs ( pix1[14] - pix2[14] );
      i_sum += abs ( pix1[15] - pix2[15] );
      pix1 += 16;
      pix2 += i_stride_pix2;
    }
  return i_sum; 
}

int
main ()
{
  check_vect ();

  uint8_t X[16*16];
  uint8_t Y[16*16];

  for (int i = 0; i < 16*16; ++i)
    {
      X[i] = i;
      Y[i] = 16*16 - i;
      __asm__ volatile ("");
    }

  if (foo (X, Y, 16) != 32512 + 5)
    abort ();

  return 0;
}

/* { dg-final { scan-tree-dump "vect_recog_sad_pattern: detected" "vect" } } */
/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */