On Linux, it was made possible by https://reviews.llvm.org/D38253 that __builtin_longjmp can jump between ARM mode and Thumb mode. This was done by restoring the saved frame address to each of r7 and r11, the frame pointer register on Linux in Thumb mode and ARM mode, respectively.
However, there has been revealed a case that __builtin_longjmp from ARM mode does not work. In that case, __builtin_longjmp chooses r7 for the scratch register, trying to branch to the address contained in it, which has already been overwritten by the saved frame address.
This seems to be not easily worked around on user's side. For example, the compiler option -fno-omit-frame-pointer will not prevent r7 from being used as the scratch register, because it is not the frame pointer register in ARM mode.
In the proposed change, Int_eh_sjlj_longjmp is made to use the new register class GPRnofp which excludes the potential frame pointer registers r7 and r11.
I think this addresses the FIXME. Add a comment noting that we're intentionally not defining separate versions of this instruction based on the frame pointer register.