diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-07-27 19:54:32 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-07-27 19:54:32 +0200 |
commit | f3184b4ce1ce9b81120c666b8a548f49e1d628e1 (patch) | |
tree | db5d67609e125cebb376269e9b2484c84a524362 /gcc/cfgexpand.c | |
parent | fea31288e6ee4c60874e61de5e7477af26bc05da (diff) | |
download | gcc-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.c | 17 |
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)); |