codegen: stop using an atomic RMW for coverage and allocation counters
`de2f3f2594` fixed the memory corruption reported in #59355 by putting a
lock around the coverage hash table. In the same change the counter update
itself was switched from a volatile load/add/store to an atomic
read-modify-write, which is what makes instrumented code much slower on
1.12 than on 1.10/1.11.
On an arm64 machine the lattice-Boltzmann kernel from #62424 costs 6.3x
uninstrumented on master against 2.5x on 1.11, even though master executes
fewer counter updates. The atomic prevents the inner loops from unrolling
and issues an `ldadd` to the same cache line on every iteration.
Go back to the volatile update. The counters were never exact, the emitted
counts are not statement execution counts in any useful sense, and the
lock that actually fixed #59355 stays.
Fixes #62424
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>