We are currently not special casing alloca related builtins in the alias oracle while we can very easily do better, similar to how we handle malloc and free. The exception is BUILT_IN_STACK_RESTORE which is not tied to a particular allocation.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2011-04-14 Richard Guenther <rguent...@suse.de> PR tree-optimization/48590 * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle BUILT_IN_ALLOCA, BUILT_IN_STACK_SAVE and BUILT_IN_STACK_RESTORE. (call_may_clobber_ref_p_1): Handle BUILT_IN_ALLOCA and BUILT_IN_STACK_SAVE. * tree-ssa-dce.c (propagate_necessity): Handle BUILT_IN_ALLOCA, BUILT_IN_STACK_SAVE and BUILT_IN_STACK_RESTORE. Index: gcc/tree-ssa-alias.c =================================================================== --- gcc/tree-ssa-alias.c (revision 172424) +++ gcc/tree-ssa-alias.c (working copy) @@ -1196,6 +1196,9 @@ ref_maybe_used_by_call_p_1 (gimple call, case BUILT_IN_FREE: case BUILT_IN_MALLOC: case BUILT_IN_CALLOC: + case BUILT_IN_ALLOCA: + case BUILT_IN_STACK_SAVE: + case BUILT_IN_STACK_RESTORE: case BUILT_IN_MEMSET: case BUILT_IN_FREXP: case BUILT_IN_FREXPF: @@ -1432,6 +1435,9 @@ call_may_clobber_ref_p_1 (gimple call, a && targetm.ref_may_alias_errno (ref)) return true; return false; + case BUILT_IN_STACK_SAVE: + case BUILT_IN_ALLOCA: + return false; /* Freeing memory kills the pointed-to memory. More importantly the call has to serve as a barrier for moving loads and stores across it. */ Index: gcc/tree-ssa-dce.c =================================================================== --- gcc/tree-ssa-dce.c (revision 172424) +++ gcc/tree-ssa-dce.c (working copy) @@ -824,7 +824,10 @@ propagate_necessity (struct edge_list *e && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL && (DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET || DECL_FUNCTION_CODE (callee) == BUILT_IN_MALLOC - || DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE)) + || DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE + || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA + || DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE + || DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)) continue; /* Calls implicitly load from memory, their arguments