------- Comment #8 from ebotcazou at gcc dot gnu dot org 2010-01-02 23:00 ------- The root of the problem is plus_constant wrapping up a TLS symbol in a CONST:
(const:DI (plus:DI (symbol_ref:DI ("m") [flags 0x1a] <var_decl m>) (const_int 4 [0x4]))) what the SPARC back-end doesn't like. So something like this works: Index: explow.c =================================================================== --- explow.c (revision 155516) +++ explow.c (working copy) @@ -137,7 +137,8 @@ plus_constant (rtx x, HOST_WIDE_INT c) case SYMBOL_REF: case LABEL_REF: - all_constant = 1; + if (CONSTANT_ADDRESS_P (x)) + all_constant = 1; break; case PLUS: but I presume other back-ends may not necessarily like it. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42564