modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-4.c (about)

     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  }