diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgexpand.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.c | 4 |
3 files changed, 10 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 48bdefac5c6..8da81f7cbe3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-09-03 Eric Botcazou <ebotcazou@adacore.com> + + * cfgexpand.c (add_stack_var): Assert that the alignment is not zero. + * tree-ssa-ccp.c (fold_builtin_alloca_for_var): Revert latest change. + Force at least BITS_PER_UNIT alignment on the new variable. + 2011-09-02 Gary Funck <gary@intrepid.com> * opts.c (print_specific_help): Fix off-by-one compare in diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 03a4409eeda..1495633840b 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -271,6 +271,8 @@ add_stack_var (tree decl) if (v->size == 0) v->size = 1; v->alignb = align_local_variable (SSAVAR (decl)); + /* An alignment of zero can mightily confuse us later. */ + gcc_assert (v->alignb != 0); /* All variables are initially in their own partition. */ v->representative = stack_vars_num; diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index fc8d74780ea..fc59d386cad 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -1708,8 +1708,6 @@ fold_builtin_alloca_for_var (gimple stmt) return NULL_TREE; size = TREE_INT_CST_LOW (arg); - if (size == 0) - return NULL_TREE; /* Heuristic: don't fold large vlas. */ threshold = (unsigned HOST_WIDE_INT)PARAM_VALUE (PARAM_LARGE_STACK_FRAME); @@ -1726,6 +1724,8 @@ fold_builtin_alloca_for_var (gimple stmt) elem_type = build_nonstandard_integer_type (BITS_PER_UNIT, 1); n_elem = size * 8 / BITS_PER_UNIT; align = MIN (size * 8, BIGGEST_ALIGNMENT); + if (align < BITS_PER_UNIT) + align = BITS_PER_UNIT; array_type = build_array_type_nelts (elem_type, n_elem); var = create_tmp_var (array_type, NULL); DECL_ALIGN (var) = align; |