/* Test that __builtin_prefetch does no harm.
|
/* Test that __builtin_prefetch does no harm.
|
|
|
Check that the expression containing the address to prefetch is
|
Check that the expression containing the address to prefetch is
|
evaluated if it has side effects, even if the target does not support
|
evaluated if it has side effects, even if the target does not support
|
data prefetch. Check changes to pointers and to array indices that are
|
data prefetch. Check changes to pointers and to array indices that are
|
either global variables or arguments. */
|
either global variables or arguments. */
|
|
|
#define ARRSIZE 100
|
#define ARRSIZE 100
|
|
|
int arr[ARRSIZE];
|
int arr[ARRSIZE];
|
int *ptr = &arr[20];
|
int *ptr = &arr[20];
|
int arrindex = 4;
|
int arrindex = 4;
|
|
|
/* Check that assignment within a prefetch argument is evaluated. */
|
/* Check that assignment within a prefetch argument is evaluated. */
|
|
|
int
|
int
|
assign_arg_ptr (int *p)
|
assign_arg_ptr (int *p)
|
{
|
{
|
int *q;
|
int *q;
|
__builtin_prefetch ((q = p), 0, 0);
|
__builtin_prefetch ((q = p), 0, 0);
|
return q == p;
|
return q == p;
|
}
|
}
|
|
|
int
|
int
|
assign_glob_ptr (void)
|
assign_glob_ptr (void)
|
{
|
{
|
int *q;
|
int *q;
|
__builtin_prefetch ((q = ptr), 0, 0);
|
__builtin_prefetch ((q = ptr), 0, 0);
|
return q == ptr;
|
return q == ptr;
|
}
|
}
|
|
|
int
|
int
|
assign_arg_idx (int *p, int i)
|
assign_arg_idx (int *p, int i)
|
{
|
{
|
int j;
|
int j;
|
__builtin_prefetch (&p[j = i], 0, 0);
|
__builtin_prefetch (&p[j = i], 0, 0);
|
return j == i;
|
return j == i;
|
}
|
}
|
|
|
int
|
int
|
assign_glob_idx (void)
|
assign_glob_idx (void)
|
{
|
{
|
int j;
|
int j;
|
__builtin_prefetch (&ptr[j = arrindex], 0, 0);
|
__builtin_prefetch (&ptr[j = arrindex], 0, 0);
|
return j == arrindex;
|
return j == arrindex;
|
}
|
}
|
|
|
/* Check that pre/post increment/decrement within a prefetch argument are
|
/* Check that pre/post increment/decrement within a prefetch argument are
|
evaluated. */
|
evaluated. */
|
|
|
int
|
int
|
preinc_arg_ptr (int *p)
|
preinc_arg_ptr (int *p)
|
{
|
{
|
int *q;
|
int *q;
|
q = p + 1;
|
q = p + 1;
|
__builtin_prefetch (++p, 0, 0);
|
__builtin_prefetch (++p, 0, 0);
|
return p == q;
|
return p == q;
|
}
|
}
|
|
|
int
|
int
|
preinc_glob_ptr (void)
|
preinc_glob_ptr (void)
|
{
|
{
|
int *q;
|
int *q;
|
q = ptr + 1;
|
q = ptr + 1;
|
__builtin_prefetch (++ptr, 0, 0);
|
__builtin_prefetch (++ptr, 0, 0);
|
return ptr == q;
|
return ptr == q;
|
}
|
}
|
|
|
int
|
int
|
postinc_arg_ptr (int *p)
|
postinc_arg_ptr (int *p)
|
{
|
{
|
int *q;
|
int *q;
|
q = p + 1;
|
q = p + 1;
|
__builtin_prefetch (p++, 0, 0);
|
__builtin_prefetch (p++, 0, 0);
|
return p == q;
|
return p == q;
|
}
|
}
|
|
|
int
|
int
|
postinc_glob_ptr (void)
|
postinc_glob_ptr (void)
|
{
|
{
|
int *q;
|
int *q;
|
q = ptr + 1;
|
q = ptr + 1;
|
__builtin_prefetch (ptr++, 0, 0);
|
__builtin_prefetch (ptr++, 0, 0);
|
return ptr == q;
|
return ptr == q;
|
}
|
}
|
|
|
int
|
int
|
predec_arg_ptr (int *p)
|
predec_arg_ptr (int *p)
|
{
|
{
|
int *q;
|
int *q;
|
q = p - 1;
|
q = p - 1;
|
__builtin_prefetch (--p, 0, 0);
|
__builtin_prefetch (--p, 0, 0);
|
return p == q;
|
return p == q;
|
}
|
}
|
|
|
int
|
int
|
predec_glob_ptr (void)
|
predec_glob_ptr (void)
|
{
|
{
|
int *q;
|
int *q;
|
q = ptr - 1;
|
q = ptr - 1;
|
__builtin_prefetch (--ptr, 0, 0);
|
__builtin_prefetch (--ptr, 0, 0);
|
return ptr == q;
|
return ptr == q;
|
}
|
}
|
|
|
int
|
int
|
postdec_arg_ptr (int *p)
|
postdec_arg_ptr (int *p)
|
{
|
{
|
int *q;
|
int *q;
|
q = p - 1;
|
q = p - 1;
|
__builtin_prefetch (p--, 0, 0);
|
__builtin_prefetch (p--, 0, 0);
|
return p == q;
|
return p == q;
|
}
|
}
|
|
|
int
|
int
|
postdec_glob_ptr (void)
|
postdec_glob_ptr (void)
|
{
|
{
|
int *q;
|
int *q;
|
q = ptr - 1;
|
q = ptr - 1;
|
__builtin_prefetch (ptr--, 0, 0);
|
__builtin_prefetch (ptr--, 0, 0);
|
return ptr == q;
|
return ptr == q;
|
}
|
}
|
|
|
int
|
int
|
preinc_arg_idx (int *p, int i)
|
preinc_arg_idx (int *p, int i)
|
{
|
{
|
int j = i + 1;
|
int j = i + 1;
|
__builtin_prefetch (&p[++i], 0, 0);
|
__builtin_prefetch (&p[++i], 0, 0);
|
return i == j;
|
return i == j;
|
}
|
}
|
|
|
|
|
int
|
int
|
preinc_glob_idx (void)
|
preinc_glob_idx (void)
|
{
|
{
|
int j = arrindex + 1;
|
int j = arrindex + 1;
|
__builtin_prefetch (&ptr[++arrindex], 0, 0);
|
__builtin_prefetch (&ptr[++arrindex], 0, 0);
|
return arrindex == j;
|
return arrindex == j;
|
}
|
}
|
|
|
int
|
int
|
postinc_arg_idx (int *p, int i)
|
postinc_arg_idx (int *p, int i)
|
{
|
{
|
int j = i + 1;
|
int j = i + 1;
|
__builtin_prefetch (&p[i++], 0, 0);
|
__builtin_prefetch (&p[i++], 0, 0);
|
return i == j;
|
return i == j;
|
}
|
}
|
|
|
int
|
int
|
postinc_glob_idx (void)
|
postinc_glob_idx (void)
|
{
|
{
|
int j = arrindex + 1;
|
int j = arrindex + 1;
|
__builtin_prefetch (&ptr[arrindex++], 0, 0);
|
__builtin_prefetch (&ptr[arrindex++], 0, 0);
|
return arrindex == j;
|
return arrindex == j;
|
}
|
}
|
|
|
int
|
int
|
predec_arg_idx (int *p, int i)
|
predec_arg_idx (int *p, int i)
|
{
|
{
|
int j = i - 1;
|
int j = i - 1;
|
__builtin_prefetch (&p[--i], 0, 0);
|
__builtin_prefetch (&p[--i], 0, 0);
|
return i == j;
|
return i == j;
|
}
|
}
|
|
|
int
|
int
|
predec_glob_idx (void)
|
predec_glob_idx (void)
|
{
|
{
|
int j = arrindex - 1;
|
int j = arrindex - 1;
|
__builtin_prefetch (&ptr[--arrindex], 0, 0);
|
__builtin_prefetch (&ptr[--arrindex], 0, 0);
|
return arrindex == j;
|
return arrindex == j;
|
}
|
}
|
|
|
int
|
int
|
postdec_arg_idx (int *p, int i)
|
postdec_arg_idx (int *p, int i)
|
{
|
{
|
int j = i - 1;
|
int j = i - 1;
|
__builtin_prefetch (&p[i--], 0, 0);
|
__builtin_prefetch (&p[i--], 0, 0);
|
return i == j;
|
return i == j;
|
}
|
}
|
|
|
int
|
int
|
postdec_glob_idx (void)
|
postdec_glob_idx (void)
|
{
|
{
|
int j = arrindex - 1;
|
int j = arrindex - 1;
|
__builtin_prefetch (&ptr[arrindex--], 0, 0);
|
__builtin_prefetch (&ptr[arrindex--], 0, 0);
|
return arrindex == j;
|
return arrindex == j;
|
}
|
}
|
|
|
/* Check that function calls within the first prefetch argument are
|
/* Check that function calls within the first prefetch argument are
|
evaluated. */
|
evaluated. */
|
|
|
int getptrcnt = 0;
|
int getptrcnt = 0;
|
|
|
int *
|
int *
|
getptr (int *p)
|
getptr (int *p)
|
{
|
{
|
getptrcnt++;
|
getptrcnt++;
|
return p + 1;
|
return p + 1;
|
}
|
}
|
|
|
int
|
int
|
funccall_arg_ptr (int *p)
|
funccall_arg_ptr (int *p)
|
{
|
{
|
__builtin_prefetch (getptr (p), 0, 0);
|
__builtin_prefetch (getptr (p), 0, 0);
|
return getptrcnt == 1;
|
return getptrcnt == 1;
|
}
|
}
|
|
|
int getintcnt = 0;
|
int getintcnt = 0;
|
|
|
int
|
int
|
getint (int i)
|
getint (int i)
|
{
|
{
|
getintcnt++;
|
getintcnt++;
|
return i + 1;
|
return i + 1;
|
}
|
}
|
|
|
int
|
int
|
funccall_arg_idx (int *p, int i)
|
funccall_arg_idx (int *p, int i)
|
{
|
{
|
__builtin_prefetch (&p[getint (i)], 0, 0);
|
__builtin_prefetch (&p[getint (i)], 0, 0);
|
return getintcnt == 1;
|
return getintcnt == 1;
|
}
|
}
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
if (!assign_arg_ptr (ptr))
|
if (!assign_arg_ptr (ptr))
|
abort ();
|
abort ();
|
if (!assign_glob_ptr ())
|
if (!assign_glob_ptr ())
|
abort ();
|
abort ();
|
if (!assign_arg_idx (ptr, 4))
|
if (!assign_arg_idx (ptr, 4))
|
abort ();
|
abort ();
|
if (!assign_glob_idx ())
|
if (!assign_glob_idx ())
|
abort ();
|
abort ();
|
if (!preinc_arg_ptr (ptr))
|
if (!preinc_arg_ptr (ptr))
|
abort ();
|
abort ();
|
if (!preinc_glob_ptr ())
|
if (!preinc_glob_ptr ())
|
abort ();
|
abort ();
|
if (!postinc_arg_ptr (ptr))
|
if (!postinc_arg_ptr (ptr))
|
abort ();
|
abort ();
|
if (!postinc_glob_ptr ())
|
if (!postinc_glob_ptr ())
|
abort ();
|
abort ();
|
if (!predec_arg_ptr (ptr))
|
if (!predec_arg_ptr (ptr))
|
abort ();
|
abort ();
|
if (!predec_glob_ptr ())
|
if (!predec_glob_ptr ())
|
abort ();
|
abort ();
|
if (!postdec_arg_ptr (ptr))
|
if (!postdec_arg_ptr (ptr))
|
abort ();
|
abort ();
|
if (!postdec_glob_ptr ())
|
if (!postdec_glob_ptr ())
|
abort ();
|
abort ();
|
if (!preinc_arg_idx (ptr, 3))
|
if (!preinc_arg_idx (ptr, 3))
|
abort ();
|
abort ();
|
if (!preinc_glob_idx ())
|
if (!preinc_glob_idx ())
|
abort ();
|
abort ();
|
if (!postinc_arg_idx (ptr, 3))
|
if (!postinc_arg_idx (ptr, 3))
|
abort ();
|
abort ();
|
if (!postinc_glob_idx ())
|
if (!postinc_glob_idx ())
|
abort ();
|
abort ();
|
if (!predec_arg_idx (ptr, 3))
|
if (!predec_arg_idx (ptr, 3))
|
abort ();
|
abort ();
|
if (!predec_glob_idx ())
|
if (!predec_glob_idx ())
|
abort ();
|
abort ();
|
if (!postdec_arg_idx (ptr, 3))
|
if (!postdec_arg_idx (ptr, 3))
|
abort ();
|
abort ();
|
if (!postdec_glob_idx ())
|
if (!postdec_glob_idx ())
|
abort ();
|
abort ();
|
if (!funccall_arg_ptr (ptr))
|
if (!funccall_arg_ptr (ptr))
|
abort ();
|
abort ();
|
if (!funccall_arg_idx (ptr, 3))
|
if (!funccall_arg_idx (ptr, 3))
|
abort ();
|
abort ();
|
exit (0);
|
exit (0);
|
}
|
}
|
|
|