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.  */

Reply via email to