Questoin: to what extent is it legal to pass a single cl_mem into a kernel multiple times, via different parameters, in OpenCL 1.2?
Not 100% sure, but I would say that the standard answers applying to pointer aliasing in the C language apply:
If you don’t write into your buffer argument anywhere in that kernel (or another kernel that is executing concurrently), you will be fine.
If you write into it, and you have marked it as restrict anywhere, you’ve broken a promise to the compiler and will face the consequences.
If you write and have not marked the pointer as restrict, the compiler is supposed to do the right thing, and failing to do so is a bug.
But if you support the later use case, you should also design your kernel very carefully, as it is very easy to get it wrong, and the correct algorithm will often be less efficient in the common case where buffer parameters do not overlap. See the difference between memcpy and memmove for an example.