aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-07-27 19:54:32 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-07-27 19:54:32 +0200
commitf3184b4ce1ce9b81120c666b8a548f49e1d628e1 (patch)
treedb5d67609e125cebb376269e9b2484c84a524362 /gcc/cfgexpand.c
parentfea31288e6ee4c60874e61de5e7477af26bc05da (diff)
downloadgcc-f3184b4ce1ce9b81120c666b8a548f49e1d628e1.zip
gcc-f3184b4ce1ce9b81120c666b8a548f49e1d628e1.tar.gz
gcc-f3184b4ce1ce9b81120c666b8a548f49e1d628e1.tar.bz2
re PR target/44542 (expand_one_stack_var_at may set DECL_ALIGN to a too high value)
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. From-SVN: r162582
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r--gcc/cfgexpand.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index fef3190..bf1149f 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -713,7 +713,7 @@ static void
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? */
@@ -730,10 +730,10 @@ expand_one_stack_var_at (tree decl, HOST_WIDE_INT offset)
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;
DECL_ALIGN (decl) = align;
DECL_USER_ALIGN (decl) = 0;
@@ -938,6 +938,13 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
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));