From f3184b4ce1ce9b81120c666b8a548f49e1d628e1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Jul 2010 19:54:32 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/cfgexpand.c | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd97a4a03a0..043c4015134 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2010-07-27 Jakub Jelinek + 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. + PR testsuite/44701 * doc/md.texi: Clarify m and es constraints on PowerPC and m and S constraints on IA-64. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index fef31905bd5..bf1149f9560 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));