tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for builtin calls even if likely...
authorJakub Jelinek <jakub@redhat.com>
Wed, 22 Jun 2011 10:46:36 +0000 (12:46 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 22 Jun 2011 10:46:36 +0000 (12:46 +0200)
* tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for
builtin calls even if likelyvalue is not CONSTANT.
Handle BUILT_IN_STRDUP and BUILT_IN_STRNDUP like BUILT_IN_MALLOC.
Return get_value_for_expr of first operand
for BUILT_IN_{MEM{CPY,MOVE,SET},STR{,N}CPY}{,_CHK}.
* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK like
their non-checking counterparts.
(call_may_clobber_ref_p_1): Likewise.
(stmt_kills_ref_p_1): Handle BUILT_IN_MEM{{,P}CPY,MOVE,SET}_CHK
like their non-checking counterparts.
* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
Handle BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK
like their non-checking counterparts.
(find_func_clobbers): Likewise.
* tree-ssa-dce.c (propagate_necessity): Handle BUILT_IN_MEMSET_CHK
like BUILT_IN_MEMSET and BUILT_IN_CALLOC like BUILT_IN_MALLOC.

From-SVN: r175290

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

index d5cd5ce0d1c9b17fff08258aa686bac850e089d2..a8e03fdd24f2dba606c96b47a5eed58e02cd0f7e 100644 (file)
@@ -1,5 +1,23 @@
 2011-06-22  Jakub Jelinek  <jakub@redhat.com>
 
+       * tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for
+       builtin calls even if likelyvalue is not CONSTANT.
+       Handle BUILT_IN_STRDUP and BUILT_IN_STRNDUP like BUILT_IN_MALLOC.
+       Return get_value_for_expr of first operand
+       for BUILT_IN_{MEM{CPY,MOVE,SET},STR{,N}CPY}{,_CHK}.
+       * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
+       BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK like
+       their non-checking counterparts.
+       (call_may_clobber_ref_p_1): Likewise.
+       (stmt_kills_ref_p_1): Handle BUILT_IN_MEM{{,P}CPY,MOVE,SET}_CHK
+       like their non-checking counterparts.
+       * tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
+       Handle BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK
+       like their non-checking counterparts.
+       (find_func_clobbers): Likewise.
+       * tree-ssa-dce.c (propagate_necessity): Handle BUILT_IN_MEMSET_CHK
+       like BUILT_IN_MEMSET and BUILT_IN_CALLOC like BUILT_IN_MALLOC.
+
        * dwarf2out.c (size_of_loc_descr, output_loc_operands,
        mark_base_types, hash_loc_operands, compare_loc_operands): Allow
        DW_OP_GNU_convert and DW_OP_GNU_reinterpret to use constant instead
index 02b3ca07e07b548e4c2e686b1fe4b71efb15d8ff..5647899f531ce147a0c0dc82bbb2b1f54d3c5690 100644 (file)
@@ -1,5 +1,5 @@
 /* Alias analysis for trees.
-   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Contributed by Diego Novillo <dnovillo@redhat.com>
 
@@ -1199,6 +1199,24 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
                                           size);
            return refs_may_alias_p_1 (&dref, ref, false);
          }
+       case BUILT_IN_STRCPY_CHK:
+       case BUILT_IN_STRNCPY_CHK:
+       case BUILT_IN_MEMCPY_CHK:
+       case BUILT_IN_MEMMOVE_CHK:
+       case BUILT_IN_MEMPCPY_CHK:
+       case BUILT_IN_STPCPY_CHK:
+       case BUILT_IN_STRCAT_CHK:
+       case BUILT_IN_STRNCAT_CHK:
+         {
+           ao_ref dref;
+           tree size = NULL_TREE;
+           if (gimple_call_num_args (call) == 4)
+             size = gimple_call_arg (call, 2);
+           ao_ref_init_from_ptr_and_size (&dref,
+                                          gimple_call_arg (call, 1),
+                                          size);
+           return refs_may_alias_p_1 (&dref, ref, false);
+         }
        case BUILT_IN_BCOPY:
          {
            ao_ref dref;
@@ -1216,6 +1234,7 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
        case BUILT_IN_STACK_SAVE:
        case BUILT_IN_STACK_RESTORE:
        case BUILT_IN_MEMSET:
+       case BUILT_IN_MEMSET_CHK:
        case BUILT_IN_FREXP:
        case BUILT_IN_FREXPF:
        case BUILT_IN_FREXPL:
@@ -1453,6 +1472,25 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
                                           size);
            return refs_may_alias_p_1 (&dref, ref, false);
          }
+       case BUILT_IN_STRCPY_CHK:
+       case BUILT_IN_STRNCPY_CHK:
+       case BUILT_IN_MEMCPY_CHK:
+       case BUILT_IN_MEMMOVE_CHK:
+       case BUILT_IN_MEMPCPY_CHK:
+       case BUILT_IN_STPCPY_CHK:
+       case BUILT_IN_STRCAT_CHK:
+       case BUILT_IN_STRNCAT_CHK:
+       case BUILT_IN_MEMSET_CHK:
+         {
+           ao_ref dref;
+           tree size = NULL_TREE;
+           if (gimple_call_num_args (call) == 4)
+             size = gimple_call_arg (call, 2);
+           ao_ref_init_from_ptr_and_size (&dref,
+                                          gimple_call_arg (call, 0),
+                                          size);
+           return refs_may_alias_p_1 (&dref, ref, false);
+         }
        case BUILT_IN_BCOPY:
          {
            ao_ref dref;
@@ -1697,6 +1735,10 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref *ref)
          case BUILT_IN_MEMPCPY:
          case BUILT_IN_MEMMOVE:
          case BUILT_IN_MEMSET:
+         case BUILT_IN_MEMCPY_CHK:
+         case BUILT_IN_MEMPCPY_CHK:
+         case BUILT_IN_MEMMOVE_CHK:
+         case BUILT_IN_MEMSET_CHK:
            {
              tree dest = gimple_call_arg (stmt, 0);
              tree len = gimple_call_arg (stmt, 2);
index 11bfb767f4c5d31ff52541589538858dd588d4c7..fd95abbc8e74ff0810b60430f8fc5ea37b4b8a12 100644 (file)
@@ -1556,7 +1556,7 @@ evaluate_stmt (gimple stmt)
 
   /* Resort to simplification for bitwise tracking.  */
   if (flag_tree_bit_ccp
-      && likelyvalue == CONSTANT
+      && (likelyvalue == CONSTANT || is_gimple_call (stmt))
       && !is_constant)
     {
       enum gimple_code code = gimple_code (stmt);
@@ -1616,6 +1616,8 @@ evaluate_stmt (gimple stmt)
            case BUILT_IN_MALLOC:
            case BUILT_IN_REALLOC:
            case BUILT_IN_CALLOC:
+           case BUILT_IN_STRDUP:
+           case BUILT_IN_STRNDUP:
              val.lattice_val = CONSTANT;
              val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
              val.mask = shwi_to_double_int
@@ -1631,6 +1633,20 @@ evaluate_stmt (gimple stmt)
                              / BITS_PER_UNIT - 1));
              break;
 
+           /* These builtins return their first argument, unmodified.  */
+           case BUILT_IN_MEMCPY:
+           case BUILT_IN_MEMMOVE:
+           case BUILT_IN_MEMSET:
+           case BUILT_IN_STRCPY:
+           case BUILT_IN_STRNCPY:
+           case BUILT_IN_MEMCPY_CHK:
+           case BUILT_IN_MEMMOVE_CHK:
+           case BUILT_IN_MEMSET_CHK:
+           case BUILT_IN_STRCPY_CHK:
+           case BUILT_IN_STRNCPY_CHK:
+             val = get_value_for_expr (gimple_call_arg (stmt, 0), true);
+             break;
+
            default:;
            }
        }
index 6900ee77e869570aba49b40299a8a82fcf614e31..a088ef2a56ffb268d546fc799aadd6a909b700d5 100644 (file)
@@ -831,7 +831,9 @@ propagate_necessity (struct edge_list *el)
              if (callee != NULL_TREE
                  && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
                  && (DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET
+                     || DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET_CHK
                      || DECL_FUNCTION_CODE (callee) == BUILT_IN_MALLOC
+                     || DECL_FUNCTION_CODE (callee) == BUILT_IN_CALLOC
                      || DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE
                      || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA
                      || DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE
index 6f076dcd3e7a5c13b87e4edc665429331c5eab58..faf4f6a56d44ce5dbbaf637a5f063265ab09f3ca 100644 (file)
@@ -1,5 +1,5 @@
 /* Tree based points-to analysis
-   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
+   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Contributed by Daniel Berlin <dberlin@dberlin.org>
 
@@ -3982,6 +3982,14 @@ find_func_aliases_for_builtin_call (gimple t)
       case BUILT_IN_STPNCPY:
       case BUILT_IN_STRCAT:
       case BUILT_IN_STRNCAT:
+      case BUILT_IN_STRCPY_CHK:
+      case BUILT_IN_STRNCPY_CHK:
+      case BUILT_IN_MEMCPY_CHK:
+      case BUILT_IN_MEMMOVE_CHK:
+      case BUILT_IN_MEMPCPY_CHK:
+      case BUILT_IN_STPCPY_CHK:
+      case BUILT_IN_STRCAT_CHK:
+      case BUILT_IN_STRNCAT_CHK:
        {
          tree res = gimple_call_lhs (t);
          tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
@@ -4011,6 +4019,7 @@ find_func_aliases_for_builtin_call (gimple t)
          return true;
        }
       case BUILT_IN_MEMSET:
+      case BUILT_IN_MEMSET_CHK:
        {
          tree res = gimple_call_lhs (t);
          tree dest = gimple_call_arg (t, 0);
@@ -4627,6 +4636,14 @@ find_func_clobbers (gimple origt)
          case BUILT_IN_STPNCPY:
          case BUILT_IN_STRCAT:
          case BUILT_IN_STRNCAT:
+         case BUILT_IN_STRCPY_CHK:
+         case BUILT_IN_STRNCPY_CHK:
+         case BUILT_IN_MEMCPY_CHK:
+         case BUILT_IN_MEMMOVE_CHK:
+         case BUILT_IN_MEMPCPY_CHK:
+         case BUILT_IN_STPCPY_CHK:
+         case BUILT_IN_STRCAT_CHK:
+         case BUILT_IN_STRNCAT_CHK:
            {
              tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl)
                                               == BUILT_IN_BCOPY ? 1 : 0));
@@ -4649,6 +4666,7 @@ find_func_clobbers (gimple origt)
          /* The following function clobbers memory pointed to by
             its argument.  */
          case BUILT_IN_MEMSET:
+         case BUILT_IN_MEMSET_CHK:
            {
              tree dest = gimple_call_arg (t, 0);
              unsigned i;