(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
ubsan/
overflow-vec-1.c
       1  /* { dg-do run } */
       2  /* { dg-options "-Wno-psabi -fsanitize=signed-integer-overflow -Wno-unused-variable -fno-sanitize-recover=signed-integer-overflow" } */
       3  
       4  #define SCHAR_MAX __SCHAR_MAX__
       5  #define SCHAR_MIN (-__SCHAR_MAX__ - 1)
       6  #define SHRT_MAX __SHRT_MAX__
       7  #define SHRT_MIN (-__SHRT_MAX__ - 1)
       8  #define INT_MAX __INT_MAX__
       9  #define INT_MIN (-__INT_MAX__ - 1)
      10  
      11  typedef signed char VC __attribute__((vector_size (16)));
      12  typedef short VS __attribute__((vector_size (8 * sizeof (short))));
      13  typedef int VI __attribute__((vector_size (4 * sizeof (int))));
      14  typedef int VI2 __attribute__((vector_size (16 * sizeof (int))));
      15  
      16  void __attribute__((noinline,noclone))
      17  checkvc (VC i, VC j)
      18  {
      19    if (__builtin_memcmp (&i, &j, sizeof (VC)))
      20      __builtin_abort ();
      21  }
      22  
      23  void __attribute__((noinline,noclone))
      24  checkvs (VS i, VS j)
      25  {
      26    if (__builtin_memcmp (&i, &j, sizeof (VS)))
      27      __builtin_abort ();
      28  }
      29  
      30  void __attribute__((noinline,noclone))
      31  checkvi (VI i, VI j)
      32  {
      33    if (__builtin_memcmp (&i, &j, sizeof (VI)))
      34      __builtin_abort ();
      35  }
      36  
      37  void __attribute__((noinline,noclone))
      38  checkvi2 (VI2 i, VI2 j)
      39  {
      40    if (__builtin_memcmp (&i, &j, sizeof (VI2)))
      41      __builtin_abort ();
      42  }
      43  
      44  VI __attribute__((noinline,noclone))
      45  foo (VI i)
      46  {
      47    return -i;
      48  }
      49  
      50  VS __attribute__((noinline,noclone))
      51  bar (VS i, VS j)
      52  {
      53    return i + j;
      54  }
      55  
      56  int
      57  main (void)
      58  {
      59    /* Check that for a vector operation, only the first element with UB is reported.  */
      60    volatile VC a = (VC) { 0, SCHAR_MAX - 2, SCHAR_MAX - 2, 3, 2, 3, 4, 5,  0, 7,  1,  2,  3, 4,  SCHAR_MAX - 13, SCHAR_MAX };
      61    volatile VC b = (VC) { 5, 2,		   1,		  5, 0, 1, 2, 7,  8, 9,  10, 11, 6, -2, 13,	        0 };
      62    volatile VC k = b + a;
      63    checkvc (k,	  (VC) { 5, SCHAR_MAX,     SCHAR_MAX - 1, 8, 2, 4, 6, 12, 8, 16, 11, 13, 9, 2,  SCHAR_MAX,      SCHAR_MAX });
      64    k = a + b;
      65    checkvc (k,     (VC) { 5, SCHAR_MAX,     SCHAR_MAX - 1, 8, 2, 4, 6, 12, 8, 16, 11, 13, 9, 2,  SCHAR_MAX,      SCHAR_MAX });
      66  
      67    volatile VS c = (VS) { 0, SHRT_MAX - 2, SHRT_MAX - 2, 3, 3, 4,  SHRT_MAX - 13, SHRT_MAX };
      68    volatile VS d = (VS) { 5, 2,		  -3,		5, 6, -2, 13,	         -1 };
      69    volatile VS l = d + c;
      70    checkvs (l,	  (VS) { 5, SHRT_MAX,     SHRT_MAX - 5, 8, 9, 2,  SHRT_MAX,      SHRT_MAX - 1 });
      71    l = bar (c, d);
      72    checkvs (l,     (VS) { 5, SHRT_MAX,     SHRT_MAX - 5, 8, 9, 2,  SHRT_MAX,      SHRT_MAX - 1 });
      73  
      74    volatile VI e = (VI) { INT_MAX - 4, INT_MAX - 5, INT_MAX - 13, INT_MAX };
      75    volatile VI f = (VI) { 4,	      -6,	   13,	         0 };
      76    volatile VI m = f + e;
      77    checkvi (m,	  (VI) { INT_MAX,     INT_MAX - 11,INT_MAX,      INT_MAX });
      78    m = e + f;
      79    checkvi (m,     (VI) { INT_MAX,     INT_MAX - 11,INT_MAX,      INT_MAX });
      80  
      81    volatile VI2 g = (VI2) { 0, INT_MAX - 2, INT_MAX - 2, 3, 3, 4,  INT_MAX - 13, INT_MAX };
      82    volatile VI2 h = (VI2) { 5, 2,	   -5,		5, 6, -2, 13,	        -1 };
      83    volatile VI2 n = h + g;
      84    checkvi2 (n,	   (VI2) { 5, INT_MAX,     INT_MAX - 7, 8, 9, 2,  INT_MAX,      INT_MAX - 1 });
      85    n = g + h;
      86    checkvi2 (n,     (VI2) { 5, INT_MAX,     INT_MAX - 7, 8, 9, 2,  INT_MAX,      INT_MAX - 1 });
      87  
      88    volatile VC a2 = k - b;
      89    checkvc (a2, a);
      90    volatile VC b2 = k - a;
      91    checkvc (b2, b);
      92  
      93    volatile VS c2 = l - d;
      94    checkvs (c2, c);
      95    volatile VS d2 = l - c;
      96    checkvs (d2, d);
      97  
      98    volatile VI e2 = m - f;
      99    checkvi (e2, e);
     100    volatile VI f2 = m - e;
     101    checkvi (f2, f);
     102  
     103    volatile VI2 g2 = n - h;
     104    checkvi2 (g2, g);
     105    volatile VI2 h2 = n - g;
     106    checkvi2 (h2, h);
     107  
     108    a	    = (VC) { 0,         SCHAR_MAX / 4, SCHAR_MAX / 4, 3, 2, 3, 4, 5, 0, 7, 1, 2, 3, 4, SCHAR_MAX - 13, SCHAR_MAX };
     109    b	    = (VC) { SCHAR_MAX, 4,	       3,	      2, 3, 4, 5, 2, 9, 2, 9, 1, 0, 8, 1,	       1 };
     110    k = a * b;
     111    checkvc (k, (VC) { 0,		124,	       93,	      6, 6,12,20,10, 0,14, 9, 2, 0,32, SCHAR_MAX - 13, SCHAR_MAX });
     112  
     113    c	    = (VS) { 0,		SHRT_MAX / 8, SHRT_MAX / 7, 5, 8, 9, SHRT_MAX - 10, SHRT_MAX };
     114    d	    = (VS) { SHRT_MAX,  8,	      6,	    2, 3, 4, 1,		    1 };
     115    l = c * d;
     116    checkvs (l, (VS) { 0,		32760,	      28086,	   10,24,36, SHRT_MAX - 10, SHRT_MAX });
     117  
     118    e	    = (VI) { INT_MAX,	INT_MAX / 5,  INT_MAX / 6, INT_MAX };
     119    f	    = (VI) { 0,		5,	      5,	   1 };
     120    m = e * f;
     121    checkvi (m, (VI) { 0,		2147483645,   1789569705,  INT_MAX });
     122  
     123    g	    = (VI2) { INT_MAX,	INT_MAX / 9,  INT_MAX / 8, 5, 6, 7, 8, INT_MAX };
     124    h	    = (VI2) { 0,	8,	      8,	   2, 3, 4, 5, 1 };
     125    n = g * h;
     126    checkvi2 (n,(VI2) { 0,	1908874352,   2147483640, 10,18,28,40, INT_MAX });
     127  
     128    a	    = (VC) { 5, 7, 8, 9, SCHAR_MAX, SCHAR_MIN + 1, 24, 32, 0, 1, 2, 3, 4, 5, SCHAR_MAX, SCHAR_MIN + 2 };
     129    k = -a;
     130    checkvc (k, (VC) {-5,-7,-8,-9,-SCHAR_MAX, SCHAR_MAX,	  -24,-32, 0,-1,-2,-3,-4,-5,-SCHAR_MAX, SCHAR_MAX - 1 });
     131  
     132    c	    = (VS) { 0, 7, 23, SHRT_MIN + 1, SHRT_MIN + 2, SHRT_MAX, 2, 5 };
     133    l = -c;
     134    checkvs (l, (VS) { 0,-7,-23, SHRT_MAX,     SHRT_MAX - 1,-SHRT_MAX,-2,-5 });
     135  
     136    e	    = (VI) { 5, INT_MAX, INT_MIN + 1, INT_MIN + 2 };
     137    m = foo (e);
     138    checkvi (m, (VI) {-5,-INT_MAX, INT_MAX,     INT_MAX - 1 });
     139  
     140    g	     = (VI2) { 10, 11, 0, INT_MAX - 2, 1, INT_MIN + 1, 5, INT_MIN / 2 };
     141    n = -g;
     142    checkvi2 (n, (VI2) {-10,-11, 0,-INT_MAX + 2,-1, INT_MAX,    -5, INT_MAX / 2 + 1 });
     143    return 0;
     144  }