https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114085
--- Comment #4 from Jeffrey A. Law <law at gcc dot gnu.org> --- So not really working on this, but figured I could take a quick looksie to see if it was something simple/easy to fix. The problem is we have this instruction heading into allocation: (insn 31 30 33 7 (set (reg/v:QI 23 [ __testvalid ]) (xor:QI (reg/v:QI 23 [ __testvalid ]) (const_int 1 [0x1]))) "j.ii":48:9 discrim 2 360 {xorqi3_1} Pretty simple, standard stuff. (reg 23) fails to get a hard register and instead ends up in a stack slot resulting in: (insn 31 137 33 7 (set (mem/c:QI (plus:SI (reg/f:SI 11 fp) (const_int -57 [0xffffffffffffffc7])) [10 %sfp+-61 S1 A8]) (xor:QI (mem/c:QI (plus:SI (reg/f:SI 11 fp) (const_int -57 [0xffffffffffffffc7])) [10 %sfp+-61 S1 A8]) (const_int 1 [0x1]))) "j.ii":48:9 discrim 2 360 {xorqi3_1} That addressing mode isn't valid for the single bit manipulation instructions. In theory the address should have been reloaded into a register. That probably isn't happening because the "U" constraint isn't marked as a memory_constraint. It isn't marked that way because "U" accepts register operands as well. I think we can just remove REG handling from that constraint and replace any references to "U" that don't also include "r" to include "r". I'll give that a quick whirl. If it works, great, otherwise I'll likely have to set this aside.