Fwiw, I had discussed this with @jonasnick somewhere else.
TL;DR: The promise you give by restrict is more involved than we assumed.
He had tried just restrict k but that it turns out that doesn't change anything at all (and the compiler won't complain about incorrect usage), because *k is not modified in the function. After looking up the standard and other explanation, at least I was pretty convinced that restrict r1, restrict r2, restrict k is correct and meaningful, but @jonasnick preferred not to use it to keep things simple (which is a reasonable conclusion, I think).
The best simple but precise explanation we found is this:
The restrict modifier means that the compiler can assume that the object to which that pointer points either is not modified or is not referenced in any other way in the function. If the object is modified, then all access to that object must be done through that pointer.
(https://www.reddit.com/r/C_Programming/comments/1xqf90/comment/cfdoon2/?context=3)
I wasn't aware about the "modified" part at all, I had assumed restrict has only to do with references.