[PATCH] Fix PR48590
Richard Guenther
rguenther@suse.de
Thu Apr 14 12:17:00 GMT 2011
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 <rguenther@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
More information about the Gcc-patches
mailing list