re PR middle-end/48590 (Alias analysis confused by builtin-stack-save/restore)
authorRichard Guenther <rguenther@suse.de>
Thu, 14 Apr 2011 12:19:28 +0000 (12:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 14 Apr 2011 12:19:28 +0000 (12:19 +0000)
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.

From-SVN: r172427

gcc/ChangeLog
gcc/tree-ssa-alias.c
gcc/tree-ssa-dce.c

index d6ce73141513848c1ce36d2ca4bb8916feb593b9..40fdfea4c077fe9de25c476fbbf826ee05bf7221 100644 (file)
@@ -1,3 +1,13 @@
+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.
+
 2011-04-14  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * c-parser.c (c_parser_objc_class_declaration): Updated call to
index 4edacb56ba628c6ecf61c0f947f0af7faf1d2dde..1e80f49c5a042094c0ef3cfc1bf06c4819d38d74 100644 (file)
@@ -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.  */
index c46836da1086ffbe7b6f32940cfbdb4764ee1a58..6dc8a57f5c8078b4ccc074ca194e0168d49a2055 100644 (file)
@@ -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