This is the Clang companion patch to http://reviews.llvm.org/D4449 which adds a dereferencable function parameter attribute (like the nonnull attribute, but specifying that the pointer is dereferencable like the value of an alloca is dereferencable). This patch causes the dereferencable attribute to appear on reference parameters (and return values) just like nonnull does currently.
As mentioned in the llvm patch summary, my motivating use case is C++ references that are passes as function parameters and used in loops. For example,
void foo(int * restrict a, int * restrict b, int &c, int n) {
for (int i = 0; i < n; ++i) if (a[i] > 0) a[i] = c*b[i];
}
Currently, we generate a load of 'c' in every loop iteration because we can't prove that there is no control dependence on the dereferencability of 'c' from the if condition. But because 'c' is a reference, we know it must point to something, and since nothing else in the loop can alias it, it is safe to load it in the preheader.