While experimenting with several different compilers on Hopper, I noticed that some compilers do not support all the ways in which the "restrict" keyword can be used. I updated our autoconf macro to test more cases.
I now also think it is not worthwhile to require the compiler to support the array syntax for function arguments, i.e. the syntax
void foo (double A[restrict]);
which (essentially) declares a pointer A using array syntax. One can instead use the syntax
void foo (double *restrict const A);
which is identical in almost all respects. The PGI compiler does not seem to support the array syntax, and disabling support for the restrict keyword does not seem to be worth the cost.
I also add support for the gcc built-in function "builtin_expect", which tells the compiler the value that an expression is most likely to have, allowing compile-time optimisations based on this heuristic, and maybe avoiding branch penalties at run time.
I also enabled the (currently commented out) definitions for attribute(hot) and attribute(cold), which tell the compiler that a function is either executed very often, or very rarely. This can also influence the optimiser.
I attach a patch.