This fixes the Ada bootstrap failure introduced by alloca folding. We now fold alloca (0) to &auto-with-size-zero which confuses us. I didn't exactly investigate but what I think happens is that we expand that &auto-with-size-zero to NULL instead of virtual_stack_dynamic_rtx (see zero-size special-case in allocate_dynamic_stack_space) and Ada ends up dereferencing the pointer returned from alloca (0) (something to investigate for the Ada folks I guess), something which "works" if we just return a random stack address.
The following patch restores previous behavior by simply not folding alloca (0). Bootstrapped on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2011-09-02 Richard Guenther <rguent...@suse.de> * tree-ssa-ccp.c (fold_builtin_alloca_for_var): Do not fold alloca (0). (ccp_fold_stmt): Continue replacing args when folding alloca fails. Index: gcc/tree-ssa-ccp.c =================================================================== --- gcc/tree-ssa-ccp.c (revision 178460) +++ gcc/tree-ssa-ccp.c (working copy) @@ -1702,10 +1687,14 @@ fold_builtin_alloca_for_var (gimple stmt /* Detect constant argument. */ arg = get_constant_value (gimple_call_arg (stmt, 0)); - if (arg == NULL_TREE || TREE_CODE (arg) != INTEGER_CST + if (arg == NULL_TREE + || TREE_CODE (arg) != INTEGER_CST || !host_integerp (arg, 1)) 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); @@ -1804,12 +1793,12 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi if (gimple_call_alloca_for_var_p (stmt)) { tree new_rhs = fold_builtin_alloca_for_var (stmt); - bool res; - if (new_rhs == NULL_TREE) - return false; - res = update_call_from_tree (gsi, new_rhs); - gcc_assert (res); - return true; + if (new_rhs) + { + bool res = update_call_from_tree (gsi, new_rhs); + gcc_assert (res); + return true; + } } /* Propagate into the call arguments. Compared to replace_uses_in