2010-06-24 20:18:32 +00:00
|
|
|
2010-06-17 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
|
|
|
|
PR target/44542
|
|
|
|
* cfgexpand.c (expand_one_stack_var_at): Limit align to maximum
|
|
|
|
of max_used_stack_slot_alignment and PREFERRED_STACK_BOUNDARY
|
|
|
|
instead of MAX_SUPPORTED_STACK_ALIGNMENT.
|
|
|
|
(expand_one_var): Don't consider DECL_ALIGN for variables for
|
|
|
|
which expand_one_stack_var_at has been already called.
|
|
|
|
|
|
|
|
--- gcc/cfgexpand.c.jj 2010-06-17 17:01:11.964198458 +0200
|
|
|
|
+++ gcc/cfgexpand.c 2010-06-17 18:25:18.940335757 +0200
|
2010-07-07 17:35:21 +00:00
|
|
|
@@ -705,7 +705,7 @@ static void
|
2010-06-24 20:18:32 +00:00
|
|
|
expand_one_stack_var_at (tree decl, HOST_WIDE_INT offset)
|
|
|
|
{
|
|
|
|
/* Alignment is unsigned. */
|
|
|
|
- unsigned HOST_WIDE_INT align;
|
|
|
|
+ unsigned HOST_WIDE_INT align, max_align;
|
|
|
|
rtx x;
|
|
|
|
|
|
|
|
/* If this fails, we've overflowed the stack frame. Error nicely? */
|
2010-07-07 17:35:21 +00:00
|
|
|
@@ -722,10 +722,10 @@ expand_one_stack_var_at (tree decl, HOST
|
|
|
|
offset -= frame_phase;
|
|
|
|
align = offset & -offset;
|
|
|
|
align *= BITS_PER_UNIT;
|
|
|
|
- if (align == 0)
|
|
|
|
- align = STACK_BOUNDARY;
|
|
|
|
- else if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
|
|
|
|
- align = MAX_SUPPORTED_STACK_ALIGNMENT;
|
|
|
|
+ max_align = MAX (crtl->max_used_stack_slot_alignment,
|
|
|
|
+ PREFERRED_STACK_BOUNDARY);
|
|
|
|
+ if (align == 0 || align > max_align)
|
|
|
|
+ align = max_align;
|
2010-06-24 20:18:32 +00:00
|
|
|
|
2010-07-07 17:35:21 +00:00
|
|
|
DECL_ALIGN (decl) = align;
|
|
|
|
DECL_USER_ALIGN (decl) = 0;
|
|
|
|
@@ -930,6 +930,13 @@ expand_one_var (tree var, bool toplevel,
|
2010-06-24 20:18:32 +00:00
|
|
|
align = MINIMUM_ALIGNMENT (TREE_TYPE (var),
|
|
|
|
TYPE_MODE (TREE_TYPE (var)),
|
|
|
|
TYPE_ALIGN (TREE_TYPE (var)));
|
|
|
|
+ else if (DECL_HAS_VALUE_EXPR_P (var)
|
|
|
|
+ || (DECL_RTL_SET_P (var) && MEM_P (DECL_RTL (var))))
|
|
|
|
+ /* Don't consider debug only variables with DECL_HAS_VALUE_EXPR_P set
|
|
|
|
+ or variables which were assigned a stack slot already by
|
|
|
|
+ expand_one_stack_var_at - in the latter case DECL_ALIGN has been
|
|
|
|
+ changed from the offset chosen to it. */
|
|
|
|
+ align = crtl->stack_alignment_estimated;
|
|
|
|
else
|
|
|
|
align = MINIMUM_ALIGNMENT (var, DECL_MODE (var), DECL_ALIGN (var));
|
|
|
|
|