OSDN Git Service

PR target/15941
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 19 Jun 2004 19:24:56 +0000 (19:24 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 19 Jun 2004 19:24:56 +0000 (19:24 +0000)
* function.c (assign_parms): If not padding upward or intentionally
forcing upward padding, take offset_rtx into account when determining
the alignment for stack_parm.

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

gcc/ChangeLog
gcc/function.c

index 07e75cd..242be1c 100644 (file)
@@ -1,5 +1,12 @@
 2004-06-19  Richard Henderson  <rth@redhat.com>
 
+       PR target/15941
+       * function.c (assign_parms): If not padding upward or intentionally
+       forcing upward padding, take offset_rtx into account when determining
+       the alignment for stack_parm.
+
+2004-06-19  Richard Henderson  <rth@redhat.com>
+
        PR target/15550
        * ifcvt.c (noce_try_move): Recognize all generated instructions.
 
index f4f2940..3f1f45b 100644 (file)
@@ -4603,6 +4603,7 @@ assign_parms (tree fndecl)
 
       {
        rtx offset_rtx;
+       unsigned int align, boundary;
 
        /* If we're passing this arg using a reg, make its stack home
           the aligned stack slot.  */
@@ -4620,8 +4621,24 @@ assign_parms (tree fndecl)
                                                  offset_rtx));
 
        set_mem_attributes (stack_parm, parm, 1);
-       set_mem_align (stack_parm, 
-                      FUNCTION_ARG_BOUNDARY (promoted_mode, passed_type));
+
+       boundary = FUNCTION_ARG_BOUNDARY (promoted_mode, passed_type);
+       align = 0;
+
+       /* If we're padding upward, we know that the alignment of the slot
+          is FUNCTION_ARG_BOUNDARY.  If we're using slot_offset, we're
+          intentionally forcing upward padding.  Otherwise we have to come
+          up with a guess at the alignment based on OFFSET_RTX.  */
+       if (locate.where_pad == upward || entry_parm)
+         align = boundary;
+       else if (GET_CODE (offset_rtx) == CONST_INT)
+         {
+           align = INTVAL (offset_rtx) * BITS_PER_UNIT | boundary;
+           align = align & -align;
+         }
+       if (align > 0)
+         set_mem_align (stack_parm, align);
+
        if (entry_parm)
          set_reg_attrs_for_parm (entry_parm, stack_parm);
       }