OSDN Git Service

(instantiate_decls): For DECL_INCOMING_RTL, use max
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Apr 1997 22:40:55 +0000 (22:40 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Apr 1997 22:40:55 +0000 (22:40 +0000)
of type size and mode size in instantiate_decl call.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@13933 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/function.c

index e9e99fe..7560866 100644 (file)
@@ -2622,10 +2622,14 @@ instantiate_decls (fndecl, valid_only)
   /* Process all parameters of the function.  */
   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
     {
-      instantiate_decl (DECL_RTL (decl), int_size_in_bytes (TREE_TYPE (decl)),
-                       valid_only);    
-      instantiate_decl (DECL_INCOMING_RTL (decl),
-                       int_size_in_bytes (TREE_TYPE (decl)), valid_only);
+      int size = int_size_in_bytes (TREE_TYPE (decl));
+      instantiate_decl (DECL_RTL (decl), size, valid_only);    
+
+      /* If the parameter was promoted, then the incoming RTL mode may be
+        larger than the declared type size.  We must use the larger of
+        the two sizes.  */
+      size = MAX (GET_MODE_SIZE (GET_MODE (DECL_INCOMING_RTL (decl))), size);
+      instantiate_decl (DECL_INCOMING_RTL (decl), size, valid_only);
     }
 
   /* Now process all variables defined in the function or its subblocks.  */