It does not provide any synchronization. In the case you describe, it should force a read of the given smem location everytime it is used by an instruction, as opposed to reading once into a register and referring to the register in subsequent times.
Is there a way to reinterpret the cast of a shared memory variable to volatile on a specific line? specifically I only need the threads in a warp to update at very specific points (after a single thread conditional divergence). So far I simply have to use the volatile keyword otherwise the other threads don’t register the new data in the shared memory.