Restrict in C
I came to know restrict keyword in C recently, and would write down my understanding of it.
The example on its wiki page is a bit misleading, for restrict for the third argument, i.e. val, is not
needed.
For a memory pointed by a restrict pointer, if it’s modified, the modification must have been done through the restrict pointer, otherwise, the
behavior is undefined.
One could understand it as linear type after the modification. (Note: alias could happen if no modification is performed.)
Let’s examine the generated assembly code:
void updatePtrs(size_t *ptrA, size_t *ptrB, size_t *val)
{
*ptrA += *val;
*ptrB += *val;
}
Get the assembly code using clang -S -O test.c:
updatePtrs: # @updatePtrs
.cfi_startproc
# BB#0:
movq (%rdx), %rax
addq %rax, (%rdi)
movq (%rdx), %rax
addq %rax, (%rsi)
retq
Here, we could see that (%rdx) needs to be loaded twice for the possible aliasing.
void updatePtrs(size_t * restrict ptrA, size_t * restrict ptrB, size_t *val)
{
*ptrA += *val;
*ptrB += *val;
}
Get the assembly code using clang -S -O test.c:
updatePtrs: # @updatePtrs
.cfi_startproc
# BB#0:
movq (%rdx), %rax
addq %rax, (%rdi)
addq %rax, (%rsi)
retq
Since both *ptrA and *ptrB are mutated, and have restrict modifier, they have effective linear type, so no aliasing, and *val don’t need to be
reloaded. (Note the lacking of restrict keyword for val.)