OSDN Git Service

* tree-ssa-alias.c (dump_mem_ref_stats): Do not call
[pf3gnuchains/gcc-fork.git] / gcc / expr.c
index 1dc437c..24dfbf5 100644 (file)
@@ -1237,13 +1237,14 @@ block_move_libcall_safe_for_call_parm (void)
 
   /* If registers go on the stack anyway, any argument is sure to clobber
      an outgoing argument.  */
-#if defined (REG_PARM_STACK_SPACE) && defined (OUTGOING_REG_PARM_STACK_SPACE)
-  {
-    tree fn = emit_block_move_libcall_fn (false);
-    (void) fn;
-    if (REG_PARM_STACK_SPACE (fn) != 0)
-      return false;
-  }
+#if defined (REG_PARM_STACK_SPACE)
+  if (OUTGOING_REG_PARM_STACK_SPACE)
+    {
+      tree fn;
+      fn = emit_block_move_libcall_fn (false);
+      if (REG_PARM_STACK_SPACE (fn) != 0)
+       return false;
+    }
 #endif
 
   /* If any argument goes in memory, then it might clobber an outgoing
@@ -4382,9 +4383,19 @@ store_expr (tree exp, rtx target, int call_param_p)
        {
          if (TYPE_UNSIGNED (TREE_TYPE (exp))
              != SUBREG_PROMOTED_UNSIGNED_P (target))
-           exp = fold_convert
-             (lang_hooks.types.signed_or_unsigned_type
-              (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp)), exp);
+           {
+             /* Some types, e.g. Fortran's logical*4, won't have a signed
+                version, so use the mode instead.  */
+             tree ntype
+               = (get_signed_or_unsigned_type
+                  (SUBREG_PROMOTED_UNSIGNED_P (target), TREE_TYPE (exp)));
+             if (ntype == NULL)
+               ntype = lang_hooks.types.type_for_mode
+                 (TYPE_MODE (TREE_TYPE (exp)),
+                  SUBREG_PROMOTED_UNSIGNED_P (target));
+
+             exp = fold_convert (ntype, exp);
+           }
 
          exp = fold_convert (lang_hooks.types.type_for_mode
                                (GET_MODE (SUBREG_REG (target)),
@@ -6291,12 +6302,6 @@ safe_from_p (rtx x, tree exp, int top_p)
            && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
          return 0;
 
-      /* If this is a language-specific tree code, it may require
-        special handling.  */
-      if ((unsigned int) TREE_CODE (exp)
-         >= (unsigned int) LAST_AND_UNUSED_TREE_CODE
-         && !lang_hooks.safe_from_p (x, exp))
-       return 0;
       break;
 
     case tcc_type: