Hi, Backend may promote pointers to Pmode. Before we force a TLS symbol to a pseudo, we may need to convert it to proper mode. OK for trunk?
Thanks. H.J. ---- 2011-06-11 H.J. Lu <hongjiu...@intel.com> * calls.c (precompute_register_parameters): Convert pointer to TLS symbol if needed. diff --git a/gcc/calls.c b/gcc/calls.c index feb98d2..de98267 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -706,7 +706,13 @@ precompute_register_parameters (int num_actuals, struct arg_data *args, pseudo now. TLS symbols sometimes need a call to resolve. */ if (CONSTANT_P (args[i].value) && !targetm.legitimate_constant_p (args[i].mode, args[i].value)) - args[i].value = force_reg (args[i].mode, args[i].value); + { + if (GET_MODE (args[i].value) != args[i].mode) + args[i].value = convert_to_mode (args[i].mode, + args[i].value, + args[i].unsignedp); + args[i].value = force_reg (args[i].mode, args[i].value); + } /* If we are to promote the function arg to a wider mode, do it now. */