Sorry, really late response! I need to checks these forums more! It's always interesting to read about stuff like this.
I've done an ARM->ARM recompiler too if anyone wants to compare, although it's not especially high quality. It looks like we both took the same approach of static allocation of registers based on some statistical analysis.
Since this was for a GBA emulator I had to do cycle counting. One weird trick I did, which I'm sure is pretty bad on newer ARM CPUs (this was for ARM9 originally), was to use the most significant bit of the cycle counter to increment the PC, in order to skip a branch at the end of blocks. This way flags weren't modified in the process. The GBA emulator vBagx would go on to use this approach too.
Another big difference is that I had to emulate memory accesses in software, which I'm sure this doesn't. Unfortunately that also involves flag wrecking. I have an ARM recompiler lying around (that doesn't target ARM.. yet) that has much more extensive liveness analysis for flags and registers. This way you can know when it's okay to wreck flags, or at least some flags.. where that makes sense on ARM. And you can grab dead registers when you need temporaries, limiting the number of registers you can't statically allocate.
But for these reasons I didn't bother trying to turn conditional ops into conditional ops; like with other platforms I targeted I just compiled them into branches. But I at least tried to group them where possible.
As for cache clearing, which he mentioned as a caveat. What I try to do is clear the data cache where the new code was written, then clear a single icache line where the new code starts in the translation cache. It's not enough to just clear icache, because otherwise the freshly generated code might not exist in main RAM when it needs to be loaded into icache. This might not be the case if the page is configured is inner attribute write through instead of write back (or it's not write allocate and you only write the instructions without reading them), but it's something to watch out for.