The lowering was missing live-ins in certain cases, like a sequence of multiple tMOVCCr_pseudo instructions. This would lead to a verifier failure, and on pre-v6 Thumb CPSR would be incorrectly clobbered.
For reasons I don't completely understand, it's hard to get a sequence of multiple tMOVCCr_pseudo instructions; the issue only seems to show up with 64-bit comparisons where the result is zero-extended. I added some extra testcases in case that changes in the future. Probably some optimization opportunities here if anyone is interested. (@test_slt_not is the case that was getting miscompiled.)
The code to check the liveness of CPSR was stolen from X86ISelLowering.cpp; maybe it could be refactored into common helper, but I have no idea where to put it.
My first impression of the tests was that they could benefit from a bit of a clean-up (stack offsets, register usage, asm comments, etc.). But looks like there are 2 schools of thoughts on this. One of them being that the output of the script is okay because it is explicit, shows everything, etc. So yeah, please ignore, whatever you think is appropriate.