From 533f611ac4e730dab4b7c0439093f48f2b89f805 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 12 Oct 2010 08:53:15 -0700 Subject: [PATCH] re PR middle-end/45962 (many c/c++ failures on cris-elf, in r165236:165242) PR middle-end/45962 * cfgexpand.c (add_stack_var): Ensure every variable has 1 byte. (expand_stack_vars): Assert large base allocated when used. From-SVN: r165382 --- gcc/ChangeLog | 6 ++++++ gcc/cfgexpand.c | 23 ++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ce3832a99e..7f4a478e780 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-10-12 Richard Henderson + + PR middle-end/45962 + * cfgexpand.c (add_stack_var): Ensure every variable has 1 byte. + (expand_stack_vars): Assert large base allocated when used. + 2010-10-12 Richard Guenther * tree-ssa-structalias.c (get_constraint_for_1): Constants diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index de686b5004d..1ef1fa0d8f2 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -253,6 +253,8 @@ alloc_stack_frame_space (HOST_WIDE_INT size, unsigned HOST_WIDE_INT align) static void add_stack_var (tree decl) { + struct stack_var *v; + if (stack_vars_num >= stack_vars_alloc) { if (stack_vars_alloc) @@ -262,17 +264,23 @@ add_stack_var (tree decl) stack_vars = XRESIZEVEC (struct stack_var, stack_vars, stack_vars_alloc); } - stack_vars[stack_vars_num].decl = decl; - stack_vars[stack_vars_num].offset = 0; - stack_vars[stack_vars_num].size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (decl)), 1); - stack_vars[stack_vars_num].alignb = get_decl_align_unit (SSAVAR (decl)); + v = &stack_vars[stack_vars_num]; + + v->decl = decl; + v->offset = 0; + v->size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (decl)), 1); + /* Ensure that all variables have size, so that &a != &b for any two + variables that are simultaneously live. */ + if (v->size == 0) + v->size = 1; + v->alignb = get_decl_align_unit (SSAVAR (decl)); /* All variables are initially in their own partition. */ - stack_vars[stack_vars_num].representative = stack_vars_num; - stack_vars[stack_vars_num].next = EOC; + v->representative = stack_vars_num; + v->next = EOC; /* All variables initially conflict with no other. */ - stack_vars[stack_vars_num].conflicts = NULL; + v->conflicts = NULL; /* Ensure that this decl doesn't get put onto the list twice. */ set_rtl (decl, pc_rtx); @@ -839,6 +847,7 @@ expand_stack_vars (bool (*pred) (tree)) /* Large alignment is only processed in the last pass. */ if (pred) continue; + gcc_assert (large_base != NULL); large_alloc += alignb - 1; large_alloc &= -(HOST_WIDE_INT)alignb;