(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
builtin-prefetch-4.c
       1  /* Test that __builtin_prefetch does no harm.
       2  
       3     Check that the expression containing the address to prefetch is
       4     evaluated if it has side effects, even if the target does not support
       5     data prefetch.  Check changes to pointers and to array indices that are
       6     either global variables or arguments.  */
       7  
       8  #define ARRSIZE 100
       9  
      10  int arr[ARRSIZE];
      11  int *ptr = &arr[20]; 
      12  int arrindex = 4;
      13  
      14  /* Check that assignment within a prefetch argument is evaluated.  */
      15  
      16  int
      17  assign_arg_ptr (int *p)
      18  {
      19    int *q;
      20    __builtin_prefetch ((q = p), 0, 0);
      21    return q == p;
      22  }
      23  
      24  int
      25  assign_glob_ptr (void)
      26  {
      27    int *q;
      28    __builtin_prefetch ((q = ptr), 0, 0);
      29    return q == ptr;
      30  }
      31  
      32  int
      33  assign_arg_idx (int *p, int i)
      34  {
      35    int j;
      36    __builtin_prefetch (&p[j = i], 0, 0);
      37    return j == i;
      38  }
      39  
      40  int
      41  assign_glob_idx (void)
      42  {
      43    int j;
      44    __builtin_prefetch (&ptr[j = arrindex], 0, 0);
      45    return j == arrindex;
      46  }
      47  
      48  /* Check that pre/post increment/decrement within a prefetch argument are
      49     evaluated.  */
      50  
      51  int
      52  preinc_arg_ptr (int *p)
      53  {
      54    int *q;
      55    q = p + 1;
      56    __builtin_prefetch (++p, 0, 0);
      57    return p == q;
      58  }
      59  
      60  int
      61  preinc_glob_ptr (void)
      62  {
      63    int *q;
      64    q = ptr + 1;
      65    __builtin_prefetch (++ptr, 0, 0);
      66    return ptr == q;
      67  }
      68  
      69  int
      70  postinc_arg_ptr (int *p)
      71  {
      72    int *q;
      73    q = p + 1;
      74    __builtin_prefetch (p++, 0, 0);
      75    return p == q;
      76  }
      77  
      78  int
      79  postinc_glob_ptr (void)
      80  {
      81    int *q;
      82    q = ptr + 1;
      83    __builtin_prefetch (ptr++, 0, 0);
      84    return ptr == q;
      85  }
      86  
      87  int
      88  predec_arg_ptr (int *p)
      89  {
      90    int *q;
      91    q = p - 1;
      92    __builtin_prefetch (--p, 0, 0);
      93    return p == q;
      94  }
      95  
      96  int
      97  predec_glob_ptr (void)
      98  {
      99    int *q;
     100    q = ptr - 1;
     101    __builtin_prefetch (--ptr, 0, 0);
     102    return ptr == q;
     103  }
     104  
     105  int
     106  postdec_arg_ptr (int *p)
     107  {
     108    int *q;
     109    q = p - 1;
     110    __builtin_prefetch (p--, 0, 0);
     111    return p == q;
     112  }
     113  
     114  int
     115  postdec_glob_ptr (void)
     116  {
     117    int *q;
     118    q = ptr - 1;
     119    __builtin_prefetch (ptr--, 0, 0);
     120    return ptr == q;
     121  }
     122  
     123  int
     124  preinc_arg_idx (int *p, int i)
     125  {
     126    int j = i + 1;
     127    __builtin_prefetch (&p[++i], 0, 0);
     128    return i == j;
     129  }
     130  
     131  
     132  int
     133  preinc_glob_idx (void)
     134  {
     135    int j = arrindex + 1;
     136    __builtin_prefetch (&ptr[++arrindex], 0, 0);
     137    return arrindex == j;
     138  }
     139  
     140  int
     141  postinc_arg_idx (int *p, int i)
     142  {
     143    int j = i + 1;
     144    __builtin_prefetch (&p[i++], 0, 0);
     145    return i == j;
     146  }
     147  
     148  int
     149  postinc_glob_idx (void)
     150  {
     151    int j = arrindex + 1;
     152    __builtin_prefetch (&ptr[arrindex++], 0, 0);
     153    return arrindex == j;
     154  }
     155  
     156  int
     157  predec_arg_idx (int *p, int i)
     158  {
     159    int j = i - 1;
     160    __builtin_prefetch (&p[--i], 0, 0);
     161    return i == j;
     162  }
     163  
     164  int
     165  predec_glob_idx (void)
     166  {
     167    int j = arrindex - 1;
     168    __builtin_prefetch (&ptr[--arrindex], 0, 0);
     169    return arrindex == j;
     170  }
     171  
     172  int
     173  postdec_arg_idx (int *p, int i)
     174  {
     175    int j = i - 1;
     176    __builtin_prefetch (&p[i--], 0, 0);
     177    return i == j;
     178  }
     179  
     180  int
     181  postdec_glob_idx (void)
     182  {
     183    int j = arrindex - 1;
     184    __builtin_prefetch (&ptr[arrindex--], 0, 0);
     185    return arrindex == j;
     186  }
     187  
     188  /* Check that function calls within the first prefetch argument are
     189     evaluated.  */
     190  
     191  int getptrcnt = 0;
     192  
     193  int *
     194  getptr (int *p)
     195  {
     196    getptrcnt++;
     197    return p + 1;
     198  }
     199  
     200  int
     201  funccall_arg_ptr (int *p)
     202  {
     203    __builtin_prefetch (getptr (p), 0, 0);
     204    return getptrcnt == 1;
     205  }
     206  
     207  int getintcnt = 0;
     208  
     209  int
     210  getint (int i)
     211  {
     212    getintcnt++;
     213    return i + 1;
     214  }
     215  
     216  int
     217  funccall_arg_idx (int *p, int i)
     218  {
     219    __builtin_prefetch (&p[getint (i)], 0, 0);
     220    return getintcnt == 1;
     221  }
     222  
     223  int
     224  main ()
     225  {
     226    if (!assign_arg_ptr (ptr))
     227      abort ();
     228    if (!assign_glob_ptr ())
     229      abort ();
     230    if (!assign_arg_idx (ptr, 4))
     231      abort ();
     232    if (!assign_glob_idx ())
     233      abort ();
     234    if (!preinc_arg_ptr (ptr))
     235      abort ();
     236    if (!preinc_glob_ptr ())
     237      abort ();
     238    if (!postinc_arg_ptr (ptr))
     239      abort ();
     240    if (!postinc_glob_ptr ())
     241      abort ();
     242    if (!predec_arg_ptr (ptr))
     243      abort ();
     244    if (!predec_glob_ptr ())
     245      abort ();
     246    if (!postdec_arg_ptr (ptr))
     247      abort ();
     248    if (!postdec_glob_ptr ())
     249      abort ();
     250    if (!preinc_arg_idx (ptr, 3))
     251      abort ();
     252    if (!preinc_glob_idx ())
     253      abort ();
     254    if (!postinc_arg_idx (ptr, 3))
     255      abort ();
     256    if (!postinc_glob_idx ())
     257      abort ();
     258    if (!predec_arg_idx (ptr, 3))
     259      abort ();
     260    if (!predec_glob_idx ())
     261      abort ();
     262    if (!postdec_arg_idx (ptr, 3))
     263      abort ();
     264    if (!postdec_glob_idx ())
     265      abort ();
     266    if (!funccall_arg_ptr (ptr))
     267      abort ();
     268    if (!funccall_arg_idx (ptr, 3))
     269      abort ();
     270    exit (0);
     271  }