http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54121
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-12-11 11:51:29 UTC --- (In reply to comment #4) > Jakub, I presume it's an oversight that the combined tldo_add + store patterns > have a "=r" constraint on the source operand: > > (define_insn "*tldo_stb_sp32" > [(set (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" > "r") > (match_operand 3 "tld_symbolic_operand" "")] > UNSPEC_TLSLDO) > (match_operand:SI 1 "register_operand" "r"))) > (match_operand:QI 0 "register_operand" "=r"))] > "TARGET_TLS && TARGET_ARCH32" > "stb\t%0, [%1 + %2], %%tldo_add(%3)" > [(set_attr "type" "store")]) Obviously. Please remove the = from all the tldo_st*_sp* patterns. I bet I've created them from the tldo_ld* patterns initially by swapping the operands.