[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