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

Reply via email to