From: Richard Guenther Date: Thu, 14 Apr 2011 12:19:28 +0000 (+0000) Subject: re PR middle-end/48590 (Alias analysis confused by builtin-stack-save/restore) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ab4472fa10153d18b16704086d28599adae30e28;p=gcc.git re PR middle-end/48590 (Alias analysis confused by builtin-stack-save/restore) 2011-04-14 Richard Guenther 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. From-SVN: r172427 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6ce7314151..40fdfea4c07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-04-14 Richard Guenther + + 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. + 2011-04-14 Nicola Pero * c-parser.c (c_parser_objc_class_declaration): Updated call to diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 4edacb56ba6..1e80f49c5a0 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1196,6 +1196,9 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref) 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, ao_ref *ref) && 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. */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index c46836da108..6dc8a57f5c8 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -824,7 +824,10 @@ propagate_necessity (struct edge_list *el) && 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